Windows 下的 7 種 DLL 劫持技術
在本文中,我將列出半打可以在Windows運行用戶模式的進程中使用DLL注入技術。也許可能會有更多類似的技術,但我正在和你分享的是我所擁有的第一手的技術。
AppInit_DLLs
人們以前往往依賴於AppInit_DLLs註冊表項。它是操作系統載入程序查詢此值並載入創建進程時指定的DLL。我在很長一段時間沒有使用這種技術(最後一次我使用它在Windows XP上),而且我聽說現在受到惡意軟體的廣泛使用,所以它也受到限制或被停止使用了。
SetWindowsHookEx API
使用API函數SetWindowsHookEx()可以把一個應用程序定義的鉤子子程安裝到鉤子鏈表中。 SetWindowsHookEx函數總是在Hook鏈的開頭安裝Hook子程。當指定類型的Hook監視的事件發生時,系統就調用與這個Hook關聯的 Hook鏈的開頭的Hook子程。每一個Hook鏈中的Hook子程都決定是否把這個事件傳遞到下一個Hook子程。Hook子程傳遞事件到下一個 Hook子程需要調用CallNextHookEx函數。它支持各種各樣的鉤鏈(CBT,Journal,Window消息,鍵盤,滑鼠等)。
當使用SetWindowsHookEx API時,你就是在在指示操作系統將自定義HookDLL注入到其相關的其他進程中。當其他進程從USER32.dll導入/使用功能時,Windows Hook就會工作。
The Image File Execution Options (IFEO) key
該 IFEO註冊表項是非常方便的。它允許你指定OS載入程序在創建給定進程、啟動給定的AppVerifier插件、更改進程堆選項等情況時調用調試程序。
現在讓我們回過頭來說,我已經在IFEO鍵上做了一個小實驗,創建了一個AppVerifier插件,注入到我選擇的進程中。
Remote threads
這種技術依賴於將遠程線程創建到想要注入的所需進程中。遠程線程的代碼將會非常簡單地在該目標進程的上下文中調用LoadLibrary。請注意,許多防病毒軟體都會將創建遠程線程標記為惡意活動。
Implicitly tracking all processes
此方法往往會依賴於進程創建API的Hook,例如:kernel32.CreateProcess [Internal]或較低的API。通過跟蹤其他進程的創建,你就會有機會將DLL注入到新進程中。
該技術背後的基本思路如下:
1、枚舉所有現有進程
2、將你的DLLHook注入所有正在運行的進程。這很重要,並且也會使你的注射器可以在執行注射器之前執行的進程達到最高速度。
3、Hook k32!CreateProcessInternalW在每個進程中。如果你能hook到更好的那些就最好了。例如在ntdll!NtCreateProcess *
4、你注入的DLL必須明確的Hook進程create API,並在調用時執行以下操作:
1.暫停創建子進程2.注入你的Hook,這本質上是「跟蹤」3.恢複流程。現在這個子進程現在也將Hook任何新的進程
這種技術會給你一種你正在跟蹤所有流程的錯覺。不過它是有效的,我已經看到它被用於很多安全產品中了。通過hook Explorer.exe(shell),你可以跟蹤從「開始菜單」啟動的所有進程。
當然,這種技術是有限的,它是可以被躲避的,不過當你在只有用戶模式訪問時它很有用。
AppCompat shimming layer
其實,很長時間裡我都不知道這種注入方式,直到我在微軟工作時接觸到了EMET項目。
該程序的兼容性機制其實並不會真的記錄了第三方開發者,但當我在EMET項目中使用它時這一情況翻轉了。
其實質是有一個名為AppPatch.dll的系統DLL ,它讀取一個勻場資料庫(又稱SDB)。該資料庫是自定義格式,它可以描述各種應用程序兼容性調整/修補功能:
1、內存搜索/替換 – >補丁代碼在一個給定的模塊中,當該模塊載入
2、載入/注入一個給定進程的DLL。可以使用通配符等。
3、假API返回等。
EMET項目中我是使用方法第二種來注入DLL到所需的進程中。每個EMET重新配置時,基本思想就是在Fly中生成SDB。EMET嵌入了懂得如何生成SDB的代碼,然後在系統中註冊該SDB。
請注意,AppPatch機制被烘焙到操作系統的進程載入程序(在ntdll.dll內)。因此,它不是真正的「注入」,它更像是載入進程的一部分。
Kernel drivers
最後的這一種但並非是不重要的,只是它不是一種純粹的用戶模式下的方法,使用內核驅動程序是將代碼注入所有正在運行的進程的一種可靠方法。據我所知,現在有名氣的A / V軟體都使用了它。他們會在註冊圖像時創建通知,然後將在用戶模式下需要執行並注入的一些APC進行排隊。
結論
總而言之,DLL注入是一個非常引人入勝的主題,它具有各種注入技術可供選擇,對系統開發人員來說真的非常有幫助。而根據你的不同選擇,注入會有不同的彈性、安全性(不被殺毒軟體所捕獲)以及持續性。
本文翻譯自7 DLL injection techniques in Microsoft Windows,如若轉載,請註明原文地址: Windows 下的 7 種 DLL 劫持技術 更多內容請關注「嘶吼專業版」——Pro4hou
推薦閱讀:
※由正則引起的 Wecenter 拒絕服務漏洞
※人工智慧是否會失控?存在什麼投資機會?
※SecWiki周刊(第134期)
※閣下何不乘風起,扶搖直上九萬里
※打蛇要打七寸,要黑就黑數據中心