DLL劫持
概念
首先來了解DLL在Windows系統中的作用,DLL全稱Dynamic Link Library,稱為動态連接配接庫,在Windows系統中,大多數程式并不是一個單獨的可執行檔案,而是有一些單獨的存放動态連結庫在系統中,當需要某些功能時,通過DLL執行相應的功能,即DLL調用。
那麼既然程式執行某些功能時,可能會通過DLL調用,從利用角度來看,如果替換了這個DLL檔案,或者導出了原DLL的導出函數并惡意構造,在原程式調用正常DLL前調用了我們預先構造好的惡意DLL,那麼就達到了劫持的效果。
是以手法可以有多種,比如替換原DLL檔案,黑DLL放置最先路徑,DLL轉發等。

DLL搜尋順序
- 程序對應的應用程式所在目錄;
- 目前目錄(Current Directory);
- 系統目錄(通過 GetSystemDirectory 擷取);
- 16 位的系統目錄(即 Windows 目錄中的 System 目錄);
- Windows目錄(通過 GetWindowsDirectory 擷取);
- PATH環境變量中的各個目錄;
例如:對于檔案系統,如Doc文檔打開會被應用程式Office打開,而Office運作的時候會加載系統的一個DLL檔案,如果我們用惡意的DLL來替換系統的DLL檔案,就是将DLL和Doc文檔放在一起,運作的時候就會在目前目錄中找到DLL,進而優先系統目錄下的DLL而被執行。
更詳細的參考文檔可以在官方文檔中檢視:
https://docs.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order
防禦思路
- 調用第三方DLL時,使用絕對路徑
- 調用API SetDllDirectory()将目前目錄從DLL加載順序中移除
- 在開發階段,就使用工具對系統進行測試
DLL劫持漏洞的檢測軟體
文末檢視軟體下載下傳位址
- Ratter
- ChkDllHijack
- Process Explorer
- DLL Hijack Auditor