WindowsPE 第五章 导出表
導出表
? ? PE中的導出表存在于動態鏈接庫文件里。導出表的主要作用是將PE中存在的函數導出到外部,以便其他人可以使用這些函數,實現代碼重用。
5.1導出表的作用
? ? 代碼重用機制提供了重用代碼的動態鏈接庫,它會向調用者說明庫里的哪些函數是可以被別人使用的,這些用來說明的信息便組成了導出表。導出表存在的位置不是絕對的,通常EXE文件中很少有導出表(也可以有),而大部分DLL文件中都有導出表。所以一提到導出表,很多時候第一反應就是動態鏈接庫。
? ? 導出表的兩個租用:
? ? 一是可以通過導出表分析不認識的動態鏈接庫所能提供的功能。
? ? 二是向調用者提供輸出函數指令在模塊中的起始地址。
5.1.1?分析動態鏈接庫功能
? ? 略。就是說可以根據導出表函數猜測動態庫功能等。
5.1.2??獲得導出函數地址
? ? 對于一個動態鏈接庫里導出的函數的調用,既可以通過函數名稱來進行,也可以通過函數在導出表的索引來進行。Windows加載器將與進程相關的DLL加載到虛擬地址空間以后,會根據導入表中登記的與該動態鏈接庫相關的由INT指向的名稱或者編號來遍歷DLL所在虛擬地址空間,通過函數名稱或編號查找導出表結構,從而確定該到處函數在虛擬地址空間中的起始VA,并將該VA覆蓋導入表的IAT相關項。
? ? 在覆蓋IAT的過程中,導出表起到了參照和指引的作用。如果一個動態鏈接庫沒有定義導出表,其內部包含的所有函數都無法被其他程序透明的調用。這里所述的透明是指公開調用。如果是掌握動態鏈接庫的內部編碼,及時沒有導出表,也可以隨意引用里面的函數,哪怕這些函數是私有的。之后會說這個相關(5.5.2)。
5.2?含導出表的PE文件
? ? 為了方便說明,我還是自己創建一個DLL吧,用C++寫吧,書上是用匯編寫的。
?
?
5.3??導出表數據結構
5.3.1??導出表定位
? ? 導出表數據為數據目錄中注冊的數據類型之一,其描述信息位于數據目錄第一個目錄相中。
導出表所在地址RVA=0x00003A10
導出表數據大小????=0x000000061
再看這個
?
? ? 上面導出表RAV是0x3a10?大小0x61?應該是落在.radata的區間里了,也就是說這個導出表在.rdata里。
? ? 同時根據RVA-FOR轉換可得到導出表數據所在文件偏移地址為:2010
5.3.2??導出目錄IMAGE_EXPORT_DIRECTORY
? ? 導出數據的第一個結構是IMAGE_EXPORT_DIRECTORY。該結構詳細定義如下:
導入表的IMAGE_IMPORT_EDSCRIPTOP個數與調用的動態鏈接庫個數相等,而導出表的IMAGE_EXPORT_DIRECTORY只有一個。
5.3.3??導出表實例分析
?下面以上面的那個動態鏈接庫為例,進行PE文件導出表結構分析。
文件導出表節內容如下:
56?3a?00?00
? ? 對應IMAGE_EXPORT_DIRECTORY.Name字段,指向文件偏移0x00002056。對應的值為字符串DLLTest.dll,是動態鏈接庫的名字。
01?00?00?00
對應IMAGE_EXPORT_DIRECTORY.nBase字段,表示起始編號為1。
03?00?00?00
對應IMAGE_EXPORT_DIRECTORY.NumberOfFunctions字段,表示有4個導出函數。
03?00?00?00
表示三個導出函數均是按照名稱導出。
38?3A?00?00
對應IMAGE_EXPORT_DIRECTORY.AddressOfFunctions字段。從該位置去除連續3個地址,這些地址分別對應3個函數的RVA。
RVA:3A38?--->?FOA:2038
44?3A?00
對應IMAGE_EXPORT_DIRECTORY.AddressOfName字段。從該位置獲取處的連續3個地址依次為:
RVA:3A44?--->?FOR:2044??
和書上不一樣,目前這個2044開始的不是三個函數名字,而是三個函數名字的地址,要據需往下找一層才能找到:
50?3A?00?00
對應IMAGE_EXPORT_DIRECTORY.AddressOfNameOrdinals字段。從該位置去除的連續3個單子索引依次為:0?1?2
總結
以上是生活随笔為你收集整理的WindowsPE 第五章 导出表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DLL内存加载
- 下一篇: DLL注入-APC注入