亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        一種隱藏注入模塊的新方法*

        2015-03-19 00:35:22建,劉
        關(guān)鍵詞:進(jìn)程檢測(cè)方法

        吳 建,劉 新

        (湘潭大學(xué)信息工程學(xué)院“智能計(jì)算與信息處理”教育部重點(diǎn)實(shí)驗(yàn)室,湖南 湘潭411105)

        1 引言

        在信息安全領(lǐng)域,對(duì)借助各類(lèi)工具對(duì)惡意軟件進(jìn)行動(dòng)態(tài)跟蹤分析是安全專(zhuān)家的日常工作。但是,越來(lái)越多的惡意軟件會(huì)檢測(cè)自身進(jìn)程空間中是否存在其他模塊來(lái)發(fā)現(xiàn)安全分析工具的存在。為對(duì)抗這種反監(jiān)控,安全分析工具需要通過(guò)Rootkits[1]和Anti Rootkits技術(shù)來(lái)隱藏注入模塊[2,3]。

        注入是指讓目標(biāo)進(jìn)程非自愿地加載指定的模塊,進(jìn)而執(zhí)行特定的代碼。Windows操作系統(tǒng)下的注入方法非常多,我們依據(jù)目標(biāo)進(jìn)程是否會(huì)被動(dòng)地載入模塊,將注入方式劃分為“有模塊注入”和“無(wú)模塊注入”兩類(lèi)。

        “有模塊注入”的方法常用的有:消息鉤子注入、DLL劫持注入、注冊(cè)表注入、輸入法注入、內(nèi)核回調(diào)注入、依賴(lài)可信進(jìn)程注入等等[2,4]?!坝心K注入”的優(yōu)點(diǎn)是注入手段多,并且可以做到在不向目標(biāo)進(jìn)程空間寫(xiě)入任何數(shù)據(jù)的情況下,把DLL 模塊注入進(jìn)去。由于這些注入方式是利用操作系統(tǒng)提供的一些特殊接口來(lái)實(shí)現(xiàn)的,而正常軟件也經(jīng)常利用這些注入方法來(lái)實(shí)現(xiàn)某些功能,所以惡意軟件很難區(qū)分出哪些注入是由安全分析工具發(fā)起的,也就無(wú)法抵抗這些注入行為。但是,這些注入方法會(huì)在目標(biāo)進(jìn)程里多出一個(gè)模塊,增加了暴露的可能性。

        由于注入模塊在進(jìn)程的整個(gè)生命周期中都存在(在任何時(shí)候使用ARK 工具對(duì)目標(biāo)進(jìn)程進(jìn)行人工檢測(cè),都很容易發(fā)現(xiàn)這個(gè)注入模塊),因此這種注入方式盡管可能暫時(shí)騙過(guò)惡意軟件的防御,但無(wú)法逃避經(jīng)驗(yàn)豐富的惡意軟件編制者的檢測(cè)。惡意軟件如果想逃避監(jiān)控的話(huà),可以通過(guò)定時(shí)掃描自身進(jìn)程空間的方式來(lái)發(fā)現(xiàn)是否增加了監(jiān)控模塊,以便采取反監(jiān)控措施。

        為了讓注入模塊更加隱蔽,安全技術(shù)人員提出了一種被稱(chēng)為“無(wú)模塊注入”的技術(shù),該技術(shù)的基本思想是去掉DLL模塊這個(gè)代碼的載體,直接把代碼寫(xiě)入到目標(biāo)進(jìn)程。目前常用的“無(wú)模塊注入”方法有SHELLCODE[5]注入、自加載DLL 等。但 是,這些注入方法實(shí)現(xiàn)起來(lái)比較麻煩,并且要向目標(biāo)進(jìn)程寫(xiě)入大量的數(shù)據(jù)。對(duì)于有內(nèi)存讀寫(xiě)保護(hù)的進(jìn)程,必須要把握住很好的時(shí)機(jī)(進(jìn)程已經(jīng)創(chuàng)建,但保護(hù)還沒(méi)生效的時(shí)候),這種注入手段才能奏效。由于這些“無(wú)模塊注入”的方式一定要向目標(biāo)進(jìn)程寫(xiě)入或者映射數(shù)據(jù),而正常軟件一般是不會(huì)有這種行為的,所以注入行為本身很容易被檢測(cè)到并且被阻止運(yùn)行。

        “無(wú)模塊注入”雖然在注入完成后可以很好地隱藏注入到目標(biāo)進(jìn)程的代碼,但它一定會(huì)有跨進(jìn)程操作內(nèi)存的行為,而且這種行為是很危險(xiǎn)的,所以安全軟件通常采用的注入方法依然是“有模塊注入”。為了更好地隱藏自己,在注入完成之后有必要把這個(gè)多出的DLL模塊給隱藏起來(lái)。

        比較常見(jiàn)的隱藏模塊的方法有斷開(kāi)鏈表的節(jié)點(diǎn)、Hook 枚 舉 模 塊 的API 函 數(shù)、抹 去PE 頭等[4,6],但這些隱藏方法都有各種各樣的缺點(diǎn)。

        Hook枚舉模塊的函數(shù),修改函數(shù)返回值是一種比較“古老”的技術(shù),目前已經(jīng)有了通用的方法來(lái)對(duì)抗這種隱藏,該方法被稱(chēng)為“模塊重載技術(shù)”。因?yàn)闊o(wú)論是用戶(hù)態(tài)的DLL 模塊,還是內(nèi)核態(tài)的內(nèi)核模塊都是可以重載的,只需要重新加載一份DLL模塊或者內(nèi)核模塊,然后調(diào)用重新加載的模塊里的函數(shù),就可以繞過(guò)被安裝了鉤子的函數(shù)。所以,依靠Hook技術(shù)來(lái)隱藏自己是有局限性的。并且,在Windows 7 X64 操作系統(tǒng)的內(nèi)核里已經(jīng)有了PatchGuard[7],如果Hook內(nèi)核代碼,則會(huì)導(dǎo)致系統(tǒng)崩潰。所以,利用常規(guī)的Hook技術(shù)來(lái)實(shí)現(xiàn)對(duì)模塊的隱藏,作用越來(lái)越來(lái)小,限制越來(lái)越大。

        抹去PE頭是用來(lái)對(duì)抗特征碼搜索的一種技術(shù),這種方法通過(guò)清除模塊的結(jié)構(gòu)特征來(lái)實(shí)現(xiàn)隱藏的效果,所以一般只能作為一種隱藏的輔助手段。

        由于上面兩種方法存在上述缺陷,要想很好地隱藏自己的模塊,有必要從操作系統(tǒng)維護(hù)模塊信息的數(shù)據(jù)結(jié)構(gòu)下手來(lái)處理。在RING3層,維護(hù)模塊信息的數(shù)據(jù)主要在_PEB_LDR_DATA 里,這個(gè)結(jié)構(gòu)包含三個(gè)鏈表。下面是用WINDBG 在Windows XP 和Windows 7X86 下 查 看PEB_LDR_DATA 顯示的部分結(jié)構(gòu):

        除此之外,在NTDLL 中還保存著一個(gè)叫做HashTable的鏈表,這個(gè)鏈表也保存著進(jìn)程的模塊信息。所以,在RING3 層總共會(huì)有四個(gè)LDR_M(jìn)ODULE鏈保存著DLL模塊的信息。

        容易想到,如果把保存模塊的信息的節(jié)點(diǎn)從這四個(gè)鏈表中摘除,就可以在RING3層實(shí)現(xiàn)對(duì)相應(yīng)模塊的隱藏。但是,在內(nèi)核中還有一棵管理進(jìn)程內(nèi)存空間的平衡二叉樹(shù)(VAD 樹(shù)),在這棵平衡二叉樹(shù)中,有一類(lèi)節(jié)點(diǎn)保存著內(nèi)存映射(SECTION)的相關(guān)信息。并且在這類(lèi)節(jié)點(diǎn)中,保存著一個(gè)與SECTION 關(guān)聯(lián) 的 文 件 對(duì) 象(FILE_OBJECT)[8]。而DLL模塊是以?xún)?nèi)存映射(SECTION)的方式被加載的,所以通過(guò)在內(nèi)核態(tài)遍歷VAD 樹(shù)還是可以發(fā)現(xiàn)被隱藏模塊的。要想隱藏得更加徹底,還需要編寫(xiě)驅(qū)動(dòng)程序?qū)AD 樹(shù)中對(duì)應(yīng)節(jié)點(diǎn)的文件對(duì)象中的路徑清零。由于這種隱藏模塊的方式需要編寫(xiě)驅(qū)動(dòng)程序,實(shí)現(xiàn)起來(lái)比較麻煩;并且在比較新的操作系統(tǒng)中,加載驅(qū)動(dòng)程序越來(lái)越困難[9]。再加上在Windows 7X64系統(tǒng)中還有PatchGuard,修改這棵VAD 樹(shù)會(huì)導(dǎo)致系統(tǒng)崩潰。因此,通過(guò)斷開(kāi)操作系統(tǒng)中用來(lái)維護(hù)模塊信息的鏈表來(lái)隱藏模塊,也越來(lái)越不適應(yīng)新環(huán)境。

        2 隱藏注入模塊的新方法

        為了達(dá)到隱藏模塊的目的,需要尋找一個(gè)比較通用的、不在上述四條鏈表和VAD 樹(shù)中留下痕跡的加載模塊的方法。

        一種思路是不調(diào)用操作系統(tǒng)的加載模塊的API函數(shù),直接把DLL 模塊中的代碼和數(shù)據(jù)寫(xiě)入到目標(biāo)進(jìn)程,然后再自己處理導(dǎo)入表和重定位表。實(shí)驗(yàn)表明,在惡意軟件沒(méi)有采取防御的情形下,這種方式是有效的。但是,因?yàn)檫@種方式有跨進(jìn)程向內(nèi)存空間寫(xiě)入數(shù)據(jù)的行為,所以很容易被惡意軟件防范。

        還有一種思路是先讓DLL 模塊正常加載,然后復(fù)制一份完整的DLL 模塊的內(nèi)存映象,把原先的DLL模塊釋放掉,再以DLL模塊正常加載的基址為地址申請(qǐng)與原DLL模塊內(nèi)存映象相同大小的內(nèi)存,然后再把備份的映象復(fù)制回去。這樣該DLL模塊就在操作系統(tǒng)中消失了,并且免去了修復(fù)導(dǎo)入表和重定位的麻煩。但是,這種方式同樣需要操作目標(biāo)進(jìn)程的內(nèi)存,所以也會(huì)被惡意軟件防范。

        上面的兩種注入方法可以歸類(lèi)為“無(wú)模塊注入”,可以比較好地隱藏被注入的代碼。但是,它有個(gè)致命的危險(xiǎn)行為:操作不屬于自己的內(nèi)存空間,進(jìn)而被惡意軟件防范。

        既然“無(wú)模塊注入”的致命缺點(diǎn)是有跨進(jìn)程操作內(nèi)存空間的行為,如果能夠在目標(biāo)進(jìn)程內(nèi)部進(jìn)行代碼的去模塊化操作,由于惡意軟件無(wú)法察覺(jué)這種進(jìn)程內(nèi)部操作內(nèi)存的行為,那么這種去模塊化的方法從理論上來(lái)看應(yīng)該能夠繞過(guò)惡意軟件的防御。

        系統(tǒng)中任何一個(gè)軟件為了能在系統(tǒng)中生存和正常運(yùn)行下去,總會(huì)允許一些“有模塊注入”行為注入到自身(比如輸入法的調(diào)用,就是一種“有模塊注入”)。對(duì)于“有模塊注入”,惡意軟件很難鑒別出哪些注入是系統(tǒng)必須的,哪些注入是由安全軟件發(fā)起的,所以不可能阻止所有的注入行為。亦即任何軟件都無(wú)法有效地防御所有的“有模塊注入”,因此可以把“有模塊注入”和代碼的去模塊化操作結(jié)合起來(lái)。并且通過(guò)在無(wú)模塊化的代碼中釋放被注入的模塊,可以解決“有模塊注入”在目標(biāo)進(jìn)程中會(huì)多出一個(gè)模塊的缺點(diǎn),從而達(dá)到很好的隱藏效果。

        根據(jù)以上分析,形成了以下思路:先通過(guò)“有模塊注入”的方式在目標(biāo)進(jìn)程中注入一個(gè)類(lèi)似“加載器”的模塊,然后在“加載器”中實(shí)現(xiàn)無(wú)模塊化加載主功能模塊,最后把“加載器”模塊釋放掉,實(shí)現(xiàn)去模塊化操作。

        2.1 隱藏模塊的實(shí)現(xiàn)步驟

        本方法需要用到兩個(gè)DLL,第一個(gè)DLL 是包含監(jiān)控功能的DLL,為了描述方便,將其命名為main.dll;第二個(gè)DLL 用來(lái)加載主main.dll,并實(shí)現(xiàn)對(duì)main.dll的隱藏,這個(gè)DLL 命名為load.dll。以下是實(shí)現(xiàn)步驟:

        步驟1采取一種惡意軟件無(wú)法進(jìn)行有效防御的“有模塊注入”方法(比如輸入法注入)注入load.dll到目標(biāo)進(jìn)程。

        步驟2在load.dll中加載main.dll,此時(shí)main.dll會(huì)完成對(duì)全局變量以及堆的初始化。

        步驟3復(fù)制一份main.dll到其他區(qū)域作為備份。

        步驟4直接修改main.dll的入口函數(shù)為返回,再釋放main.dll。此時(shí)在目標(biāo)進(jìn)程內(nèi)已經(jīng)不存在main.dll,也就檢測(cè)不到main.dll了。

        步驟5在main.dll原基址申請(qǐng)同樣大小的地址空間,把備份數(shù)據(jù)復(fù)制到原地址空間。

        步驟6執(zhí)行main.dll的一個(gè)導(dǎo)出函數(shù),在這個(gè)函數(shù)內(nèi)釋放load.dll,并執(zhí)行一些初始化操作。至此,load.dll和main.dll都已從目標(biāo)進(jìn)程內(nèi)釋放,但main.dll內(nèi)的代碼還可以正常執(zhí)行。

        步驟7為了達(dá)到更加隱蔽的效果,還需要把main.dll的整個(gè)PE頭部清零。

        2.2 抹掉PE頭,對(duì)抗暴力枚舉

        注入到目標(biāo)進(jìn)程的DLL 模塊,會(huì)有比較明顯的結(jié)構(gòu)特征。惡意軟件通過(guò)遍歷整個(gè)內(nèi)存空間,然后搜索特征碼的方式,可以發(fā)現(xiàn)被隱藏的模塊。這種檢測(cè)方式可以稱(chēng)之為“暴力枚舉”。為了對(duì)抗這種暴力枚舉,需要將模塊的結(jié)構(gòu)特征清除掉。

        PE 文件是Windows操作系統(tǒng)上的程序文件(Portable Executable)的 統(tǒng) 稱(chēng),DLL 模 塊 就 是 按PE文件格式[10]組織的,常見(jiàn)的EXE、DLL、OCX、SYS、COM 都是PE文件。圖1描述了PE 文件的基本結(jié)構(gòu)。

        Figure 1 Structure of PE file圖1 PE文件結(jié)構(gòu)

        經(jīng) 過(guò) 實(shí) 驗(yàn),把“DOS HEADER”和“PE HEADER”清零后,DLL 模塊中的代碼是可以正常工作的。下面是清零的關(guān)鍵代碼。

        2.3 釋放DLL同時(shí)保留DLL的資源

        通過(guò)調(diào)用釋放模塊的API函數(shù),可以把DLL模塊的信息從目標(biāo)進(jìn)程和系統(tǒng)的相關(guān)數(shù)據(jù)結(jié)構(gòu)內(nèi)刪除。這個(gè)時(shí)候,無(wú)論是在用戶(hù)態(tài)還是內(nèi)核態(tài),都無(wú)法通過(guò)常規(guī)方法發(fā)現(xiàn)被隱藏的模塊。但同時(shí),模塊占用的內(nèi)存區(qū)域和一些資源也會(huì)被釋放掉,這樣會(huì)導(dǎo)致程序不能正常執(zhí)行。

        為解決內(nèi)存被釋放的問(wèn)題,可以備份整個(gè)模塊的數(shù)據(jù)和重新分配內(nèi)存?,F(xiàn)在就只剩下一個(gè)關(guān)鍵問(wèn)題:在調(diào)用釋放模塊函數(shù)的時(shí)候,如何阻止操作系統(tǒng)釋放DLL模塊的資源。

        操作系統(tǒng)提供的釋放資源的API函數(shù)freelibrary(),會(huì)執(zhí)行下面兩個(gè)操作:

        (1)把DLL模塊所占用的由系統(tǒng)分配的資源釋放掉(比如堆heap)。為了阻止這種資源釋放,可以在調(diào)用釋放模塊的API函數(shù)之前,把DLL 模塊的入口點(diǎn)的指令修改為RET 指令。代碼如下:

        (2)減少依賴(lài)的其他DLL模塊的計(jì)數(shù),進(jìn)而可能會(huì)導(dǎo)致這些DLL模塊被釋放。為了使注入的模塊更加隱蔽,應(yīng)該在這個(gè)DLL 模塊中盡可能少依賴(lài)其它DLL。在用VS 編譯DLL 時(shí),選擇“多線(xiàn)程/MT”選項(xiàng),可以做到編譯出來(lái)的DLL 模塊只有KERNEL32.DLL 和USER32.DLL 兩個(gè)依賴(lài)項(xiàng)。而在被注入的進(jìn)程里,一般也會(huì)有這兩個(gè)DLL,從而可以解決依賴(lài)的DLL 模塊被釋放的問(wèn)題。

        2.4 保持模塊“活性”

        把DLL模塊注入到目標(biāo)進(jìn)程后,如果得不到運(yùn)行機(jī)會(huì),這塊代碼就是“死的”,是一種無(wú)效注入。必須要讓DLL 模塊里的代碼不斷地得到進(jìn)入CPU 的機(jī)會(huì)去執(zhí)行一些操作,這種注入才是有效的。我們把這種爭(zhēng)取CPU 控制權(quán)的行為稱(chēng)為“保持活性”。

        要保持模塊的活性,一種思路是Hook被注入進(jìn)程經(jīng)常會(huì)調(diào)用的一些函數(shù)(比如消息響應(yīng)函數(shù)WINPROC),這樣可以讓注入的代碼經(jīng)常有機(jī)會(huì)得到執(zhí)行。但是,這種方法不能準(zhǔn)確地確定注入的代碼被執(zhí)行的時(shí)機(jī),并且有時(shí)還會(huì)觸發(fā)被注入進(jìn)程的一些保護(hù)機(jī)制。

        還有一種方法就是在DLL 模塊被初始化時(shí),創(chuàng)建一個(gè)線(xiàn)程。在這個(gè)線(xiàn)程里,定時(shí)地執(zhí)行注入的代碼;并且還可以使用同步對(duì)象(EVENT、MUTEX 等)和內(nèi)存映射等機(jī)制與外部進(jìn)程進(jìn)行實(shí)時(shí)的通信和交互,就相當(dāng)于在目標(biāo)進(jìn)程中插入了一個(gè)間諜。采用這種方式注入代碼的執(zhí)行時(shí)間可控,而且可以主動(dòng)運(yùn)行,比第一種方法更好。但是,這種方法也有個(gè)比較明顯的缺點(diǎn):在目標(biāo)進(jìn)程中會(huì)多出一個(gè)線(xiàn)程,并且這個(gè)線(xiàn)程是無(wú)模塊的,惡意軟件作者可以發(fā)現(xiàn)這個(gè)線(xiàn)程。因此,還需要進(jìn)一步地改進(jìn),使得該注入線(xiàn)程看上去更像一個(gè)普通線(xiàn)程。

        2.5 線(xiàn)程偽裝

        線(xiàn)程是調(diào)度的基本單位,要完全隱藏線(xiàn)程,基本上不可能真正實(shí)現(xiàn)。不過(guò),目前絕大多數(shù)程序都是多線(xiàn)程的,在目標(biāo)進(jìn)程多出一個(gè)線(xiàn)程即便經(jīng)驗(yàn)豐富的專(zhuān)業(yè)技術(shù)人員也很難辨別其是否為注入,因此沒(méi)有必要把線(xiàn)程給徹底隱藏。只需要把“線(xiàn)程沒(méi)有對(duì)應(yīng)的模塊”這個(gè)問(wèn)題給解決了,就能達(dá)到很好的隱蔽效果。

        把線(xiàn)程從一個(gè)模塊轉(zhuǎn)移到另一個(gè)模塊的方法被稱(chēng)為線(xiàn)程偽裝,用這種方法可以很好地解決無(wú)主線(xiàn)程的問(wèn)題。系統(tǒng)判斷線(xiàn)程所在的模塊,是通過(guò)先取得線(xiàn)程的開(kāi)始地址,然后再用這個(gè)開(kāi)始地址去定位相應(yīng)的模塊。因此,只要偽造一個(gè)假的線(xiàn)程開(kāi)始地址,就可以讓這個(gè)線(xiàn)程“屬于相應(yīng)的模塊”。具體方法如下:在目標(biāo)進(jìn)程已經(jīng)存在的模塊中尋找一個(gè)地址(比如模塊入口函數(shù)),在這個(gè)地址處構(gòu)造一個(gè)跳轉(zhuǎn)指令,直接跳到線(xiàn)程函數(shù)的起始地址。然后,在創(chuàng)建線(xiàn)程的時(shí)候,用找到的這個(gè)“跳板地址”作為創(chuàng)建線(xiàn)程的參數(shù)。等這個(gè)線(xiàn)程運(yùn)行起來(lái)以后,再恢復(fù)被修改的指令。這樣,被隱藏的模塊的線(xiàn)程就不再是“無(wú)主線(xiàn)程”。

        通過(guò)這種方法,可以很好地解決駐留線(xiàn)程被檢測(cè)的問(wèn)題。下面這份代碼讓“無(wú)主線(xiàn)程”thread-Start成功轉(zhuǎn)嫁到了kernel32.DLL上。

        2.6 兩個(gè)特殊問(wèn)題的解決

        把注入的DLL模塊給隱藏后,系統(tǒng)的API函數(shù)GetmoduleHandle、GetModuleFileName 等 需要枚舉模塊的函數(shù)均無(wú)法定位到這個(gè)模塊,可能會(huì)導(dǎo)致注入的代碼出現(xiàn)一些異常。下面是在實(shí)驗(yàn)過(guò)程中遇到過(guò)的兩種問(wèn)題:

        (1)如果DLL模塊中是有資源的,系統(tǒng)在加載資源前會(huì)要求先定位到這個(gè)DLL 模塊,然后才會(huì)加載資源。但是,這個(gè)DLL模塊已經(jīng)被隱藏,會(huì)導(dǎo)致程序出錯(cuò)。

        (2)操作系統(tǒng)在進(jìn)行異常分發(fā)時(shí),也需要定位異常指令所在的模塊。但是,由于該模塊已被隱藏,所以異常處理代碼不能發(fā)揮作用。

        我們的解決方法是在定位模塊的函數(shù)中安裝鉤子,然后進(jìn)行堆棧回溯檢測(cè),如果發(fā)現(xiàn)是自己的模塊在定位自己時(shí),就返回正確的信息。但是,這個(gè)方法需要安裝鉤子,處理不夠隱蔽。

        更隱蔽一點(diǎn)的方法就是在這個(gè)被隱藏的DLL模塊中既不攜帶資源,也不進(jìn)行異常處理。由于注入的代碼一般不是很多,因此要做到既無(wú)資源,又無(wú)異常,還是比較容易實(shí)現(xiàn)的。

        3 實(shí)驗(yàn)結(jié)果與分析

        XueTr是一款廣受好評(píng)的ARK 工具,它對(duì)模塊和線(xiàn)程有很強(qiáng)大的檢測(cè)能力。本實(shí)驗(yàn)就用XueTr來(lái)觀(guān)察隱藏模塊的效果。

        前面已經(jīng)介紹了Hook枚舉模塊的函數(shù)、斷開(kāi)進(jìn)程的LDR_M(jìn)ODULE 鏈、修改SECTION 類(lèi)型的內(nèi)存區(qū)域節(jié)點(diǎn)等實(shí)現(xiàn)隱藏模塊的方法。有的方法達(dá)不到隱藏效果,有的方法在低版本的Windows操作系統(tǒng)(比如Windows XP)下可以實(shí)現(xiàn)模塊隱藏,但在一些高版本的操作系統(tǒng)(比如Windows 7X64)中卻無(wú)法實(shí)現(xiàn)。本次實(shí)驗(yàn)采用了“斷開(kāi)進(jìn)程的LDR_M(jìn)ODULE鏈”這種方法,與我們?cè)O(shè)計(jì)的方法進(jìn)行對(duì)比。

        在不隱藏模塊的情況下,實(shí)驗(yàn)結(jié)果如圖2 所示,main.dll會(huì)被檢測(cè)出(圖中的第一行)。

        采用“斷開(kāi)進(jìn)程的LDR_M(jìn)ODULE鏈”來(lái)隱藏模塊,如圖3所示。第一行是被隱藏的模塊,并且被XueTr標(biāo)記為危險(xiǎn)狀態(tài)(危險(xiǎn)狀態(tài)顯示為紅色,但在黑白印刷中,看不出紅色,下同)。

        而用我們的方法來(lái)隱藏被注入的模塊,可以達(dá)到很好的隱藏效果。從圖4可以看出,注入的模塊已經(jīng)完全被隱藏。

        Figure 2 Effect of not hiding the injected modules圖2 不隱藏模塊的效果

        Figure 3 Effect of hiding the injected modules by disconnecting chains圖3 斷鏈隱藏模塊的效果

        Figure 4 Effect of hiding the injected modules by our method圖4 我們的方法隱藏模塊的效果

        再來(lái)看線(xiàn)程偽裝的效果。圖5是在沒(méi)有進(jìn)行線(xiàn)程偽裝之前,XueTr檢測(cè)到的線(xiàn)程信息??梢钥吹剑谝恍酗@示出駐留線(xiàn)程是“無(wú)主線(xiàn)程”并且被標(biāo)記為危險(xiǎn)狀態(tài)。

        Figure 5 Effect before camouflaging thread圖5 沒(méi)有線(xiàn)程偽裝的效果

        線(xiàn)程偽裝之后的效果如圖6所示。駐留線(xiàn)程已經(jīng)“屬于了”kernel32.DLL這個(gè)模塊。

        Figure 6 Effect after camouflaging thread圖6 線(xiàn)程偽裝后的效果

        從實(shí)驗(yàn)結(jié)果可以看出,本文中的方法比目前的主流方法隱蔽性更好。并且這種方法在Windows XP及其以后的Windows系列平臺(tái)都適用。

        4 結(jié)束語(yǔ)

        本文將“有模塊注入”和“無(wú)模塊注入”結(jié)合起來(lái),形成了一種突破性強(qiáng)、隱藏性好、兼容性好的隱藏注入模塊的方法,并且對(duì)這種隱藏方法進(jìn)行了實(shí)驗(yàn)。用這種方法實(shí)現(xiàn)對(duì)被注入模塊的隱藏,突破防御的能力強(qiáng),能夠兼容各種版本的Windows操作系統(tǒng),并且隱蔽性比目前的通用方法都要好。

        不過(guò),本文的方法還存在一些小的不足:用這種方法實(shí)現(xiàn)模塊的隱藏時(shí),在目標(biāo)進(jìn)程會(huì)多出一塊內(nèi)存。要處理得更加隱蔽,可以考慮把這塊內(nèi)存也隱藏起來(lái)。

        另外,如果被注入進(jìn)程有檢測(cè)機(jī)制,并且在常用的函數(shù)處安裝了鉤子,然后在堆棧中回溯出調(diào)用鏈,也能定位到被隱藏的模塊。但是,這種自我檢測(cè)會(huì)對(duì)程序的運(yùn)行效率造成比較大的影響,所以一般很少有程序采用。同時(shí),為了對(duì)抗這種檢測(cè),可以考慮在調(diào)用常用的系統(tǒng)函數(shù)前構(gòu)造一條假的調(diào)用鏈[4]。另外,還有可以從根本上繞過(guò)這種堆?;厮輽z測(cè)的方法:重載有所依賴(lài)的系統(tǒng)DLL 模塊。為了更加隱蔽,在重載系統(tǒng)DLL的時(shí)候,也可以把重載的系統(tǒng)DLL做無(wú)模塊化處理。

        以上這些問(wèn)題,將在后續(xù)的研究中逐步解決。

        [1] Gong Guang,Li Zhou-jun,Hu Chao-jian,et al.Research on stealth technology of Windows kernel level rootkits[J].Computer Science,2010,37(4):59-62.(in Chinese)

        [2] Xu Ming,Yang Tong,Zheng Lian-qing,et al.Concealing technology of Trojan horses and prevention[J].Computer Engineering and Design,2011,32(2):489-492.(in Chinese)

        [3] He Zhi,F(xiàn)an Ming-yu,Luo Bin-jie.Research on remote-thread injection based hidden process technology[J].Computer Applications,2008,28(6):92-94.(in Chinese)

        [4] Xu Sheng.Game plugin art[M].Beijing:Electronic Industry Press,2013.(in Chinese)

        [5] Wang Ying,Li Xiang-h(huán)e,Guan Long,et al.Attack and defending technology of shellcode [J].Computer Engineering,2010,36(18):163-168.(in Chinese)

        [6] Doug W.Methods for detecting kernel rootkits[D].University of Louisville,2007.

        [7] Han Zhuo,Ran Xiao-min,LüWen-gao.Kernel integrity verification of Windows 7[J].Journal of Information Engineering University,2011,12(6):764-768.(in Chinese)

        [8] Mao De-cao.Windows kernal scenario analysis—using open source code ReactOS[M].Beijing:Electronic Industry Press,2009.(in Chinese)

        [9] Zhang Zhi,Cai Wan-dong.Excution method of unsigned driver on Windows x64[J].Microelectronics &Computer,2014,31(2):101-105.(in Chinese)

        [10] Qi Li.Windwos PE authoritative guide[M].Beijing:Mechanical Industry Press,2011.(in Chinese)

        附中文參考文獻(xiàn):

        [1] 龔廣,李舟軍,忽朝儉,等.Windows內(nèi)核級(jí)Rootkits隱藏技術(shù)的研究[J].計(jì)算機(jī)科學(xué),2010,37(4):59-62.

        [2] 許名,楊仝,鄭連清,等.木馬隱藏技術(shù)與防范方法[J].計(jì)算機(jī)工程與設(shè)計(jì),2011,32(2):489-492.

        [3] 何志,范明鈺,羅彬杰.基于遠(yuǎn)程線(xiàn)程注入的進(jìn)程隱藏技術(shù)研究[J].計(jì)算機(jī)應(yīng)用,2008,28(6):92-94.

        [4] 徐勝.游戲外掛攻防藝術(shù)[M].北京:電子工業(yè)出版社,2013.

        [5] 王穎,李祥和,關(guān)龍,等.Shellcode攻擊與防范技術(shù)[J].計(jì)算機(jī)工程,2010,36(18):163-168.

        [7] 韓卓,冉曉旻,呂文高.Windows7內(nèi)核完整性驗(yàn)證機(jī)制研究[J].信息工程大學(xué)學(xué)報(bào),2011,12(6):764-768.

        [8] 毛德操.Windows內(nèi)核情景分析——采用開(kāi)源代碼ReactOS(上、下冊(cè))[M].北京:電子工業(yè)出版社,2009.

        [9] 張智,蔡皖東.Windows x64無(wú)簽名驅(qū)動(dòng)程序運(yùn)行方法[J].微電子學(xué)與計(jì)算機(jī),2014,31(2):101-105.

        [10] 戚利.Windows PE權(quán)威指南[M].北京:機(jī)械工業(yè)出版社,2011.

        猜你喜歡
        進(jìn)程檢測(cè)方法
        “不等式”檢測(cè)題
        “一元一次不等式”檢測(cè)題
        “一元一次不等式組”檢測(cè)題
        債券市場(chǎng)對(duì)外開(kāi)放的進(jìn)程與展望
        可能是方法不對(duì)
        小波變換在PCB缺陷檢測(cè)中的應(yīng)用
        用對(duì)方法才能瘦
        Coco薇(2016年2期)2016-03-22 02:42:52
        四大方法 教你不再“坐以待病”!
        Coco薇(2015年1期)2015-08-13 02:47:34
        捕魚(yú)
        社會(huì)進(jìn)程中的新聞學(xué)探尋
        奇米影视777撸吧| 日本二区三区在线免费| 二区免费在线视频观看| 久久午夜福利无码1000合集 | 麻豆亚洲av永久无码精品久久| 亚洲Va中文字幕久久无码一区 | 国产精品亚洲专区无码web| 成人精品国产亚洲av久久| 水蜜桃精品视频在线观看| 欧美一区二区三区视频在线观看| 蜜臀av免费一区二区三区| 岛国视频在线无码| 手机免费高清在线观看av| 高潮内射双龙视频| 亚洲国产精品久久久久久久| jiZZ国产在线女人水多| 国产黄色一区二区在线看| 先锋中文字幕在线资源| 亚洲成av人最新无码| 在线亚洲精品国产成人二区| 就去吻亚洲精品欧美日韩在线| 久久国产精彩视频| 日本精品久久中文字幕| 黑人老外3p爽粗大免费看视频| 精品深夜av无码一区二区| 亚洲中文字幕无码久久2018| 青青草视频在线观看9| 国产爆乳美女娇喘呻吟| 国产无遮挡a片又黄又爽| 久久精品国产亚洲AV高清y w| 高清不卡日本v二区在线| 久久久久亚洲av成人无码| 少妇人妻200篇白洁| 亚洲九九九| 粉嫩的极品女神尤物在线| 久久久久久久97| 91福利视频免费| 日韩男女av中文字幕| 免费观看成人欧美www色| 久久精品成人欧美大片| 视频网站在线观看不卡|