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