用戶態(tài)的RootKit
??惡意代碼經(jīng)常不遺余力地對(duì)用戶隱藏它的生存機(jī)制和正在運(yùn)行的進(jìn)程。 常用來隱藏惡意代碼行為的工具被稱為Rootkit。
??Rootkit有多種存在形式,但是大部分Rootkit通過修改操作系統(tǒng)內(nèi)部的功能來工作。 這種修改可以使惡意代碼的文件、進(jìn)程、網(wǎng)絡(luò)連接以及其他資源對(duì)其他程序隱藏,這也使得反病毒產(chǎn)品、管理員以及安全分析人員難以發(fā)現(xiàn)它們的惡意活動(dòng)。
??IAT Hook是用戶空間中一種經(jīng)典的Rootkit方法,這種掛鉤方法通過修改導(dǎo)入地址表(IAT)實(shí)現(xiàn)。
??通常情況下,程序通過IAT里記錄的函數(shù)地址,訪問Kernel32.dll中的目標(biāo)函數(shù)。但是,如果植入了IAT Hook,原來的目標(biāo)函數(shù)在IAT中記錄的函數(shù)地址將會(huì)被修改為惡意代碼的地址。這樣,在程序執(zhí)行時(shí),當(dāng)調(diào)用被鉤子的函數(shù)時(shí),實(shí)際上會(huì)執(zhí)行惡意代碼函數(shù)。惡意代碼執(zhí)行完后,一般會(huì)跳轉(zhuǎn)去源代碼真正想要調(diào)用的函數(shù)地址,以來掩飾惡意行為。

??IAT Hook的步驟通常包括以下幾個(gè)步驟:
??1)獲取目標(biāo)函數(shù)的地址:通過遍歷模塊的導(dǎo)入表,找到目標(biāo)函數(shù)在DLL中的地址。
??2)保存原始函數(shù)地址:將目標(biāo)函數(shù)的地址保存下來,以便后續(xù)恢復(fù)。
??3)修改IAT表項(xiàng):將目標(biāo)函數(shù)在IAT中對(duì)應(yīng)的函數(shù)指針修改為自定義函數(shù)的地址。
??4)實(shí)現(xiàn)自定義函數(shù):編寫自定義的函數(shù),該函數(shù)會(huì)在被鉤子函數(shù)被調(diào)用時(shí)執(zhí)行。
??5)調(diào)用原始函數(shù):在自定義函數(shù)中,可以選擇是否調(diào)用原始的被鉤子函數(shù)。
??進(jìn)程注入,即將代碼注入到另外一個(gè)正在運(yùn)行的進(jìn)程中,而被注入的進(jìn)程不知情地運(yùn)行注入的代碼。惡意代碼編寫者試圖通過進(jìn)程注入技術(shù)隱藏代碼的行為,有時(shí)他們也試圖使用這種技術(shù)繞過安全機(jī)制。
??相關(guān)API函數(shù): LoadLibrary、GetProcAddress
??VirtualAllocEx:在另外一個(gè)進(jìn)程中分配一塊內(nèi)存空間。
??WriteProcessMemory:用來向VirtualAllocEx函數(shù)分配的地址空間寫數(shù)據(jù)。
?? CreateRemoteThread:最核心的函數(shù),在指定進(jìn)程的某個(gè)內(nèi)存位置存儲(chǔ)的函數(shù)為線程函數(shù),啟動(dòng)一個(gè)線程,當(dāng)然被啟動(dòng)的這個(gè)線程屬于指定的這個(gè)進(jìn)程。
??DLL注入是進(jìn)程注入的一種形式。可以簡單理解DLL注入就是讓目標(biāo)程序強(qiáng)行加載給定的dll,并執(zhí)行dll的代碼;惡意dll權(quán)限提升。
受害進(jìn)程句柄
hVictimProcess = OpenProcess(PROCESS_ALL_ACCESS, o, victimProcessID O);
分配內(nèi)存空間、寫入惡意dll的名字
pNameInVictimProcess = VirtualAllocEx(hVictimProcess,...,sizeof(maliciousLibraryName),...,...);
WriteProcessMemory(hVictimProcess,...,maliciousLibraryName, sizeof(maliciousLibraryName),...);
GetModuleHandle("Kernel32.dll");
GetProcAddress (..., "LoadLibraryA");獲取LoadLibrary的地址
CreateRemoteThread(hVictimProcess,...,...,LoadLibraryAddress,pNameInVictimProcess,...,...);
三個(gè)重要參數(shù):受害進(jìn)程句柄、LoadLibrary地址、指向惡意dll名字字符串的地址
??Inline Hook通過覆蓋導(dǎo)入DLL中APl函數(shù)的代碼來實(shí)現(xiàn)的,所以它必須等到DLL被加載后才能執(zhí)行。IAT Hook只簡單地修改函數(shù)指針,但I(xiàn)nline Hook將修改實(shí)際的函數(shù)代碼。
??惡意Rootkit通常用一個(gè)jmp跳轉(zhuǎn)指令替換函數(shù)的開始代碼來執(zhí)行Inline Hook,這個(gè)jmp跳轉(zhuǎn)指令使Rootkit插入的惡意代碼獲取執(zhí)行。 另外,Rootkit還可以通過改變函數(shù)的代碼來破壞它或者改變它,而不是跳轉(zhuǎn)到惡意代碼。



浙公網(wǎng)安備 33010602011771號(hào)