Windows PE 第八章 延迟加载导入表
延遲加載導入表
? ? 延遲加載導入表是PE中引入的專門用來描述與動態鏈接庫延遲加載相關的數據,因為這些數據所引起的作用和結構與導入表數據基本一致,所以稱為延遲加載導入表。
? ? 延遲加載導入表和導入表是相互分離的。一個PE文件中可以同時存在這兩種數據,也可以單獨存在一種。延遲加載導入表是一種特殊類型的導入表。同導入表一樣,它記錄了應用程序想要導入的部分或全部動態鏈接庫及相關函數信息。與導入表不同的是,它記錄的這些動態鏈接庫并不會被操作系統的PE加載器加載,只有等到由其等級的相關函數被應用程序調用時,PE中注冊的延遲加載函數才會根據延遲加載導入表中對該函數的描述,動態加載相關鏈接庫并修正函數VA地址,,實現對函數的調用。
8.1?延遲加載導入表的概念及其作用
? ? 寫代碼時靜態加載了XXX.dll,如果這個DLL不在,那么當進入主函數之前就會先彈錯誤窗:
? ? 主函數入口的那個?main?start不會被輸出,注意這個特點,可以利用這個東西進行代碼加密,然后在DLL的入口函數里進行內存解密就OK了,有點像之前說的那么TLS的思路。
如果延遲加載了,就會在調用的時候去找這個東西。
如果沒采用延遲加載的反匯編代碼是這樣的:
采用了延遲加載的是這樣:
還有其他很多特征,比如如果采用了延遲加載,在導入的函數的dll里是沒有下面的那個的:
? ? 然后說下作用,這個姿勢有很多應用的,平時我只是拿來免殺什么的,其實注意一點,要是免殺的話這個效果不如直接動態加載,因為雖然導入表里看不到了,PE頭里面有一個延遲加載導入表結構的,貌似是這個:
先不管那些,說下正經的應用:
(1)提高應用程序速度
? ? 這個好理解,如果你的EXE里靜態加載了100個dll,當程序剛剛加載到內存運行的時候,會把這些dll的所有入口函數都先調用一遍,如果入口里面又做了這個功能,那個功能,那就蛋疼了。
如果像上面那樣的話,程序是靜態加載dll的話,還沒等輸出main?start程序就自動退出了,so,這個地方突然想到了可以通過hijack做一個程序強退的功能,但是和保護鏡像劫持的注冊表一樣,有很多路徑直接就保護著呢,扯遠了。
(2)提高兼容性
?大概就是下面的這個樣子,采用延遲加載dll,然后可能存在dll不存在,或者dll里面沒這個函數的時候就直接SEH處理了。
(3)提高應用程序可整合性
? ? 書中說的可整合性就是程序獨立性,比如一個程序A.exe帶著一個A.dll一起干活,作者的意思是可以直接采用延遲加載,然后把A.dll資源方式添加到A.exe里,然后釋放出來,干活。這...感覺沒什么亮點,既然真喜歡整合就直接干脆不釋放出來,導到內存里內存加載執行就行了,順便把PE特性改下,不留痕跡,這個前幾天單獨寫了一個博客說這個思路。有興趣的可以找找。
然后后面就是對延遲加載導入表進行PE結構分析和基本編程。這里就不細說了,營養不多。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Windows PE 第八章 延迟加载导入表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows PE资源表编程(枚举资源
- 下一篇: Windows PE第九章 线程局部存储