最近抽空對pe檔案格式做了一些研究。眾所周知,pe檔案格式是windows平台下可執行檔案的格式。為什麼要研究pe檔案格式?可能有人認為,做這件事就是一件重複造輪子的事,因為之前已經有無數人做過這樣的事。但是有些事不是簡單地以是不是重複造輪子來衡量的。研究pe檔案格式對加深程式本質的認識和理解程式的構成都有很大的好處。美籍匈牙利科學家馮•諾依曼最新提出程式儲存的思想,具體到研究pe檔案格式,或許可以是執行程式所需的指令和資料是以怎樣的組織結構存貯在檔案的,在執行時程式是怎樣被載入的,資料是怎樣初始化的。
乙個完整的pe檔案結構一般由五大部分組成。如下圖:
最開頭的是部分是dos部首,dos部首由兩部分組成:dos的mz檔案標誌和dos stub(dos存根程式)。之所以設定dos部首是微軟為了相容原有的dos系統下的程式而設立的。
緊接著的是真正的pe檔案頭。值得注意的是pe檔案頭中的image_optional_header32是乙個非常重要的結構,pe檔案中的匯入表、匯出表、資源、重定位表等資料的位置和長度都儲存在這個結構裡。
pe檔案結構中可研究的內容很多,暫時講解這麼多,有興趣的朋友可以閱讀《windows圖形程式設計》中的第一章和《程式設計師的自我修養》的5.6節。
研究pe檔案格式,最好的方法我覺得還是自己動手寫乙個pe檔案解釋類。看了《windows圖形程式設計》中的第一章,加深自己對pe檔案結構的理解,我決定在袁峰大俠(《windows圖形程式設計》一書作者)編寫pe檔案解釋類kpefile的基礎上增加一些介面。kpefile類的建構函式是通過提供模組控制代碼來獲取pe檔案資訊的,我發現這對執行中的程式是有用的,但對解析乙個靜態的exe檔案並不有效。
程式設計實現分析乙個pe檔案,網上一般有兩種做法:一是開啟exe檔案,然後利用dbghelp庫的乙個函式imagervatova來獲取你要開啟結構的指標;另一種做法也大同小異,也是開啟exe檔案,自己計算所有獲取資訊的結構的偏移位址。我採用的是第二種做法。
下面是重要部分**:
值得注意的是pe檔案內部字元使用的多位元組字符集,而vs 2005預設建的工程是使用unicode字符集,因為這個在解釋pe檔案時遇到一些挫折。
在編寫獲取pe檔案中的所有匯入表的時候,如果你觀察一些執行結果再聯絡書本上的知識,你會加深對原有知識的認識。比如下面是乙個執行結果:
你比較一下匯入的兩個dll:kernel32.dll和msvcp80d.dll,你可以看到匯入的kernel32.dll函式都是很正常的字元,但是你看到msvcp80d.dll匯入的函式中夾雜了?和@字元,聯絡所學的c++的知識,你很快明白kernel32.dll是乙個c庫,編譯器沒有對其進行名稱修飾,而msvcp80d.dll是乙個c++庫,由於命名空間和虛函式的影響,編譯器對其進行了名稱修飾。
2. 《程式設計師的自我修養--鏈結、裝載與庫》,俞甲子、石凡、潘愛民等
PE檔案格式
pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable executable 可移植的執行體 意味著此檔案格式是跨win3...
PE檔案格式
pe檔案格式分析及修改 圖 1 2009 01 09 14 08 pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable ...
PE檔案格式
pe檔案格式應用於所有32位windows系統 windows 9x,windows nt,windows 2000及windows xp vista已經對pe格式進行了公升級,也出現了pe64 而在msdn 98中有pe的大量詳細資料 按目錄 msdn library visual studio ...