易文,車生兵
(中南林業科技大學,湖南長沙 410004)
PE文件分析器的設計與實現
易文,車生兵
(中南林業科技大學,湖南長沙 410004)
在windows操作系統下的可執行文件,一般采用PE文件結構,基于這樣統一格式設計的可執行文件,可以通過一定的方式來進行解析。通過PE文件分析,可以讓讀者對任何的可執行文件都有一個全面的認識,了解任何一個可執行文件的結構,分析其代碼段、數據段、導入表、鏈接庫等等內容,以達到拆分程序、了解程序功能、捆綁木馬、分析文件是否含有木馬、破解程序等目的。PE分析器就是基于這樣的目的設計的一款詳細的解析PE文件的工具。
PE結構;PE分析;PE分析器
PE是Portable Executable的縮寫,它是由微軟公司設計的可執行的文件(DLLs和執行程序)格式,目標文件和庫文件通常也是這種格式。[1]它的一些特性繼承自Unix的Coff(common object fileformat)文件格式。"portable executable"(可移植的執行體)意味著此文件格式是跨win32平臺的:即使Windows運行在非Intel的CPU上,任何win32平臺的PE裝載器都能識別和使用該文件格式。[2]
文章以PE文件結構為基礎,詳細分析了PE文件的各個層次內容,以及層次之間的關系,并且以可視化的方式呈現出來,同時,采用一定的加解密算法,以及捆綁協議,對文件進行了加解密以及捆解綁。
PE文件結構的總體層次分布如表1所示,主要結構基本為四個部分:Dos殘余、PE頭、文件內容(節)、目錄表。

表1 PE文件結構
所有的PE文件均以DOSMZ header開始。但是通常,該結構體在解析過程中沒有特別大的作用。實際上該部分是一個有效的EXE,在不支持PE文件格式的操作系統中,它將簡單的顯示一個錯誤提示,類似于字符串“This program cannot be run in DOSmode”。一般情況下,該部分為編譯器在編譯時自動生成。[3]
DOS頭是一個固定的64字節的結構體,大部分的區域在解析過程中都沒有意義,但是依然有一個比較重要的值需要關注,那就是.e_lfanew的值,指出了PE header的起始地址,通常在文件開始$003C偏移地址指明,比如偏移地址的值為$1000,表示PE文件頭從文件地址$1000處開始。
DOS殘余部分結束之后就是PE header,該結構的位置通過前文提到的.e_lfanew域可以直接定位。PE header是IMAGE_NT_HEADERS的簡稱,其中包含了許多PE裝載器用到的重要域。[4]當我們更加深入研究PE文件格式后,將對這些重要域耳目能詳。執行體在支持PE文件結構的操作系統中執行時,PE裝載器將從DOSMZ header中找到PE header的起始偏移量。因而跳過了DOSstub直接定位到真正的文件頭PE header。
此結構有三個域,各個域說明如表2所示。

表2 PE頭結構
Signature標志共4個字節,它表明了此文件的身份,通過檢測此標志,可以準確的判斷是否是一個有效的PE格式文件。
在4字節標志之后就是FileHeader,包含了關于PE文件物理分布的一般信息,此結構定義如下:

除了標準的PE頭結點以外,PE文件還有可選的頭結點,雖說是可選的頭結點,但是通常來說都是必須的。它包含了PE文件的邏輯分布信息,其中很多域包含非常重要的信息,比如,提供二進制流的加載方式、起始地址、保留棧空間大小、數據段長度等。值得注意的是,PE可選頭大小是變化的,而且,驗證魔幻數字(Magic number)對格式兼容很重要。按照PE可選頭的相關格式進行相對應的解析。[5]
文件內容包含兩個部分,一個是節表,即定義用來描述對應節的信息的結構體,另外一部分則是文件主體部分—節。
節表是一個結構數組,每個結構包含一個節的信息。通過NumberOfSections值來了解該數組中到底有幾個成員。在實際操作中,如果有一個節表的內容全為0,則表示節已經結束。此結構共有10個域,各個域說明如表3所示。

表3 節表結構體
節表之后的部分就是文件的主體部分,它占了文件的絕大部分大小,也是程序中的重點,不同的節存儲了不同的數據。通過上述節表的內容,可以定位每個節的位置和大小,從而對每個節進行對應解析。[6]節有多種類型,常見的比如.text、.data、.rsrc等等,每個節都是一塊擁有共同屬性的數據。對于每個節內數據的詳細解析,本文并不關注,得到數據之后通過對應的工具即可完成。
數據目錄位于文件可選頭之后,包含有8字節PE文件16個數據目錄的入口地址(虛擬地址),以及8字節大小,根據該入口地址便可找到相應數據目錄結構的起始地址,進行相應的解析。
數據目錄中主要包含三種表結構,輸入表、輸出表以及資源表。


3)資源分配表
資源在程序當中使用樹結構來保存,通常有三層,從上至下依次為類型、名字、語言。PE文件是否包含資源文件通常是檢測是否含有“.rsrc”節表。大致地講,資源目錄有點像硬盤中文件的存放形式,一個根目錄和很多子目錄,可能在子目錄中找到具體的文件,而那個文件就像是資源的具體資源數據,比如一個對話框。在PE文件中,根目錄和子目錄都是一個獨立的資源目錄結構。
一般一個資源如圖1所示:

圖1 資源文件結構
例如圖1中ID[0]包含三個入口(ID[3]、ID[6]、ID[10]),每個入口又指向一個資源目錄結構,例如其中ID[3]又包含兩個入口,每個入口又指向一個資源目錄,直到找到資源數據入口。
程序總體結構如圖2所示。

圖2 程序總體結構
根據前面的分析可以得知,整體的程序設計流程圖如圖3所示。

圖3 程序總體流程圖
1)Dos頭讀取
從文件頭開始位置,讀取固定64個字節為dos頭。保存并且解析結構內容。
2)PE頭讀取
根據Dos頭的e_lfanew域的內容(新exe頭在文件中的地址),定位文件指針,讀取24字節的PE文件頭。從PE文件頭中解析出可選頭的大小,按照該字節數在后序的代碼中讀取PE可選頭,并且進行解析。
3)段表讀取
文件可選域中獲得段的的數量。按照段的數量讀取40字節乘該數量的字節數,分別為各個段表賦值。
4)讀取輸入表
從文件的可選域目錄表的數組中,找到1號元素,獲得輸入表的虛地址(內存偏移地址)屬性。將該內存偏移地址轉換為文件偏移地址,并將文件讀寫指針定位到此。從該起始地址開始,讀取第一個輸入表的結構體。完成讀取后查看輸入表的FirstThunk屬性,如果為零則跳出循環,輸入表查找完畢。
5)讀取輸出表
從文件可選域中的目錄表數組中,找到0號元素,獲得輸出表的虛地址(內存偏移地址)屬性。將內存偏移值轉換為文件偏移值,從該文件起始地址,抓取輸出表的結構體,完成賦值工作。輸出表數量加一,輸出表數量也只有1,其他與輸入表的讀取過程完全相同。
6)讀取資源表
根據PE文件資源表的布局情況,我們發現其整體結構是一個樹形結構的,這樣就給查找過程帶來了麻煩。所以,對數據結點的查找應該是一個遞歸的過程,對目錄項結點層層分析,直到找到標記值不為零的結點。
1)文件綁定與解綁
文件綁定即將兩個或多個文件變成一個文件,但是這一個文件同時具備兩個文件的功能。為了實現動態綁定效果,我們必須準備一個宿主文件,用來作為綁定文件的“頭部”,宿主文件的左右是當程序運行時將自身附帶的兩個PE文件自動解綁到系統臨時目錄,并運行。解綁的過程就是找到數組文件的臨時目錄,并且根據目錄將文件分成兩個文件。
2)文件加密
加密采用了DES算法為PE頭結構的數據進行加密。[7]
程序界面如圖4所示。

圖4 程序界面
通過詳細的分析設計實現過程,最終得到的PE分析器還是能夠分析到整個PE文件的每個字節,并且在進行分析之后,還擴充了該分析器的應用,包括了文件的捆綁,文件的加解密。都達到了預期目的。
[1]王洋.PE文件加密器的設計[D].長春:吉林大學,2008.
[2]羅云彬.Windows環境下32位匯編語言程序設計[M].北京:電子工業出版社,2009.
[3](美)埃爾溫.Intel匯編語言程序設計(第5版)[M].清華大學出版社,2009.
[4]李卓遠,鮮明.PE文件格式分析[J].電腦知識與技術,2009,5(9).
[5]嵇海明,楊宗源.PE文件格式剖析[J].計算機應用研究,2004,(03).
[6]程艷芬,翟海波,鐘輝.PE文件格式解析[J].交通與計算機,2003,21(5).
[7]徐曉靜.基于PE文件的信息隱藏技術研究[D].長沙:湖南大學,2007.
[編校:鄧桂萍]
PE File Parser's Design and Imp lementation
YIWen,CHE Shengbing
(Central South University of Forestry and Technology,Changsha Hunan 410004)
Executable files in the Windows operating system are basically based on the PE file structure.Executable files based on such a unified format design can be analysed through a certain way.Through such kind of analysis,one can get a comprehensive understanding of any executable files,understand the structure of any executable files,analyzes its code section,the data segment,import table,link library and etc.By doing this can users depart programs,understand the program function and bind Trojan,analyse whether a file includes Trojan or decode program and so on.The PE analyzer,based on such purposes above,is a tool that can be used to analyse PE file.
PE structure;PE analysis;PE parsers
TP311.52
A
1671-9654(2012)02-047-05
2012-04-24
易文(1991-),男,湖南邵陽人,研究方向為網絡與信息安全。
車生兵(1970-),男,湖南常德人,教授,湖南省青年骨干教師,研究方向為網絡與信息安全、數字圖像處理和人工智能。
本文為2011年湖南省大學生研究性學習和創新性實驗計劃項目“PE解析器的設計與實現”(編號:2011014)、湖南省科技廳科技計劃項目“基于減位編碼的圖像壓縮技術研究”(編號:2009GK3096)、2012年全國大學生研究性學習和創新性實驗計劃項目“磁盤與文集解析器的研制”(編號:2012006)階段性研究成果。