大家知道PE文件中IMAGE_NT_HEADERS的IMAGE_OPTIONAL_HEADER32里有两个对其因子SectionAlignment和FileAlignment分别表示内存中块的对齐和文件中块的对齐。我同时翻阅了Visual Studio, Microsoft Portable Executable and Common Object File Format Specification Revision 8.0 - May 16, 2006英文原版以及各种中文版的PE文件格式解析(其中包括《加密与解密》),发现描述Section时特别指出块的PointerToRawData和SizeOfRawData必须遵循FileAlignment(即必须是对齐因子的整数倍),而VirtualAddress必须遵循SectionAlignment,同时两个对齐因子必须都是2的整数次幂,且FileAlignment必须小于等于SectionAlignment。
对于此点,各色文档参差不齐,例如英文文档中没有强调VirtualAddress的对齐,而《加密与解密》中没有强调PointerToRawData的对齐。众说风云,姑且先放一下,我用LordPE+Win2k(SP4)作了一系列的试验来验证对齐问题。