本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種線程的保護(hù)方法、裝置及電子設(shè)備。
背景技術(shù):
隨著互聯(lián)網(wǎng)技術(shù)發(fā)展,病毒,木馬等惡意程序技術(shù)層出不窮。有的惡意軟件為了自身存活,利用各種惡意手段對(duì)殺毒軟件進(jìn)行攻擊,例如結(jié)束或暫停殺毒軟件的進(jìn)程,刪除殺毒軟件安裝目錄下的文件等。其中,有一種方法是暫停殺毒軟件進(jìn)程中的所有線程,暫停所有線程會(huì)導(dǎo)致進(jìn)程處于不工作狀態(tài),相當(dāng)于結(jié)束了殺毒軟件的進(jìn)程。相關(guān)技術(shù)中,可通過(guò)掛鉤一個(gè)內(nèi)核函數(shù),或者掛鉤發(fā)送通信函數(shù)來(lái)實(shí)現(xiàn)保護(hù)對(duì)應(yīng)的進(jìn)程。但是,上述方法無(wú)法保護(hù)惡意程序結(jié)束殺毒軟件的線程。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明旨在至少在一定程度上解決相關(guān)技術(shù)中的技術(shù)問(wèn)題之一。為此,本發(fā)明的第一個(gè)目的在于提出一種線程的保護(hù)方法,該方法能夠防止惡意程序暫停殺毒軟件的所有線程,從而保證系統(tǒng)信息安全。
本發(fā)明的第二個(gè)目的在于提出一種線程的保護(hù)裝置。
本發(fā)明的第三個(gè)目的在于提出一種電子設(shè)備。
為實(shí)現(xiàn)上述目的,本發(fā)明第一方面實(shí)施例提出了一種線程的保護(hù)方法,包括以下步驟:監(jiān)控目標(biāo)線程是否接收到暫停指令;當(dāng)確定所述目標(biāo)線程接收到所述暫停指令時(shí),利用鉤子函數(shù)掛鉤與所述目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù);判斷所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下;如果所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在所述預(yù)設(shè)目錄下,則執(zhí)行對(duì)所述目標(biāo)線程的保護(hù)操作。
可選的,利用鉤子函數(shù)掛鉤與所述目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù),包括:從系統(tǒng)服務(wù)描述符表SSDT中查找所述預(yù)設(shè)函數(shù)的地址;建立所述鉤子函數(shù),并將所述鉤子函數(shù)的地址設(shè)置為所述預(yù)設(shè)函數(shù)的地址,以掛鉤所述預(yù)設(shè)函數(shù)。
可選的,判斷所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下,包括:獲取所述目標(biāo)線程的線程句柄;根據(jù)所述線程句柄獲取所述目標(biāo)進(jìn)程的進(jìn)程句柄;根據(jù)所述進(jìn)程句柄獲取所述進(jìn)程路徑;判斷所述進(jìn)程路徑是否在預(yù)設(shè)目錄下。
可選的,根據(jù)所述線程句柄獲取所述目標(biāo)進(jìn)程的進(jìn)程句柄,包括:根據(jù)所述線程句柄獲取所述目標(biāo)線程的線程體結(jié)構(gòu)地址;根據(jù)所述線程體結(jié)構(gòu)地址獲取所述目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu);根據(jù)所述進(jìn)程體結(jié)構(gòu)獲取所述進(jìn)程句柄。
可選的,執(zhí)行對(duì)所述目標(biāo)線程的保護(hù)操作,包括:利用所述鉤子函數(shù)向所述暫停指令的發(fā)起主體返回拒絕狀態(tài);或者利用所述鉤子函數(shù)向所述暫停指令的發(fā)起主體返回暫停成功的假狀態(tài);或者利用所述鉤子函數(shù)執(zhí)行所述預(yù)設(shè)函數(shù),暫停所述目標(biāo)線程,并在向所述暫停指令的發(fā)起主體返回暫停成功狀態(tài)之后,恢復(fù)所述目標(biāo)線程。
為實(shí)現(xiàn)上述目的,本發(fā)明第二方面實(shí)施例提出了一種線程的保護(hù)裝置,包括:監(jiān)控模塊,用于監(jiān)控目標(biāo)線程是否接收到暫停指令;掛鉤模塊,用于當(dāng)確定所述目標(biāo)線程接收到所述暫停指令時(shí),利用鉤子函數(shù)掛鉤與所述目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù);判斷模塊,用于判斷所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下;執(zhí)行模塊,用于如果所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在所述預(yù)設(shè)目錄下,則執(zhí)行對(duì)所述目標(biāo)線程的保護(hù)操作。
可選的,所述掛鉤模塊,包括:查找子模塊,用于從系統(tǒng)服務(wù)描述符表SSDT中查找所述預(yù)設(shè)函數(shù)的地址;建立子模塊,用于建立所述鉤子函數(shù),并將所述鉤子函數(shù)的地址設(shè)置為所述預(yù)設(shè)函數(shù)的地址,以掛鉤所述預(yù)設(shè)函數(shù)。
可選的,所述判斷模塊,包括:第一獲取子模塊,用于獲取所述目標(biāo)線程的線程句柄;第二獲取子模塊,用于獲取根據(jù)所述線程句柄獲取所述目標(biāo)進(jìn)程的進(jìn)程句柄;第三獲取子模塊,用于獲取根據(jù)所述進(jìn)程句柄獲取所述進(jìn)程路徑;判斷子模塊,用于判斷所述進(jìn)程路徑是否在預(yù)設(shè)目錄下。
可選的,所述第二獲取子模塊,用于:根據(jù)所述線程句柄獲取所述目標(biāo)線程的線程體結(jié)構(gòu)地址;根據(jù)所述線程體結(jié)構(gòu)地址獲取所述目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu);根據(jù)所述進(jìn)程體結(jié)構(gòu)獲取所述進(jìn)程句柄。
可選的,所述執(zhí)行模塊,用于:利用所述鉤子函數(shù)向所述暫停指令的發(fā)起主體返回拒絕狀態(tài);或者利用所述鉤子函數(shù)向所述暫停指令的發(fā)起主體返回暫停成功的假狀態(tài);或者利用所述鉤子函數(shù)執(zhí)行所述預(yù)設(shè)函數(shù),暫停所述目標(biāo)線程,并在向所述暫停指令的發(fā)起主體返回暫停成功狀態(tài)之后,恢復(fù)所述目標(biāo)線程。
為實(shí)現(xiàn)上述目的,本發(fā)明第三方面實(shí)施例提出了一種電子設(shè)備,該電子設(shè)備包括處理器、存儲(chǔ)器、通信接口和總線;所述處理器、所述存儲(chǔ)器和所述通信接口通過(guò)所述總線連接并完成相互間的通信;所述存儲(chǔ)器存儲(chǔ)可執(zhí)行程序代碼;所述處理器通過(guò)讀取所述存儲(chǔ)器中存儲(chǔ)的可執(zhí)行程序代碼來(lái)運(yùn)行與所述可執(zhí)行程序代碼對(duì)應(yīng)的程序,以用于執(zhí)行以下步驟:
監(jiān)控目標(biāo)線程是否接收到暫停指令;
當(dāng)確定所述目標(biāo)線程接收到所述暫停指令時(shí),利用鉤子函數(shù)掛鉤與所述目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù);
判斷所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下;
如果所述目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在所述預(yù)設(shè)目錄下,則執(zhí)行對(duì)所述目標(biāo)線程的保護(hù)操作。
為實(shí)現(xiàn)上述目的,本發(fā)明第四方面實(shí)施例提出了一種存儲(chǔ)介質(zhì),其中,所述存儲(chǔ)介質(zhì)用于存儲(chǔ)應(yīng)用程序,所述應(yīng)用程序用于在運(yùn)行時(shí)執(zhí)行本發(fā)明所述的一種線程的保護(hù)方法。
為實(shí)現(xiàn)上述目的,本發(fā)明第五方面實(shí)施例提出了一種應(yīng)用程序,其中,所述應(yīng)用程序用于在運(yùn)行時(shí)執(zhí)行本發(fā)明所述的一種線程的保護(hù)方法。
在本發(fā)明中,通過(guò)鉤子函數(shù)掛鉤惡意程序暫停目標(biāo)線程時(shí)需要調(diào)用的預(yù)設(shè)函數(shù),在監(jiān)控到有惡意程序暫停目標(biāo)線程時(shí),對(duì)目標(biāo)線程進(jìn)行保護(hù),防止惡意程序暫停殺毒軟件的所有線程,從而保證系統(tǒng)信息安全。
本發(fā)明附加的方面和優(yōu)點(diǎn)將在下面的描述中部分給出,部分將從下面的描述中變得明顯,或通過(guò)本發(fā)明的實(shí)踐了解到。
附圖說(shuō)明
圖1是根據(jù)本發(fā)明一個(gè)實(shí)施例的線程的保護(hù)方法的流程圖;
圖2是根據(jù)本發(fā)明一個(gè)實(shí)施例的線程的保護(hù)裝置的結(jié)構(gòu)示意圖;
圖3是根據(jù)本發(fā)明一個(gè)實(shí)施例的電子設(shè)備的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類(lèi)似的標(biāo)號(hào)表示相同或類(lèi)似的元件或具有相同或類(lèi)似功能的元件。下面通過(guò)參考附圖描述的實(shí)施例是示例性的,旨在用于解釋本發(fā)明,而不能理解為對(duì)本發(fā)明的限制。
下面參考附圖描述本發(fā)明實(shí)施例的線程的保護(hù)方法、裝置及電子設(shè)備。
圖1是根據(jù)本發(fā)明一個(gè)實(shí)施例的線程的保護(hù)方法的流程圖,如圖1所示,該方法包括:
S101、監(jiān)控目標(biāo)線程是否接收到暫停指令。
首先,先介紹下惡意程序暫停目標(biāo)線程的過(guò)程。惡意程序可先在應(yīng)用層調(diào)用SuspendThread函數(shù),然后調(diào)用ZwSuspendThread函數(shù),進(jìn)而在內(nèi)核層調(diào)用NtSuspendThread函數(shù),最終通過(guò)系統(tǒng)暫停目標(biāo)線程。在本實(shí)施例中,目標(biāo)線程主要是殺毒軟件的線程。系統(tǒng)為即操作系統(tǒng),如WINDOWS。
因此,若要防止惡意程序暫停目標(biāo)線程,需要對(duì)目標(biāo)線程進(jìn)行監(jiān)控,監(jiān)控其是否接收到來(lái)自惡意程序的暫停指令。
S102、當(dāng)確定目標(biāo)線程接收到暫停指令時(shí),利用鉤子函數(shù)掛鉤與目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù)。
具體地,可從SSDT(System Services Descriptor Table,系統(tǒng)服務(wù)描述符表)中查找預(yù)設(shè)函數(shù)的地址。然后建立鉤子函數(shù),并將鉤子函數(shù)的地址設(shè)置為預(yù)設(shè)函數(shù)的地址,以掛鉤預(yù)設(shè)函數(shù)。舉例來(lái)說(shuō),可從SSDT中查找到函數(shù)NtSuspendThread的地址,并保存該地址。然后,建立一個(gè)鉤子函數(shù)NewNtSuspendThread,將鉤子函數(shù)的地址替換為函數(shù)NtSuspendThread的地址,從而實(shí)現(xiàn)對(duì)函數(shù)NtSuspendThread的掛鉤。
S103、判斷目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下。
在利用鉤子函數(shù)掛鉤與目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù)之后,可判斷目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下。
具體地,可獲取目標(biāo)線程的線程句柄,并根據(jù)線程句柄獲取目標(biāo)進(jìn)程的進(jìn)程句柄。然后根據(jù)進(jìn)程句柄獲取進(jìn)程路徑,最后判斷進(jìn)程路徑是否在預(yù)設(shè)目錄下。
在本實(shí)施例中,預(yù)設(shè)目錄為殺毒軟件的安裝目錄。如果進(jìn)程路徑在預(yù)設(shè)目錄下,則說(shuō)明惡意程序暫停的是殺毒軟件的線程;如果進(jìn)程路徑不在預(yù)設(shè)目錄下,則說(shuō)明暫停的并非殺毒軟件的線程。
其中,根據(jù)線程句柄獲取目標(biāo)進(jìn)程的進(jìn)程句柄,還可進(jìn)一步包括以下步驟:
首先,根據(jù)線程句柄獲取目標(biāo)線程的線程體結(jié)構(gòu)地址,再根據(jù)線程體結(jié)構(gòu)地址獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu),然后根據(jù)進(jìn)程體結(jié)構(gòu)獲取進(jìn)程句柄。
舉例來(lái)說(shuō),線程句柄是線程的標(biāo)識(shí),根據(jù)該標(biāo)識(shí)鉤子函數(shù)對(duì)目標(biāo)線程進(jìn)行操作。具體地,可將線程句柄作為參數(shù),調(diào)用內(nèi)核函數(shù)ObReferenceObjectByHandle,從而獲取線程體結(jié)構(gòu)地址。其中,線程體結(jié)構(gòu)是保存線程所有數(shù)據(jù)的一個(gè)結(jié)構(gòu)。將線程體結(jié)構(gòu)地址作為參數(shù),調(diào)用函數(shù)IoThreadToProcess以獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu)。然后,由進(jìn)程體結(jié)構(gòu)調(diào)用ObOpenObjectByPointer獲取進(jìn)程句柄。再根據(jù)進(jìn)程句柄調(diào)用函數(shù)ZwQueryInformationProcess,從而查詢(xún)到目標(biāo)線程所在的進(jìn)程路徑。然后可判斷該進(jìn)程路徑是否在殺毒軟件的安裝目錄下。
S104、如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在預(yù)設(shè)目錄下,則執(zhí)行對(duì)目標(biāo)線程的保護(hù)操作。
在本實(shí)施例中,殺毒軟件可執(zhí)行對(duì)目標(biāo)進(jìn)程的保護(hù)操作,即攔截惡意程序的暫停操作。具體地,可包括以下幾個(gè)方式:
第一個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回拒絕狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)拒絕訪問(wèn)的狀態(tài)。如此做,可拒絕執(zhí)行原有的函數(shù)NtSuspendThread,從而使得系統(tǒng)無(wú)需接收到暫停線程的指令,達(dá)到攔截的目的。
第二個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回暫停成功的假狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)暫停成功的假狀態(tài),使得惡意程序接收到的返回值是暫停成功的假狀態(tài),但實(shí)質(zhì)上并未執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。
第三個(gè)方式:利用鉤子函數(shù)執(zhí)行預(yù)設(shè)函數(shù),暫停目標(biāo)線程,并在向暫停指令的發(fā)起主體返回暫停成功狀態(tài)之后,恢復(fù)目標(biāo)線程。例如:利用鉤子函數(shù)NewNtSuspendThread執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。暫停成功后,再調(diào)用一個(gè)函數(shù)NtResumeThread把已暫停的目標(biāo)線程恢復(fù)運(yùn)行。這樣,可使惡意程序認(rèn)為目標(biāo)線程已經(jīng)暫停成功,從而達(dá)到攔截的效果。
當(dāng)然,如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑不在預(yù)設(shè)目錄下,則可直接執(zhí)行對(duì)目標(biāo)線程的暫停操作。
本發(fā)明實(shí)施例的線程的保護(hù)方法,通過(guò)鉤子函數(shù)掛鉤惡意程序暫停目標(biāo)線程時(shí)需要調(diào)用的預(yù)設(shè)函數(shù),在監(jiān)控到有惡意程序暫停目標(biāo)線程時(shí),對(duì)目標(biāo)線程進(jìn)行保護(hù),防止惡意程序暫停殺毒軟件的所有線程,從而保證系統(tǒng)信息安全。
為了實(shí)現(xiàn)上述實(shí)施例,本發(fā)明還提出一種線程的保護(hù)裝置。
圖2是根據(jù)本發(fā)明一個(gè)實(shí)施例的線程的保護(hù)裝置的結(jié)構(gòu)示意圖。
如圖2所示,該裝置包括:監(jiān)控模塊110、掛鉤模塊120、判斷模塊130和執(zhí)行模塊140。
監(jiān)控模塊110用于監(jiān)控目標(biāo)線程是否接收到暫停指令。
首先,先介紹下惡意程序暫停目標(biāo)線程的過(guò)程。惡意程序可先在應(yīng)用層調(diào)用SuspendThread函數(shù),然后調(diào)用ZwSuspendThread函數(shù),進(jìn)而在內(nèi)核層調(diào)用NtSuspendThread函數(shù),最終通過(guò)系統(tǒng)暫停目標(biāo)線程。在本實(shí)施例中,目標(biāo)線程主要是殺毒軟件的線程。系統(tǒng)為即操作系統(tǒng),如WINDOWS。
因此,若要防止惡意程序暫停目標(biāo)線程,需要對(duì)目標(biāo)線程進(jìn)行監(jiān)控,監(jiān)控其是否接收到來(lái)自惡意程序的暫停指令。
掛鉤模塊120用于當(dāng)確定目標(biāo)線程接收到暫停指令時(shí),利用鉤子函數(shù)掛鉤與目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù)。
其中,掛鉤模塊120可包括查找子模塊121和建立子模塊122。
具體地,查找子模塊121可從SSDT(System Services Descriptor Table,系統(tǒng)服務(wù)描述符表)中查找預(yù)設(shè)函數(shù)的地址。然后建立子模塊122建立鉤子函數(shù),并將鉤子函數(shù)的地址設(shè)置為預(yù)設(shè)函數(shù)的地址,以掛鉤預(yù)設(shè)函數(shù)。舉例來(lái)說(shuō),可從SSDT中查找到函數(shù)NtSuspendThread的地址,并保存該地址。然后,建立一個(gè)鉤子函數(shù)NewNtSuspendThread,將鉤子函數(shù)的地址替換為函數(shù)NtSuspendThread的地址,從而實(shí)現(xiàn)對(duì)函數(shù)NtSuspendThread的掛鉤。
判斷模塊130用于判斷目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下。
判斷模塊130可包括第一獲取子模塊131、第二獲取子模塊132、第三獲取子模塊133和判斷子模塊134。
具體地,第一獲取子模塊131可獲取目標(biāo)線程的線程句柄,第二獲取子模塊132根據(jù)線程句柄獲取目標(biāo)進(jìn)程的進(jìn)程句柄。然后第三獲取子模塊133根據(jù)進(jìn)程句柄獲取進(jìn)程路徑,最后判斷子模塊134判斷進(jìn)程路徑是否在預(yù)設(shè)目錄下。
更具體地,第二獲取子模塊132可根據(jù)線程句柄獲取目標(biāo)線程的線程體結(jié)構(gòu)地址,再根據(jù)線程體結(jié)構(gòu)地址獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu),然后根據(jù)進(jìn)程體結(jié)構(gòu)獲取進(jìn)程句柄。
在本實(shí)施例中,預(yù)設(shè)目錄為殺毒軟件的安裝目錄。如果進(jìn)程路徑在預(yù)設(shè)目錄下,則說(shuō)明惡意程序暫停的是殺毒軟件的線程;如果進(jìn)程路徑不在預(yù)設(shè)目錄下,則說(shuō)明暫停的并非殺毒軟件的線程。
舉例來(lái)說(shuō),線程句柄是線程的標(biāo)識(shí),根據(jù)該標(biāo)識(shí)鉤子函數(shù)對(duì)目標(biāo)線程進(jìn)行操作。具體地,可將線程句柄作為參數(shù),調(diào)用內(nèi)核函數(shù)ObReferenceObjectByHandle,從而獲取線程體結(jié)構(gòu)地址。其中,線程體結(jié)構(gòu)是保存線程所有數(shù)據(jù)的一個(gè)結(jié)構(gòu)。將線程體結(jié)構(gòu)地址作為參數(shù),調(diào)用函數(shù)IoThreadToProcess以獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu)。然后,由進(jìn)程體結(jié)構(gòu)調(diào)用ObOpenObjectByPointer獲取進(jìn)程句柄。再根據(jù)進(jìn)程句柄調(diào)用函數(shù)ZwQueryInformationProcess,從而查詢(xún)到目標(biāo)線程所在的進(jìn)程路徑。然后可判斷該進(jìn)程路徑是否在殺毒軟件的安裝目錄下。
執(zhí)行模塊140用于如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在預(yù)設(shè)目錄下,則執(zhí)行對(duì)目標(biāo)線程的保護(hù)操作。在本實(shí)施例中,執(zhí)行模塊140可執(zhí)行對(duì)目標(biāo)進(jìn)程的保護(hù)操作,即攔截惡意程序的暫停操作。具體地,可包括以下幾個(gè)方式:
第一個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回拒絕狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)拒絕訪問(wèn)的狀態(tài)。如此做,可拒絕執(zhí)行原有的函數(shù)NtSuspendThread,從而使得系統(tǒng)無(wú)需接收到暫停線程的指令,達(dá)到攔截的目的。
第二個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回暫停成功的假狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)暫停成功的假狀態(tài),使得惡意程序接收到的返回值是暫停成功的假狀態(tài),但實(shí)質(zhì)上并未執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。
第三個(gè)方式:利用鉤子函數(shù)執(zhí)行預(yù)設(shè)函數(shù),暫停目標(biāo)線程,并在向暫停指令的發(fā)起主體返回暫停成功狀態(tài)之后,恢復(fù)目標(biāo)線程。例如:利用鉤子函數(shù)NewNtSuspendThread執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。暫停成功后,再調(diào)用一個(gè)函數(shù)NtResumeThread把已暫停的目標(biāo)線程恢復(fù)運(yùn)行。這樣,可使惡意程序認(rèn)為目標(biāo)線程已經(jīng)暫停成功,從而達(dá)到攔截的效果。
當(dāng)然,如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑不在預(yù)設(shè)目錄下,則可直接執(zhí)行對(duì)目標(biāo)線程的暫停操作。
本發(fā)明實(shí)施例的線程的保護(hù)裝置,通過(guò)鉤子函數(shù)掛鉤惡意程序暫停目標(biāo)線程時(shí)需要調(diào)用的預(yù)設(shè)函數(shù),在監(jiān)控到有惡意程序暫停目標(biāo)線程時(shí),對(duì)目標(biāo)線程進(jìn)行保護(hù),防止惡意程序暫停殺毒軟件的所有線程,從而保證系統(tǒng)信息安全。
為了實(shí)現(xiàn)上述實(shí)施例,本發(fā)明還提出一種電子設(shè)備。
圖3是根據(jù)本發(fā)明一個(gè)實(shí)施例的電子設(shè)備的結(jié)構(gòu)示意圖。
如圖3所示,該電子設(shè)備包括處理器31、存儲(chǔ)器32、通信接口33和總線34,其中:處理器31、存儲(chǔ)器32和通信接口33通過(guò)總線34連接并完成相互間的通信;存儲(chǔ)器32存儲(chǔ)可執(zhí)行程序代碼;處理器31通過(guò)讀取存儲(chǔ)器32中存儲(chǔ)的可執(zhí)行程序代碼來(lái)運(yùn)行與可執(zhí)行程序代碼對(duì)應(yīng)的程序,以用于執(zhí)行以下步驟:
S101’、監(jiān)控目標(biāo)線程是否接收到暫停指令。
首先,先介紹下惡意程序暫停目標(biāo)線程的過(guò)程。惡意程序可先在應(yīng)用層調(diào)用SuspendThread函數(shù),然后調(diào)用ZwSuspendThread函數(shù),進(jìn)而在內(nèi)核層調(diào)用NtSuspendThread函數(shù),最終通過(guò)系統(tǒng)暫停目標(biāo)線程。在本實(shí)施例中,目標(biāo)線程主要是殺毒軟件的線程。系統(tǒng)為即操作系統(tǒng),如WINDOWS。
因此,若要防止惡意程序暫停目標(biāo)線程,需要對(duì)目標(biāo)線程進(jìn)行監(jiān)控,監(jiān)控其是否接收到來(lái)自惡意程序的暫停指令。
S102’、當(dāng)確定目標(biāo)線程接收到暫停指令時(shí),利用鉤子函數(shù)掛鉤與目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù)。
具體地,可從SSDT(System Services Descriptor Table,系統(tǒng)服務(wù)描述符表)中查找預(yù)設(shè)函數(shù)的地址。然后建立鉤子函數(shù),并將鉤子函數(shù)的地址設(shè)置為預(yù)設(shè)函數(shù)的地址,以掛鉤預(yù)設(shè)函數(shù)。舉例來(lái)說(shuō),可從SSDT中查找到函數(shù)NtSuspendThread的地址,并保存該地址。然后,建立一個(gè)鉤子函數(shù)NewNtSuspendThread,將鉤子函數(shù)的地址替換為函數(shù)NtSuspendThread的地址,從而實(shí)現(xiàn)對(duì)函數(shù)NtSuspendThread的掛鉤。
S103’、判斷目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下。
在利用鉤子函數(shù)掛鉤與目標(biāo)線程對(duì)應(yīng)的預(yù)設(shè)函數(shù)之后,可判斷目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑是否在預(yù)設(shè)目錄下。
具體地,可獲取目標(biāo)線程的線程句柄,并根據(jù)線程句柄獲取目標(biāo)進(jìn)程的進(jìn)程句柄。然后根據(jù)進(jìn)程句柄獲取進(jìn)程路徑,最后判斷進(jìn)程路徑是否在預(yù)設(shè)目錄下。
在本實(shí)施例中,預(yù)設(shè)目錄為殺毒軟件的安裝目錄。如果進(jìn)程路徑在預(yù)設(shè)目錄下,則說(shuō)明惡意程序暫停的是殺毒軟件的線程;如果進(jìn)程路徑不在預(yù)設(shè)目錄下,則說(shuō)明暫停的并非殺毒軟件的線程。
其中,根據(jù)線程句柄獲取目標(biāo)進(jìn)程的進(jìn)程句柄,還可進(jìn)一步包括以下步驟:
首先,根據(jù)線程句柄獲取目標(biāo)線程的線程體結(jié)構(gòu)地址,再根據(jù)線程體結(jié)構(gòu)地址獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu),然后根據(jù)進(jìn)程體結(jié)構(gòu)獲取進(jìn)程句柄。
舉例來(lái)說(shuō),線程句柄是線程的標(biāo)識(shí),根據(jù)該標(biāo)識(shí)鉤子函數(shù)對(duì)目標(biāo)線程進(jìn)行操作。具體地,可將線程句柄作為參數(shù),調(diào)用內(nèi)核函數(shù)ObReferenceObjectByHandle,從而獲取線程體結(jié)構(gòu)地址。其中,線程體結(jié)構(gòu)是保存線程所有數(shù)據(jù)的一個(gè)結(jié)構(gòu)。將線程體結(jié)構(gòu)地址作為參數(shù),調(diào)用函數(shù)IoThreadToProcess以獲取目標(biāo)線程所在的進(jìn)程體結(jié)構(gòu)。然后,由進(jìn)程體結(jié)構(gòu)調(diào)用ObOpenObjectByPointer獲取進(jìn)程句柄。再根據(jù)進(jìn)程句柄調(diào)用函數(shù)ZwQueryInformationProcess,從而查詢(xún)到目標(biāo)線程所在的進(jìn)程路徑。然后可判斷該進(jìn)程路徑是否在殺毒軟件的安裝目錄下。
S104’、如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑在預(yù)設(shè)目錄下,則執(zhí)行對(duì)目標(biāo)線程的保護(hù)操作。
在本實(shí)施例中,殺毒軟件可執(zhí)行對(duì)目標(biāo)進(jìn)程的保護(hù)操作,即攔截惡意程序的暫停操作。具體地,可包括以下幾個(gè)方式:
第一個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回拒絕狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)拒絕訪問(wèn)的狀態(tài)。如此做,可拒絕執(zhí)行原有的函數(shù)NtSuspendThread,從而使得系統(tǒng)無(wú)需接收到暫停線程的指令,達(dá)到攔截的目的。
第二個(gè)方式:利用鉤子函數(shù)向暫停指令的發(fā)起主體返回暫停成功的假狀態(tài)。例如:利用鉤子函數(shù)NewNtSuspendThread向惡意程序返回一個(gè)暫停成功的假狀態(tài),使得惡意程序接收到的返回值是暫停成功的假狀態(tài),但實(shí)質(zhì)上并未執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。
第三個(gè)方式:利用鉤子函數(shù)執(zhí)行預(yù)設(shè)函數(shù),暫停目標(biāo)線程,并在向暫停指令的發(fā)起主體返回暫停成功狀態(tài)之后,恢復(fù)目標(biāo)線程。例如:利用鉤子函數(shù)NewNtSuspendThread執(zhí)行原有的函數(shù)NtSuspendThread對(duì)目標(biāo)線程進(jìn)行暫停。暫停成功后,再調(diào)用一個(gè)函數(shù)NtResumeThread把已暫停的目標(biāo)線程恢復(fù)運(yùn)行。這樣,可使惡意程序認(rèn)為目標(biāo)線程已經(jīng)暫停成功,從而達(dá)到攔截的效果。
當(dāng)然,如果目標(biāo)線程對(duì)應(yīng)的進(jìn)程路徑不在預(yù)設(shè)目錄下,則可直接執(zhí)行對(duì)目標(biāo)線程的暫停操作。
本發(fā)明實(shí)施例的電子設(shè)備,通過(guò)鉤子函數(shù)掛鉤惡意程序暫停目標(biāo)線程時(shí)需要調(diào)用的預(yù)設(shè)函數(shù),在監(jiān)控到有惡意程序暫停目標(biāo)線程時(shí),對(duì)目標(biāo)線程進(jìn)行保護(hù),防止惡意程序暫停殺毒軟件的所有線程,從而保證系統(tǒng)信息安全。
可以理解的是,該電子設(shè)備以多種形式存在,包括但不限于:
(1)移動(dòng)通信設(shè)備:這類(lèi)設(shè)備的特點(diǎn)是具備移動(dòng)通信功能,并且以提供話音、數(shù)據(jù)通信為主要目標(biāo)。這類(lèi)終端包括:智能手機(jī)(例如iPhone)、多媒體手機(jī)、功能性手機(jī),以及低端手機(jī)等。
(2)超移動(dòng)個(gè)人計(jì)算機(jī)設(shè)備:這類(lèi)設(shè)備屬于個(gè)人計(jì)算機(jī)的范疇,有計(jì)算和處理功能,一般也具備移動(dòng)上網(wǎng)特性。這類(lèi)終端包括:PDA、MID和UMPC設(shè)備等,例如iPad。
(3)便攜式娛樂(lè)設(shè)備:這類(lèi)設(shè)備可以顯示和播放多媒體內(nèi)容。該類(lèi)設(shè)備包括:音頻、視頻播放器(例如iPod),掌上游戲機(jī),電子書(shū),以及智能玩具和便攜式車(chē)載導(dǎo)航設(shè)備。
(4)服務(wù)器:提供計(jì)算服務(wù)的設(shè)備,服務(wù)器的構(gòu)成包括處理器、硬盤(pán)、內(nèi)存、系統(tǒng)總線等,服務(wù)器和通用的計(jì)算機(jī)架構(gòu)類(lèi)似,但是由于需要提供高可靠的服務(wù),因此在處理能力、穩(wěn)定性、可靠性、安全性、可擴(kuò)展性、可管理性等方面要求較高。
(5)其他具有數(shù)據(jù)交互功能的電子裝置。
為實(shí)現(xiàn)上述目的,本發(fā)明還提出一種存儲(chǔ)介質(zhì),其中,存儲(chǔ)介質(zhì)用于存儲(chǔ)應(yīng)用程序,應(yīng)用程序用于在運(yùn)行時(shí)執(zhí)行本發(fā)明的一種線程的保護(hù)方法。
為實(shí)現(xiàn)上述目的,本發(fā)明還提出一種應(yīng)用程序,其中,應(yīng)用程序用于在運(yùn)行時(shí)執(zhí)行本發(fā)明的一種線程的保護(hù)方法。
此外,術(shù)語(yǔ)“第一”、“第二”僅用于描述目的,而不能理解為指示或暗示相對(duì)重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”的特征可以明示或者隱含地包括至少一個(gè)該特征。在本發(fā)明的描述中,“多個(gè)”的含義是至少兩個(gè),例如兩個(gè),三個(gè)等,除非另有明確具體的限定。
在本發(fā)明中,除非另有明確的規(guī)定和限定,術(shù)語(yǔ)“安裝”、“相連”、“連接”、“固定”等術(shù)語(yǔ)應(yīng)做廣義理解,例如,可以是固定連接,也可以是可拆卸連接,或成一體;可以是機(jī)械連接,也可以是電連接;可以是直接相連,也可以通過(guò)中間媒介間接相連,可以是兩個(gè)元件內(nèi)部的連通或兩個(gè)元件的相互作用關(guān)系,除非另有明確的限定。對(duì)于本領(lǐng)域的普通技術(shù)人員而言,可以根據(jù)具體情況理解上述術(shù)語(yǔ)在本發(fā)明中的具體含義。
在本說(shuō)明書(shū)的描述中,參考術(shù)語(yǔ)“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個(gè)實(shí)施例或示例中。在本說(shuō)明書(shū)中,對(duì)上述術(shù)語(yǔ)的示意性表述不必須針對(duì)的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。此外,在不相互矛盾的情況下,本領(lǐng)域的技術(shù)人員可以將本說(shuō)明書(shū)中描述的不同實(shí)施例或示例以及不同實(shí)施例或示例的特征進(jìn)行結(jié)合和組合。
盡管上面已經(jīng)示出和描述了本發(fā)明的實(shí)施例,可以理解的是,上述實(shí)施例是示例性的,不能理解為對(duì)本發(fā)明的限制,本領(lǐng)域的普通技術(shù)人員在本發(fā)明的范圍內(nèi)可以對(duì)上述實(shí)施例進(jìn)行變化、修改、替換和變型。