Windows 下的 7 种 DLL 劫持技术
AppInit_DLLs
人們以前往往依賴于AppInit_DLLs注冊表項。它是操作系統(tǒng)加載程序查詢此值并加載創(chuàng)建進程時指定的DLL。我在很長一段時間沒有使用這種技術(最后一次我使用它在Windows XP上),而且我聽說現(xiàn)在受到惡意軟件的廣泛使用,所以它也受到限制或被停止使用了。
SetWindowsHookEx API
使用API函數(shù)SetWindowsHookEx()可以把一個應用程序定義的鉤子子程安裝到鉤子鏈表中。 SetWindowsHookEx函數(shù)總是在Hook鏈的開頭安裝Hook子程。當指定類型的Hook監(jiān)視的事件發(fā)生時,系統(tǒng)就調(diào)用與這個Hook關聯(lián)的 Hook鏈的開頭的Hook子程。每一個Hook鏈中的Hook子程都決定是否把這個事件傳遞到下一個Hook子程。Hook子程傳遞事件到下一個 Hook子程需要調(diào)用CallNextHookEx函數(shù)。它支持各種各樣的鉤鏈(CBT,Journal,Window消息,鍵盤,鼠標等)。
當使用SetWindowsHookEx API時,你就是在在指示操作系統(tǒng)將自定義HookDLL注入到其相關的其他進程中。當其他進程從USER32.dll導入/使用功能時,Windows?Hook就會工作。?
The Image File Execution Options (IFEO) key
該 IFEO注冊表項是非常方便的。它允許你指定OS加載程序在創(chuàng)建給定進程、啟動給定的AppVerifier插件、更改進程堆選項等情況時調(diào)用調(diào)試程序。
現(xiàn)在讓我們回過頭來說,我已經(jīng)在IFEO鍵上做了一個小實驗,創(chuàng)建了一個AppVerifier插件,注入到我選擇的進程中。
Remote threads
這種技術依賴于將遠程線程創(chuàng)建到想要注入的所需進程中。遠程線程的代碼將會非常簡單地在該目標進程的上下文中調(diào)用LoadLibrary。請注意,許多防病毒軟件都會將創(chuàng)建遠程線程標記為惡意活動。
Implicitly tracking all processes
此方法往往會依賴于進程創(chuàng)建API的Hook,例如:kernel32.CreateProcess [Internal]或較低的API。通過跟蹤其他進程的創(chuàng)建,你就會有機會將DLL注入到新進程中。
該技術背后的基本思路如下:
1、枚舉所有現(xiàn)有進程
2、將你的DLLHook注入所有正在運行的進程。這很重要,并且也會使你的注射器可以在執(zhí)行注射器之前執(zhí)行的進程達到最高速度。
3、Hook k32!CreateProcessInternalW在每個進程中。如果你能hook到更好的那些就最好了。例如在ntdll!NtCreateProcess *
4、你注入的DLL必須明確的Hook進程create API,并在調(diào)用時執(zhí)行以下操作:
1.暫停創(chuàng)建子進程 2.注入你的Hook,這本質(zhì)上是“跟蹤” 3.恢復流程。現(xiàn)在這個子進程現(xiàn)在也將Hook任何新的進程這種技術會給你一種你正在跟蹤所有流程的錯覺。不過它是有效的,我已經(jīng)看到它被用于很多安全產(chǎn)品中了。通過hook Explorer.exe(shell),你可以跟蹤從“開始菜單”啟動的所有進程。
當然,這種技術是有限的,它是可以被躲避的,不過當你在只有用戶模式訪問時它很有用。
AppCompat shimming layer
其實,很長時間里我都不知道這種注入方式,直到我在微軟工作時接觸到了EMET項目。
該程序的兼容性機制其實并不會真的記錄了第三方開發(fā)者,但當我在EMET項目中使用它時這一情況翻轉(zhuǎn)了。
其實質(zhì)是有一個名為AppPatch.dll的系統(tǒng)DLL ,它讀取一個勻場數(shù)據(jù)庫(又稱SDB)。該數(shù)據(jù)庫是自定義格式,它可以描述各種應用程序兼容性調(diào)整/修補功能:
1、內(nèi)存搜索/替換 – >補丁代碼在一個給定的模塊中,當該模塊加載
2、加載/注入一個給定進程的DLL。可以使用通配符等。
3、假API返回等。
EMET項目中我是使用方法第二種來注入DLL到所需的進程中。每個EMET重新配置時,基本思想就是在Fly中生成SDB。EMET嵌入了懂得如何生成SDB的代碼,然后在系統(tǒng)中注冊該SDB。
請注意,AppPatch機制被烘焙到操作系統(tǒng)的進程加載程序(在ntdll.dll內(nèi))。因此,它不是真正的“注入”,它更像是加載進程的一部分。
Kernel drivers
最后的這一種但并非是不重要的,只是它不是一種純粹的用戶模式下的方法,使用內(nèi)核驅(qū)動程序是將代碼注入所有正在運行的進程的一種可靠方法。據(jù)我所知,現(xiàn)在有名氣的A / V軟件都使用了它。他們會在注冊圖像時創(chuàng)建通知,然后將在用戶模式下需要執(zhí)行并注入的一些APC進行排隊。
結(jié)論
總而言之,DLL注入是一個非常引人入勝的主題,它具有各種注入技術可供選擇,對系統(tǒng)開發(fā)人員來說真的非常有幫助。而根據(jù)你的不同選擇,注入會有不同的彈性、安全性(不被殺毒軟件所捕獲)以及持續(xù)性。
原文發(fā)布時間為:2017年5月24日 本文作者:Change 本文來自云棲社區(qū)合作伙伴嘶吼,了解相關信息可以關注嘶吼網(wǎng)站。 原文鏈接
總結(jié)
以上是生活随笔為你收集整理的Windows 下的 7 种 DLL 劫持技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Troll对ARM Cortex-M
- 下一篇: 3. Port scanners (端口