Windows下有PE(Portable Executable):可執行文件
COFF(Common Object File Format):通用模板文件格式文件
其中,PE文件結構十分重要。典型結構如下:
Figure 1 illustrates the Microsoft PEexecutable format.
具體在看雪論壇有中文翻譯版Microsoft PECOFF規範v8和v8.1中文版
一:MS—DOS佔位程序
只要關注0x3C處,這裏存放PE文件簽名的偏移地址(相對於該文件的初始地址)
二:PE文件頭
這裏存放着該文件的重要信息
1.簽名
存放四個字節的數據 PE\0\0 (一般從0x3c處就可以索引到)在F0處
2.PE文件頭
3,PE可選頭
主要注意的是可選文件頭中的DataDirectory,其中包含了各個表的信息。幾個比較重要的如下
這裏可以找到idata的RVA(就是虛擬偏移地址),是從PE文件頭結束位置開始算起偏移了104 即(F4H) 244 + 20 +204 = 170(H)
可見,導入表地址爲0001A1D8
三:節表
這裏存放節的十分詳細的信息,需要十分關注
這裏就是一個節表idata
查文檔就可以知道 VirtualSize = 0001A00 H 明顯導入表落在idata內 PointerToRawData: 7400
這樣就可以算導入表的文件中地址了 0001A1D8 - 0001A000 + 7400 = 75D8H
idata節如下
四:各個節
idata節:這裏存放導入到文件裏的函數的信息 每5x4個作爲一個導入目錄表,最後以5x4個空字節結束
在上面的一個圖中 可以知道Import Address Table RVA (Thunk Table) = 0001A098 經計算可以知道 實際的地址在 7498H處。
它的高位是0 所以直接表示RVA
最後得到 一個函數的地址 1A414-1A000+7400=7814H
(一個MessageBox)
導出表和資源目錄表其實都類似,結構不同罷了。接下來準備用C++寫一個PE分析,知道有python的pefile庫十分方便,但是感覺自己對PE還是理解不夠,所以自己寫一個來深入瞭解PE。
具體參考 PE文件結構詳解(一)基本概念