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