2011-11-19 40 views

回答

9

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

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

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

2
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 ; 
1

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

另请注意,有些编译器喜欢在最后一节之后附加调试信息。一定要去掉任何符号表或设置释放模式,具体取决于你使用的编译器,这样才能工作。

+0

我发现有些东西在证书表等部分的外部存在,例如看看KERNEL32.DLL,重定位部分结束后跟证书表,所以以及我也会检查数据目录表。 – Lloyd