PE 文件格式學習

以前總在網上看看介紹pe文件格式的文章,看的時候看到一大堆的結構體就蛋疼了,想想現在我這個居然都不清楚以後咋裝bi呢安靜

今天下了個PEview邊看變學了

先自己隨便寫個控制檯程序,然後加進去就有了,讓後我們可以看看這個文件到底是怎麼組成的。


從這個樹形結構我們能很清楚的理解這個文件的整體構成,在網上有很多pe文件格式的圖找一張對照看:

 第一個IMAGE_DOS_HEADER DOS頭 爲啥要有 就是爲了兼容DOS

第二個MOS-DOS Stub Program DOS實模式殘餘程序

第三個IMAGE_NT_HEADERS pe文件頭,這個裏面分幾個部分,第一個是標誌描述文件格式;


下一個是真pe的文件頭,記錄了一些這個文件是什麼機器編出來的這些東西。可以看一下。


第三個名字叫可選pe可選頭,蛋疼。。。。它其實都在的。。。

這個裏面的內容比較重要,記錄的相信值得研究,什麼程序入口都在這裏面。東西很多沒必要都看,自己點點看下,發現還是有幾個感興趣的字段。

DataDirectory 可以看下。


第四部分就是段頭,這些段頭用來描述段的一些屬性,段頭的格式大小是固定的。通過段頭就能找到對應段。


這裏面RVA指定裝載這個段的虛擬內存地址(要加個基址) Virtual Size 表示段的大小。

最下面就是各種段

.edata段包含了應用程序或DLL的導出數據。在這個段出現的時候,它會包含一個到達導出信息的導出目錄。

.text段Windows 3.1和Windows NT之間的一個區別就是Windows NT默認的做法是將所有的代碼段(正如它們在Windows 3.1中所提到的那樣)組成了一個單獨的段,名爲“.text”。既然Windows NT使用了基於頁面的虛擬內存管理系統,那麼將分開的代碼放入不同的段之中的做法就不太明智了。因此,擁有一個大的代碼段對於操作系統和應用程序開發者來說,都是十分方便的。

.text段也包含了早先提到過的入口點。IAT亦存在於.text段之中的模塊入口點之前。(IAT在.text段之中的存在非常有意義,因爲這個表事實上是一系列的跳轉指令,並且它們的跳轉目標位置是已固定的地址。)當Windows NT的可執行映像裝載入進程的地址空間時,IAT就和每一個導入函數的物理地址一同確定了。要在.text段之中查找IAT,裝載器只用將模塊的入口點定位,而IAT恰恰出現於入口點之前。既然每個入口擁有相同的尺寸,那麼向後退查找這個表的起始位置就很容易了。(copy來的)

.idata段是導入數據,包括導入庫和導入地址名稱表。雖然定義了IMAGE_DIRECTORY_ENTRY_IMPORT,但是WINNT.H之中並無相應的導入目錄結構。作爲代替,其中有若干其它的結構,名爲IMAGE_IMPORT_BY_NAME、IMAGE_THUNK_DATA與IMAGE_IMPORT_DESCRIPTOR。在我個人看來,我實在不知道這些結構是如何和.idata段發生關聯的,所以我花了若干個小時來破譯.idata段實體並且得到了一個更簡單的結構,我名之爲IMAGE_IMPORT_MODULE_DIRECTORY。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章