2011-11-19 57 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