2013-03-09 53 views
3

在這些日子裏,我正在閱讀一些PE可執行文件規範。然後我做了小C程序做push ebp, pop ebp,我編譯它。編譯成功後,我打開可執行文件中的PE文件,並查看位置PE_magic + PE_header_size + PE_OPTHDR_entrypoint,其中PE魔術在文件中首次出現「PE」字符串,PE_header_size爲24,PE_OPTHDR爲16,根據PE & COFF規範。在那個位置我找到地址0x1000,但我的文件長度只有0x600。那麼我在正確的位置,或入口點(這是在0x200)的地址設置不正確?是正確的地方的入口點?

我包括我的文件的圖像和我的代碼。

0x55 means PUSH EBP and 0x5D means POP EBP

代碼(在項目屬性我已經選中除了標準庫):

int main() { 
    int a = 0; 
    __asm { 
     push ebp 
     pop ebp 
    } 
} 
+0

讓我看看你的代碼來讀取PE,至少可以得到頭文件信息 – 2013-03-09 13:40:11

回答

2

你在文件中看到的不匹配它會是什麼樣子在內存中。如您所見,文件對齊方式爲$ 200,而內存部分對齊方式爲$ 1000。這通常意味着文件的填充比它表示的圖片少。

更重要的是,您可以看到.text的節表條目的相對虛擬地址爲$ 1000(相對於Image Base),而原始地址爲$ 200(相對於文件的開頭)。幾乎所有說某個東西在哪裏的領域都是RVA,這意味着他們在內存中存儲它們從Image Base引用的東西的偏移量。

因此不,地址設置不正確 - .text開始於$ 1000(相對於圖像庫),這就是入口點指向的地方。

+0

因此,optionaly,我該如何計算文件中某個東西的真實位置? – user35443 2013-03-09 13:14:44

+1

@ user35443我試圖把它全部放在註釋中,但有點長,請看這裏:http://www.tech-juice.org/2011/02/21/portable-executable-converting-rva-to-file偏移處和回/ – harold 2013-03-09 13:25:44

相關問題