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