專利名稱:遠(yuǎn)程線程注入型木馬的檢測(cè)和處理的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)信息安全領(lǐng)域,尤其涉及一種檢測(cè)和處理遠(yuǎn)程線程注入型木馬 的方法和裝置。
背景技術(shù):
惡意代碼是信息安全領(lǐng)域最嚴(yán)重的威脅。如何有效地檢測(cè)和查殺惡意代碼,是該 領(lǐng)域的核心問(wèn)題。木馬是惡意代碼中數(shù)量最多、危害最大的一個(gè)種類(lèi)。目前,大部分木馬采取了所謂 “遠(yuǎn)程線程注入”的技術(shù),以線程的形態(tài)藏身于一個(gè)已有的進(jìn)程(特別是系統(tǒng)進(jìn)程)中,而不 是開(kāi)啟一個(gè)新的進(jìn)程,從而隱藏自身、避免被計(jì)算機(jī)用戶發(fā)現(xiàn),也在一定程度上保護(hù)自身、 對(duì)抗反病毒產(chǎn)品的檢測(cè)和查殺。對(duì)這類(lèi)遠(yuǎn)程線程注入型木馬(以下簡(jiǎn)稱“木馬”),目前有兩種檢測(cè)和查殺的方案 方案一掃描系統(tǒng)中的所有進(jìn)程,讀取每個(gè)進(jìn)程的內(nèi)存空間,將其中的數(shù)據(jù)逐一與木馬
的內(nèi)存特征進(jìn)行匹配,若匹配成功,則認(rèn)為存在木馬。查殺方法是,結(jié)束該進(jìn)程,從而停止木 馬的運(yùn)行;或者清除木馬文件,重啟計(jì)算機(jī),從根源上避免它再次運(yùn)行。方案二 因?yàn)槟抉R在注入時(shí),需要調(diào)用一些不常用的系統(tǒng)API (應(yīng)用程序接口),因 此,反病毒產(chǎn)品可以實(shí)時(shí)監(jiān)控對(duì)這些API的調(diào)用,一旦發(fā)現(xiàn),就判斷這一調(diào)用涉及的數(shù)據(jù)是 否能與木馬特征匹配,從而實(shí)現(xiàn)檢測(cè);在查殺方法上,直接阻止這一 API調(diào)用,并終止發(fā)起 調(diào)用的進(jìn)程。上述方案一的檢測(cè)方法存在以下不足
1.檢測(cè)速度慢,這是因?yàn)橐獙?duì)所有進(jìn)程的內(nèi)存數(shù)據(jù)做特征匹配,匹配量大;
2.有一定的誤報(bào)可能,這是因?yàn)槠ヅ鋵?duì)象范圍廣,如果特征質(zhì)量差,誤報(bào)的概率較大。上述方案一的查殺方法存在以下不足
1.木馬常注入到被保護(hù)的系統(tǒng)關(guān)鍵進(jìn)程中,反病毒產(chǎn)品如果只用普通的系統(tǒng)權(quán)限無(wú) 法將其終止;而如果反病毒產(chǎn)品提升自己的權(quán)限來(lái)結(jié)束這類(lèi)進(jìn)程,將導(dǎo)致系統(tǒng)出現(xiàn)異常甚 至強(qiáng)制性重新啟動(dòng),因此會(huì)造成用戶的工作中斷、數(shù)據(jù)丟失,如果是網(wǎng)絡(luò)服務(wù)器發(fā)生意外重 啟,將導(dǎo)致網(wǎng)絡(luò)服務(wù)的中止,產(chǎn)生重大損失;
2.如果是清除文件并重啟計(jì)算機(jī),同樣存在上述問(wèn)題。上述方案二的檢測(cè)方法和查殺方法存在以下不足
1.木馬采取多種技術(shù)方法來(lái)實(shí)現(xiàn)遠(yuǎn)程線程注入,而不是只調(diào)用固定的API,從而有可 能繞開(kāi)這種檢測(cè)方法;
2.這種方法需要反病毒產(chǎn)品長(zhǎng)期處于運(yùn)行和監(jiān)控狀態(tài),既占用用戶的計(jì)算機(jī)資源,又 無(wú)法對(duì)運(yùn)行之前就已經(jīng)注入的木馬生效。
發(fā)明內(nèi)容
針對(duì)以上不足,本發(fā)明要解決的技術(shù)問(wèn)題是提供一種遠(yuǎn)程線程注入型木馬的檢測(cè)
4和處理的方法和裝置,該方法和裝置可以對(duì)操作系統(tǒng)中存在的遠(yuǎn)程線程注入型木馬進(jìn)行快 速、準(zhǔn)確、徹底地檢測(cè),并將其查殺清除而不需要重新啟動(dòng)計(jì)算機(jī)、不影響系統(tǒng)的正常運(yùn)行。為了解決上述技術(shù)問(wèn)題,本發(fā)明提供了一種遠(yuǎn)程線程注入型木馬的檢測(cè)方法,包 括
遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊, 讀取內(nèi)存模塊數(shù)據(jù);
用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。進(jìn)一步的,遍歷操作系統(tǒng)中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操 作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線 性地址,如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函 數(shù)的加載地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬 創(chuàng)建的線程。進(jìn)一步的,讀取內(nèi)存模塊數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。進(jìn)一步的,內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,包括 判定模塊,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
讀取模塊,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有 內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);
匹配模塊,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則匹配模塊確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所 創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。進(jìn)一步的,判定模塊具體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程 的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的 LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可 能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。進(jìn)一步的,讀取模塊具體用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。進(jìn)一步的,內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的處理方法,包括 遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊, 讀取內(nèi)存模塊數(shù)據(jù);
用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程;
終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空間中卸載用木馬特征匹配成功的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。進(jìn)一步的,遍歷操作系統(tǒng)中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操 作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線 性地址,如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函 數(shù)的加載地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬 創(chuàng)建的線程。進(jìn)一步的,讀取內(nèi)存模塊數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。進(jìn)一步的,內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。進(jìn)一步的,刪除該內(nèi)存模塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪除該內(nèi)存 模塊相關(guān)的文件。進(jìn)一步的,內(nèi)存模塊的信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的處理裝置,包括 判定模塊,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
讀取模塊,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有 內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);
匹配模塊,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則匹配模塊確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所 創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程;
處理模塊,用于終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空 間中卸載用木馬特征匹配成功的相應(yīng)的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。進(jìn)一步的,判定模塊具體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程 的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的 LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可 能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。進(jìn)一步的,讀取模塊具體用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。進(jìn)一步的,內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。進(jìn)一步的,處理模塊刪除該內(nèi)存模塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪 除該內(nèi)存模塊相關(guān)的文件。進(jìn)一步的,內(nèi)存模塊的信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。本發(fā)明的有益效果是
本發(fā)明通過(guò)線程入口點(diǎn)的特點(diǎn)來(lái)決定是否進(jìn)行內(nèi)存掃描,提高了檢測(cè)速度,降低了誤 報(bào)可能性;檢測(cè)對(duì)象從進(jìn)程細(xì)化為線程,查殺時(shí)只結(jié)束線程而不結(jié)束進(jìn)程,不會(huì)導(dǎo)致計(jì)算機(jī) 運(yùn)行不穩(wěn)定,更不會(huì)導(dǎo)致重啟;不需考慮遠(yuǎn)程線程注入型木馬的技術(shù)方法實(shí)現(xiàn)方式,因而不 受注入方法的影響,都可以檢測(cè)出來(lái);不需要監(jiān)控系統(tǒng)API,而是直接對(duì)操作系統(tǒng)中所有的 線程進(jìn)行檢測(cè),不需要實(shí)時(shí)監(jiān)控,對(duì)所有的線程都有效。
為了更清楚地說(shuō)明本發(fā)明或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明中 記載的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以 根據(jù)這些附圖獲得其他的附圖。圖1為本發(fā)明遠(yuǎn)程線程注入型木馬的檢測(cè)方法流程圖; 圖2為本發(fā)明遠(yuǎn)程線程注入型木馬的檢測(cè)裝置圖3為本發(fā)明遠(yuǎn)程線程注入型木馬的檢測(cè)方法實(shí)施例流程圖; 圖4為本發(fā)明遠(yuǎn)程線程注入型木馬的處理方法流程圖; 圖5為本發(fā)明遠(yuǎn)程線程注入型木馬的處理裝置圖; 圖6為本發(fā)明遠(yuǎn)程線程注入型木馬的處理方法實(shí)施例流程圖。
具體實(shí)施例方式為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明實(shí)施例中的技術(shù)方案,并使本發(fā)明的 上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對(duì)本發(fā)明中技術(shù)方案作進(jìn)一步詳 細(xì)的說(shuō)明。本發(fā)明提供了一種遠(yuǎn)程線程注入型木馬的檢測(cè)和處理的方法和裝置,該方法和裝 置可以對(duì)操作系統(tǒng)中存在的遠(yuǎn)程線程注入型木馬進(jìn)行快速、準(zhǔn)確、徹底地檢測(cè)。首先介紹本發(fā)明提供的遠(yuǎn)程線程注入型木馬的檢測(cè)方法,具體實(shí)施步驟如圖1所 示,包括
S101、遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程; 其中,遍歷操作系統(tǒng)中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操作系統(tǒng)中 的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址, 如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載 地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線 程。S102、遍歷該線程的父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù); 其中,讀取內(nèi)存模塊數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù);
內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。S103、用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,如圖2所示,包括 判定模塊201,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
讀取模塊202,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所 有內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);
匹配模塊203,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則匹配模塊203確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木 馬所創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建 的線程。判定模塊201具體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入
7口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的 LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可 能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。讀取模塊202具體用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù); 內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。下面給出本發(fā)明提供的遠(yuǎn)程線程注入型木馬的檢測(cè)方法的一個(gè)具體實(shí)施例,其中 提到的所有函數(shù)都是Windows系統(tǒng)提供的API,具體步驟如圖3所示,包括
5301、查詢線程入口點(diǎn)的地址,入口點(diǎn)即線程啟動(dòng)時(shí)執(zhí)行的第一條指令;
其中,可使用NtQuerylnformationThreadO函數(shù)查詢到線程入口點(diǎn)在其父進(jìn)程內(nèi)存 空間中的線性地址;
5302、檢查線程的入口點(diǎn)地址與內(nèi)存中LoadLibraryA或LoadLibraryW兩個(gè)API函數(shù) 的加載地址是否相同,如果都不相同,則轉(zhuǎn)到步驟S306,否則繼續(xù)執(zhí)行步驟S303 ;
該步驟是為了初步判定線程是不是可能為木馬創(chuàng)建的線程利用遠(yuǎn)程線程注入技術(shù)創(chuàng) 建的木馬線程,其入口點(diǎn)必定指向LoadLibraryA或LoadLibraryW這兩個(gè)系統(tǒng)API之一;而 通常情況下,一個(gè)正常的線程不具有這一特點(diǎn),正常線程的入口點(diǎn)以及之后的幾條指令都 用于初始化線程的運(yùn)行,然后才開(kāi)始調(diào)用各種函數(shù)或系統(tǒng)API來(lái)實(shí)現(xiàn)某些功能。因此,如果 線程入口點(diǎn)不是這兩個(gè)系統(tǒng)API之一,就可以認(rèn)為不是木馬線程,予以忽略;這一步驟不會(huì) 產(chǎn)生誤報(bào);
其中,LoadLibraryA和LoadLibraryW這兩個(gè)系統(tǒng)API在文件kernel32. dll中導(dǎo)出, 使用GetProcAddress ()函數(shù)可查詢它們被加載到內(nèi)存中的地址,然后將這兩個(gè)地址與線 程入口點(diǎn)地址做對(duì)比,判斷是否相等;
5303、找到該線程的父進(jìn)程,遍歷其內(nèi)存空間中的所有內(nèi)存模塊,讀取模塊數(shù)據(jù); 可使用Module32First()和Module32Next ()遍歷一個(gè)進(jìn)程的所有內(nèi)存模塊,獲取
模塊信息包括加載到內(nèi)存中的地址、模塊大小、可能存在的相關(guān)文件路徑與名稱;用 ReadProcessMemory ()來(lái)將每個(gè)模塊中的內(nèi)存數(shù)據(jù)讀取出來(lái);
5304、用木馬特征對(duì)步驟S303獲得的模塊數(shù)據(jù)進(jìn)行特征匹配,如果匹配不成功,轉(zhuǎn)到 步驟S306,否則繼續(xù)執(zhí)行步驟S305 ;
可使用memcmpO函數(shù)對(duì)內(nèi)存數(shù)據(jù)與木馬特征進(jìn)行特征匹配;也可以使用其他模式匹 配算法以提高運(yùn)行效率;
5305、認(rèn)為該線程是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程;
5306、是否還有未檢測(cè)的線程,如果有,轉(zhuǎn)到步驟S301對(duì)下一線程進(jìn)行檢測(cè),否則結(jié)
束;
其中,使用Thread32First()和Thread32Next ()可以實(shí)現(xiàn)對(duì)系統(tǒng)中所有線程的遍歷。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的處理方法,如圖4所示,包括 S401、遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
其中,遍歷操作系統(tǒng)中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操作系統(tǒng)中 的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址, 如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載 地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。S402、遍歷該線程的父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù); 其中,讀取內(nèi)存模塊數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù);
內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。S403、用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。S404、終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空間中 卸載用木馬特征匹配成功的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件;
其中,刪除該內(nèi)存模塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪除該內(nèi)存模塊相關(guān) 的文件;
內(nèi)存模塊的信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。本發(fā)明還提供了一種遠(yuǎn)程線程注入型木馬的處理裝置,如圖5所示,包括 判定模塊501,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;
讀取模塊502,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所 有內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);
匹配模塊503,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;
如果匹配成功,則匹配模塊503確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木 馬所創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建 的線程。處理模塊504,用于終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的 內(nèi)存空間中卸載用木馬特征匹配成功的相應(yīng)的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。判定模塊501具體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入 口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的 LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可 能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。讀取模塊502具體用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù); 內(nèi)存模塊的信息包括加載到內(nèi)存的地址和模塊大小。處理模塊504刪除該內(nèi)存模塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪除該 內(nèi)存模塊相關(guān)的文件;
內(nèi)存模塊的信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。下面給出遠(yuǎn)程線程注入型木馬的處理方法的一個(gè)具體實(shí)施例,其中提到的所有函 數(shù)都是Windows系統(tǒng)提供的API,如圖6所示,包括
5601、查詢線程入口點(diǎn)的地址,入口點(diǎn)即線程啟動(dòng)時(shí)執(zhí)行的第一條指令;
其中,可使用NtQuerylnformationThreadO函數(shù)查詢到線程入口點(diǎn)在其父進(jìn)程內(nèi)存 空間中的線性地址;
5602、檢查線程的入口點(diǎn)地址與內(nèi)存中LoadLibraryA或LoadLibraryW兩個(gè)API函數(shù) 的加載地址是否相同,如果都不相同,則轉(zhuǎn)到步驟S606,否則繼續(xù)執(zhí)行步驟S603 ;
該步驟是為了初步判定線程是不是可能為木馬創(chuàng)建的線程利用遠(yuǎn)程線程注入技術(shù)創(chuàng)建的木馬線程,其入口點(diǎn)必定指向LoadLibraryA或LoadLibraryW這兩個(gè)系統(tǒng)API之一;而 通常情況下,一個(gè)正常的線程不具有這一特點(diǎn),正常線程的入口點(diǎn)以及之后的幾條指令都 用于初始化線程的運(yùn)行,然后才開(kāi)始調(diào)用各種函數(shù)或系統(tǒng)API來(lái)實(shí)現(xiàn)某些功能。因此,如果 線程入口點(diǎn)不是這兩個(gè)系統(tǒng)API之一,就可以認(rèn)為不是木馬線程,予以忽略;這一步驟不會(huì) 產(chǎn)生誤報(bào);
其中,LoadLibraryA和LoadLibraryW這兩個(gè)系統(tǒng)API在文件kernel32. dll中導(dǎo)出, 使用GetProcAddress ()函數(shù)可查詢它們被加載到內(nèi)存中的地址,然后將這兩個(gè)地址與線 程入口點(diǎn)地址做對(duì)比,判斷是否相等;
5603、找到該線程的父進(jìn)程,遍歷其內(nèi)存空間中的所有內(nèi)存模塊,讀取模塊數(shù)據(jù); 可使用Module32First()和Module32Next ()遍歷一個(gè)進(jìn)程的所有內(nèi)存模塊,獲取
模塊信息包括加載到內(nèi)存中的地址、模塊大小、可能存在的相關(guān)文件路徑與名稱;用 ReadProcessMemory ()來(lái)將每個(gè)模塊中的內(nèi)存數(shù)據(jù)讀取出來(lái);
5604、用木馬特征對(duì)步驟S603獲得的模塊數(shù)據(jù)進(jìn)行特征匹配,如果匹配不成功,轉(zhuǎn)到 步驟S606,否則繼續(xù)執(zhí)行步驟S605 ;
可使用memcmpO函數(shù)對(duì)內(nèi)存數(shù)據(jù)與木馬特征進(jìn)行特征匹配;也可以使用其他模式匹 配算法以提高運(yùn)行效率;
5605、認(rèn)為該線程是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,將其終止;查詢匹配到特征的 模塊信息,將該模塊從內(nèi)存中卸載,并刪除它所對(duì)應(yīng)的文件;
其中,可使用TerminateThreadO終止線程;用CreateRemoteThreadO在其父進(jìn)程中 執(zhí)行FreeLibrary (),從而卸載惡意代碼對(duì)應(yīng)的模塊;用步驟S603中獲取的可能存在的相 關(guān)文件路徑與名稱,調(diào)用DeleteFileO將其刪除;
5606、是否還有未檢測(cè)的線程,如果有,轉(zhuǎn)到步驟S601對(duì)下一線程進(jìn)行檢測(cè),否則結(jié)
束;
其中,使用Thread32First()和Thread32Next ()可以實(shí)現(xiàn)對(duì)系統(tǒng)中所有線程的遍歷。通過(guò)以上具體實(shí)施方式
的描述,本發(fā)明將一部分線程過(guò)濾而不予處理,避免了傳 統(tǒng)方法中對(duì)所有線程都進(jìn)行掃描而帶來(lái)的時(shí)間開(kāi)銷(xiāo),從而極大地提高了檢測(cè)速度;
在保留原有特征匹配的基礎(chǔ)上,還要求檢測(cè)結(jié)果滿足“入口點(diǎn)是特定系統(tǒng)API ”的特點(diǎn), 使得結(jié)果更為精確,誤報(bào)率更低;
直接對(duì)線程進(jìn)行檢測(cè)和查殺,只終止系統(tǒng)進(jìn)程中的木馬線程,不影響進(jìn)程的正常運(yùn)轉(zhuǎn), 不會(huì)對(duì)系統(tǒng)造成負(fù)面影響;
遠(yuǎn)程線程注入技術(shù)有多種實(shí)現(xiàn)方法,例如通過(guò)加載文件、通過(guò)內(nèi)存拷貝等,而本發(fā)明不 需考慮這些差異,因而不受注入方法的影響;
本發(fā)明并不監(jiān)控系統(tǒng)API,而是直接對(duì)系統(tǒng)中所有的線程進(jìn)行檢測(cè)。當(dāng)然,本發(fā)明還可有其他多種實(shí)施例,在不背離本發(fā)明精神及其實(shí)質(zhì)的情況下,熟 悉本領(lǐng)域的技術(shù)人員當(dāng)可根據(jù)本發(fā)明作出各種相應(yīng)的改變和變形,但這些相應(yīng)的改變和變 形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
權(quán)利要求
1.一種遠(yuǎn)程線程注入型木馬的檢測(cè)方法,其特征在于,包括遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊, 讀取內(nèi)存模塊數(shù)據(jù);用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。
2.如權(quán)利要求1所述的遠(yuǎn)程線程注入型木馬的檢測(cè)方法,其特征在于,遍歷操作系統(tǒng) 中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所 述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存 中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線 程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。
3.如權(quán)利要求1所述的遠(yuǎn)程線程注入型木馬的檢測(cè)方法,其特征在于,讀取內(nèi)存模塊 數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。
4.4、如權(quán)利要求3所述的遠(yuǎn)程線程注入型木馬的檢測(cè)方法,其特征在于,內(nèi)存模塊的 信息包括加載到內(nèi)存的地址和模塊大小。
5.一種遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,其特征在于,包括判定模塊,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;讀取模塊,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有 內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);匹配模塊,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;如果匹配成功,則匹配模塊確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所 創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程。
6.如權(quán)利要求5所述的遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,其特征在于,判定模塊具 體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的 內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或 LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所 述線程不是木馬創(chuàng)建的線程。
7.如權(quán)利要求5所述的遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,其特征在于,讀取模塊具體 用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。
8.如權(quán)利要求7所述的遠(yuǎn)程線程注入型木馬的檢測(cè)裝置,其特征在于,內(nèi)存模塊的信 息包括加載到內(nèi)存的地址和模塊大小。
9.一種遠(yuǎn)程線程注入型木馬的處理方法,其特征在于,包括遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊, 讀取內(nèi)存模塊數(shù)據(jù);用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;如果匹配成功,則確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程;終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空間中卸載用木馬 特征匹配成功的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。
10.如權(quán)利要求9所述的遠(yuǎn)程線程注入型木馬的處理方法,其特征在于,遍歷操作系統(tǒng) 中的所有線程、找出可能為木馬創(chuàng)建的線程包括對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所 述線程的入口點(diǎn)在所述線程的父進(jìn)程的內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存 中的LoadLibraryA函數(shù)的加載地址或LoadLibraryW函數(shù)的加載地址相同,則確定所述線 程可能為木馬創(chuàng)建的線程,否則,確定所述線程不是木馬創(chuàng)建的線程。
11.如權(quán)利要求9所述的遠(yuǎn)程線程注入型木馬的處理方法,其特征在于,讀取內(nèi)存模塊 數(shù)據(jù)具體為根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。
12.如權(quán)利要求11所述的遠(yuǎn)程線程注入型木馬的檢測(cè)方法,其特征在于,內(nèi)存模塊的 信息包括加載到內(nèi)存的地址和模塊大小。
13.如權(quán)利要求9所述的遠(yuǎn)程線程注入型木馬的處理方法,其特征在于,刪除該內(nèi)存模 塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪除該內(nèi)存模塊相關(guān)的文件。
14.如權(quán)利要求13所述的遠(yuǎn)程線程注入型木馬的處理方法,其特征在于,內(nèi)存模塊的 信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。
15.一種遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,包括判定模塊,用于遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;讀取模塊,對(duì)于任何一個(gè)可能為木馬創(chuàng)建的線程,遍歷其父進(jìn)程的內(nèi)存空間中的所有 內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);匹配模塊,用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;如果匹配成功,則匹配模塊確定所述可能為木馬創(chuàng)建的線程為遠(yuǎn)程線程注入型木馬所 創(chuàng)建的線程,否則,確定所述可能為木馬創(chuàng)建的線程不是遠(yuǎn)程線程注入型木馬所創(chuàng)建的線 程;處理模塊,用于終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空 間中卸載用木馬特征匹配成功的相應(yīng)的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。
16.如權(quán)利要求15所述的遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,判定模塊具 體用于對(duì)于操作系統(tǒng)中的任何一個(gè)線程,查詢所述線程的入口點(diǎn)在所述線程的父進(jìn)程的 內(nèi)存空間中的線性地址,如果所述線性地址與內(nèi)存中的LoadLibraryA函數(shù)的加載地址或 LoadLibraryW函數(shù)的加載地址相同,則確定所述線程可能為木馬創(chuàng)建的線程,否則,確定所 述線程不是木馬創(chuàng)建的線程。
17.如權(quán)利要求15所述的遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,讀取模塊具 體用于根據(jù)內(nèi)存模塊的信息,讀取內(nèi)存模塊數(shù)據(jù)。
18.如權(quán)利要求17所述的遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,內(nèi)存模塊的 信息包括加載到內(nèi)存的地址和模塊大小。
19.如權(quán)利要求15所述的遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,處理模塊刪 除該內(nèi)存模塊相關(guān)的文件具體為根據(jù)內(nèi)存模塊的信息,刪除該內(nèi)存模塊相關(guān)的文件。
20.如權(quán)利要求19所述的遠(yuǎn)程線程注入型木馬的處理裝置,其特征在于,內(nèi)存模塊的 信息包括與所述內(nèi)存模塊相關(guān)的文件的路徑和名稱。
全文摘要
本發(fā)明公開(kāi)了一種遠(yuǎn)程線程注入型木馬的檢測(cè)方法和處理方法,包括遍歷操作系統(tǒng)中的所有線程,找出可能為木馬創(chuàng)建的線程;遍歷該線程的父進(jìn)程的內(nèi)存空間中的所有內(nèi)存模塊,讀取內(nèi)存模塊數(shù)據(jù);用木馬特征對(duì)內(nèi)存模塊數(shù)據(jù)進(jìn)行特征匹配;終止遠(yuǎn)程線程注入型木馬所創(chuàng)建的線程,從該線程的父進(jìn)程的內(nèi)存空間中卸載用木馬特征匹配成功的內(nèi)存模塊,刪除該內(nèi)存模塊相關(guān)的文件。本發(fā)明還公開(kāi)了一種遠(yuǎn)程線程注入型木馬的檢測(cè)裝置和處理裝置,包括判斷模塊,讀取模塊,匹配模塊,處理模塊。本發(fā)明可以對(duì)操作系統(tǒng)中存在的遠(yuǎn)程線程注入型木馬進(jìn)行快速、準(zhǔn)確、徹底地檢測(cè),并將其查殺清除而不需要重新啟動(dòng)計(jì)算機(jī)、不影響系統(tǒng)的正常運(yùn)行。
文檔編號(hào)G06F21/00GK102004882SQ201010561259
公開(kāi)日2011年4月6日 申請(qǐng)日期2010年11月26日 優(yōu)先權(quán)日2010年11月26日
發(fā)明者尹尚書(shū), 李偉, 李柏松, 肖梓航 申請(qǐng)人:北京安天電子設(shè)備有限公司