DLL劫持原理

系統有一套標準的搜索DLL路徑的規則,這套規則又分爲兩種搜索模式,安全搜索模式,非安全搜索模式。

默認情況下啓用安全DLL搜索模式。要禁用此功能,需創建HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\SafeDllSearchMode註冊表值並將其設置爲0。

 

如果啓用了SafeDllSearchMode,則搜索順序如下:

1.應用程序所在的目錄。使用GetModuleFileName獲取exe所在的目錄

2.系統目錄即SYSTEM32目錄。使用GetSystemDirectory函數獲取此目錄的路徑。

3.16位系統目錄即SYSTEM的目錄。

4.Windows目錄。使用GetWindowsDirectory函數獲取此目錄的路徑。

5.加載DLL時所在的當前目錄。使用GetCurrentDirectory獲取此目錄的路徑

6.PATH環境變量中列出的目錄。

 

如果禁用了SafeDllSearchMode,則搜索順序如下:

  1. 應用程序所在的目錄
  2. 加載DLL時所在的當前目錄。
  3. 系統目錄即SYSTEM32目錄
  4. 16位系統目錄即SYSTEM的目錄。
  5. Windows目錄。
  6. PATH環境變量中列出的目錄。

 

如果一個程序所需的DLL在本機的Known DLLs列表中存在,系統將直接使用這個已知的DLL而不會去搜索DLL。

計算機\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs。

Windows操作系統通過“DLL路徑搜索目錄順序”和“KnownDLLs註冊表項”的機制來確定應用程序所要調用的DLL的路徑,之後,應用程序就將DLL載入了自己的內存空間,執行相應的函數功能。

不過,微軟又莫名其妙的允許用戶在上述註冊表路徑中添加“ExcludeFromKnownDlls”註冊表項,排除一些被“KnownDLLs註冊表項”機制保護的DLL。也就是說,只要在“ExcludeFromKnownDlls”註冊表項中添加你想劫持的DLL名稱就可以對該DLL進行劫持,不過修改之後需要重新啓動電腦才能生效。

在上述描述加載DLL的整個過程中,DLL劫持漏洞就是在系統進行安裝“DLL路徑搜索目錄順序”搜索DLL的時候發生的。無論安全DLL搜索模式是否開啓,系統總是首先會從程序所在目錄加載DLL,如果沒有找到就按照上面的順序依次進行搜索。那麼,利用這個特性,攻擊者就可以僞造一個相同名稱,相同導出函數表的一個“假”DLL,並將每個導出函數轉向到“真”DLL。將這個“假”DLL放到程序的目錄下,當程序調用DLL中的函數時就會首先加載“假”DLL,在“假”DLL中攻擊者已經加入了惡意代碼,這時這些惡意代碼就會被執行,之後,“假”DLL再將DLL調用流程轉向“真”DLL,以免影響程序的正常執行。

 

 

如何編寫一個劫持的DLL?

編寫一個用於劫持指定DLL的DLL文件,需要兩個步驟:

1.查看被劫持的DLL的導出函數表。

2.編程實現劫持DLL向原DLL的導出函數的轉發,並加入你的惡意代碼

 

提供一個version.dll劫持的源碼

鏈接: https://pan.baidu.com/s/1NdBAYcfzBmuTOo_xFuPrQQ 提取碼: dxms

 

最後發兩個相關的鏈接:

一款通用的DLL劫持

https://github.com/anhkgg/SuperDllHijack

一個批量驗證DLL劫持的工具

https://bbs.pediy.com/thread-255384.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章