在學到 PE 中的內容後,來寫一個的 PE解析器 吧。
開源程式碼 : https://github.com/aaaddress1/Windows-APT-Warfare
聲明 : 本文使用書中程式碼作為研究對象, 並接受 GNU 3.0 授權條款。
程式連接
這個程式是逆向工程大師馬聖豪的作品,我在學習的時候使用了這份程式來學習 PE 結構,我認為效果十分顯著。所以打算分析這個程式並做功能上的講解。
使用參數的方式得到目標檔案的位置,然後讀入檔案。

可以用 fseek 來操縱指標位置來取得文件大小。

建立兩個指標指向 Header,這些物件定義包含在 <winnt.h> ( 使用 <windows.h> 就含在裡面了 )。
DOS Header 的位置就是檔案的位置。
NT Header 的位置偏移量包含在 DOS Header 的 0x3C 位置,位在結構中 .e_lfanew。
所以實際位置是 DOS Header 的位置加上偏移量。

可以利用魔術碼來確定 Header 是否正確。
各自的常數應為 IMAGE_DOS_SIGNATURE 跟 IMAGE_NT_SIGNATURE

Option Header
當有了 NT Header 後,就可以透過她來取得裡面的 File 跟 Option Header。
由於 File Header 跟 Option Header 操作差不多,這邊演示 Option Header。
然後就可以存取 Header 裡面的資料並輸出。

Section Header 所有區塊因為 Section Header 會緊連在 NT Header 之後,所以它的位置就是 NT Header + sizeof( NT Header )
然後就要來遍歷 Section 中的區塊資料。區塊數量是 NT Header 中的 NumberOfSections,就可以由 0 遍歷到最後區塊。

大功告成,那會了這些可以做甚麼呢?
這些知識是逆向工程的基礎,可以透過 PE 解析來得知這份檔案想做甚麼,判定是不是想壞壞。