我如何确定确切的PE图像文件大小使用其头(S)?

我需要字节大小,IMAGE_OPTIONAL_HEADER.SizeOfImage似乎四舍五入到(不确定)的边界,并大于实际的文件大小。

IMAGE_OPTIONAL_HEADER.SizeOfImage是虚拟内存中加载的可执行文件/ dll的大小。 它与磁盘上的大小不一样。

你可以用最后一节的VirtualAddress + VirtualSize来计算它。

IMAGE_OPTIONAL_HEADER.SizeOfImage是四舍五入到IMAGE_OPTIONAL_HEADER.SectionAlignment (通常与页面大小相同)的值的值。

 if(LastSectionVirtualSize >= LastSectionSizeOfRawData) { if( LastSectionVirtualSize % LastSectionSectionAlignment ) { TempValue = LastSectionVirtualSize - (LastSectionVirtualSize % LastSectionSectionAlignment) + LastSectionSectionAlignment ; } else { TempValue = LastSectionVirtualSize ; } } else { if(LastSectionSizeOfRawData % LastSectionSectionAlignment) { TempValue = LastSectionSizeOfRawData - (LastSectionSizeOfRawData % LastSectionSectionAlignment) + LastSectionSectionAlignment ; } else { TempValue = LastSectionSizeOfRawData ; } } OH.SizeOfImage = TempValue + dwLastSecRVA ; 

其实,接受的答案是不正确的。 为了获得可执行文件的大小,你应该计算最后一部分的PointerToRawData + SizeOfRawData ,而不是虚拟对象。 有关示例,请参阅http://www.strchr.com/creating_self-extracting_executables

还要注意,有些编译器喜欢在最后一节之后附加调试信息。 一定要删除任何符号表或设置释放模式,这取决于你使用什么编译器,这个工作。