專利名稱:對象保護(hù)方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)領(lǐng)域,特別涉及一種對象保護(hù)方法及裝置。
背景技術(shù):
進(jìn)程是一個可執(zhí)行的程序在計(jì)算機(jī)上一次運(yùn)行的過程,它是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個獨(dú)立單位。在進(jìn)程的運(yùn)行過程中,有可能會受到惡意攻擊,使得打開的進(jìn)程被惡意寫入、掛起或者關(guān)閉,因此,需要對進(jìn)程進(jìn)行保護(hù),以避免應(yīng)用程序有時甚至是系統(tǒng)遭到 破壞。現(xiàn)有技術(shù)中米用HOOK SSDT(System Services Descriptor Table,系統(tǒng)服務(wù)描述符表)技術(shù)對進(jìn)程進(jìn)行保護(hù)。SSDT中保存有一個龐大的地址索引表,以及一些其它有用的信息,如地址索引的基地址,服務(wù)函數(shù)個數(shù)等。SSDT的功能是把ring3的Win32API (Application Programming Interface,應(yīng)用程序接口 )和 ringO 的內(nèi)核 API 聯(lián)系起來。Ring是windows進(jìn)行訪問控制的級別,分為4層ring0、ringl、ring2和ring3。其中,操作系統(tǒng)工作在ringO層,可以訪問所有層的數(shù)據(jù),不受系統(tǒng)的限制;應(yīng)用程序工作在ring3層,只能訪問本層的數(shù)據(jù),受系統(tǒng)的限制。H00K鉤子函數(shù)是windows消息處理機(jī)制的一部分,通過設(shè)置鉤子可以對系統(tǒng)的消息或事件等進(jìn)行監(jiān)控以及過濾。HOOK SSDT技術(shù)是指在SSDT中對進(jìn)程相關(guān)的表項(xiàng)設(shè)置鉤子,以便于對進(jìn)程進(jìn)行保護(hù)。但是現(xiàn)有的HOOK SSDT技術(shù)受CPU (Central Processing Unit,中央處理器)處理能力的限制,只能應(yīng)用于windows 32位系統(tǒng),即CPU GPRs(General-Purpose Registers,通用寄存器)的數(shù)據(jù)寬度只能為32位,處理器一次只能運(yùn)行32bit數(shù)據(jù)。如果將HOOK SSDT技術(shù)應(yīng)用于windows 64位系統(tǒng),則進(jìn)程的監(jiān)控會被認(rèn)為是惡意修改而導(dǎo)致藍(lán)屏,從而無法實(shí)現(xiàn)對進(jìn)程的保護(hù)。
發(fā)明內(nèi)容
本發(fā)明實(shí)施例提供了一種對象保護(hù)方法及裝置,以解決現(xiàn)有技術(shù)在WindOWS64位系統(tǒng)中無法實(shí)現(xiàn)對象保護(hù)的問題。一種對象保護(hù)方法,所述方法包括當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的所述第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第一過濾函數(shù),所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù);當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或所述第二函數(shù)中的鉤子所建立的所述第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第二過濾函數(shù),所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。所述方法還包括預(yù)先通過注冊對象回調(diào)函數(shù)建立所述第一函數(shù)與所述第一過濾函數(shù)的關(guān)聯(lián)。所述方法還包括
預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表ShadowSSDT的基地址;
搜尋所述win32k. sys中任一函數(shù)邊界的空操作NOP指令,用轉(zhuǎn)移Jmp指令代替所述NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為所述第二過濾函數(shù)的地址;對所述Jmp指令的地址相對于所述win32k. sys的偏移值進(jìn)行左移4位,再加上所述第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值;根據(jù)所述Shadow SSDT的基地址,在所述Shadow SSDT中用所述數(shù)值替換與所述第二函數(shù)對應(yīng)的表項(xiàng),建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。所述方法還包括預(yù)先將所述第二函數(shù)中的起始指令替換為目標(biāo)地址為所述第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。所述第一過濾函數(shù)執(zhí)行對所述對象的保護(hù),包括所述第一過濾函數(shù)判斷所述非窗口對象是否為被保護(hù)的進(jìn)程或線程;如果是,則清除所述進(jìn)程或線程的危險權(quán)限。所述第二過濾函數(shù)執(zhí)行對所述對象的保護(hù),包括所述第二過濾函數(shù)判斷所述窗口對象是否為被保護(hù)的窗口 ;如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。一種對象保護(hù)裝置,所述裝置包括第一處理模塊,用于當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的所述第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第一過濾函數(shù),所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù);第二處理模塊,用于當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或所述第二函數(shù)中的鉤子所建立的所述第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第二過濾函數(shù),所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。所述裝置還包括第一建立模塊,用于預(yù)先通過注冊對象回調(diào)函數(shù)建立所述第一函數(shù)與所述第一過濾函數(shù)的關(guān)聯(lián)。所述裝置還包括第二建立模塊,用于預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表Shadow SSDT的基地址;搜尋所述win32k. sys中任一函數(shù)邊界的空操作NOP指令;用轉(zhuǎn)移Jmp指令代替所述NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為所述第二過濾函數(shù)的地址;對所述轉(zhuǎn)移指令的地址相對于所述win32k. sys的偏移值進(jìn)行左移4位,再加上所述第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值;根據(jù)所述Shadow SSDT的基地址,在所述Shadow SSDT中用所述數(shù)值替換與所述第二函數(shù)對應(yīng)的表項(xiàng),建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。所述裝置還包括第三建立模塊,用于預(yù)先將所述第二函數(shù)中的起始指令替換為目標(biāo)地址為所述第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。所述第一處理模塊用于所述第一過濾函數(shù)判斷所述非窗口對象是否為被保護(hù)的進(jìn)程或線程,如果是,則清除所述進(jìn)程或線程的危險權(quán)限。所述第二處理模塊用于所述第二過濾函數(shù)判斷所述窗口對象是否為被保護(hù)的窗口,如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。本發(fā)明實(shí)施例提供的上述技術(shù)方案,通過注冊對象回調(diào)函數(shù)關(guān)聯(lián)第一函數(shù)與第一過濾函數(shù),實(shí)現(xiàn)對非窗口對象的保護(hù),通過多用戶管理驅(qū)動文件中的鉤子或第二函數(shù)中的鉤子關(guān)聯(lián)第二函數(shù)與第二過濾函數(shù),實(shí)現(xiàn)對窗口對象的保護(hù),解決了 windows 64位系統(tǒng)上無法實(shí)現(xiàn)對象保護(hù)的問題,達(dá)到了 windows 64位系統(tǒng)上對象保護(hù)的效果。
圖I是本發(fā)明實(shí)施例I提供的對象保護(hù)方法流程圖;圖2是本發(fā)明實(shí)施例2提供的對象保護(hù)方法流程圖;圖3是本發(fā)明實(shí)施例3提供的對象保護(hù)裝置一種結(jié)構(gòu)圖;圖4是本發(fā)明實(shí)施例3提供的對象保護(hù)裝置另一種結(jié)構(gòu)圖。
具體實(shí)施例方式為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明實(shí)施方式作進(jìn)一步地詳細(xì)描述。實(shí)施例I參見圖1,本實(shí)施例提供了一種對象保護(hù)方法,包括101 :當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第一過濾函數(shù),第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù);102:當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或第二函數(shù)中的鉤子所建立的第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第二過濾函數(shù),第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。可選地,上述方法還包括預(yù)先通過注冊對象回調(diào)函數(shù)建立第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián)??蛇x地,上述方法還包括預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表ShadowSSDT的基地址;搜尋win32k. sys中任一函數(shù)邊界的空操作NOP指令;用轉(zhuǎn)移Jmp指令代替該NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為所述第二過濾函數(shù)的地址;對所述轉(zhuǎn)移指令的地址相對于win32k. sys的偏移值進(jìn)行左移4位,再加上第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值;根據(jù)Shadow SSDT的基地址,在Shadow SSDT中用所述數(shù)值替換與第二函數(shù)對應(yīng)的表項(xiàng),建立第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián)??蛇x地,上述方法還包括預(yù)先將第二函數(shù)中的起始指令替換為目標(biāo)地址為第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián)??蛇x地,第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù),包括第一過濾函數(shù)判斷所述非窗口對象是否為被保護(hù)的進(jìn)程或線程;如果是,則清除所述進(jìn)程或線程的危險權(quán)限??蛇x地,第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù),包括第二過濾函數(shù)判斷所述窗口對象是否為被保護(hù)的窗口 ;如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。、本實(shí)施例提供的上述方法,通過注冊對象回調(diào)函數(shù)關(guān)聯(lián)第一函數(shù)與第一過濾函數(shù),實(shí)現(xiàn)對非窗口對象的保護(hù),通過多用戶管理驅(qū)動文件中的鉤子或第二函數(shù)中的鉤子關(guān)聯(lián)第二函數(shù)與第二過濾函數(shù),實(shí)現(xiàn)對窗口對象的保護(hù),解決了 windows 64位系統(tǒng)上無法實(shí)現(xiàn)對象保護(hù)的問題,達(dá)到了 windows 64位系統(tǒng)上對象保護(hù)的效果。實(shí)施例2參見圖2,本實(shí)施例提供了一種對象保護(hù)方法,包括201 :預(yù)先通過注冊對象回調(diào)函數(shù)建立非窗口對象的第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián);其中,非窗口對象包括但不限于進(jìn)程或線程,第一函數(shù)是指非窗口對象的被保護(hù)函數(shù),包括NtOpenProcess創(chuàng)建進(jìn)程函數(shù)或NtOpenThread創(chuàng)建線程函數(shù),第一過濾函數(shù)為自定義的對該非窗口對象進(jìn)行過濾保護(hù)的函數(shù),該過濾保護(hù)包括清除該對象的危險權(quán)限。注冊對象回調(diào)ObRegisterCallbacks函數(shù)為windows系統(tǒng)提供的標(biāo)準(zhǔn)API函數(shù),用于為調(diào)用者提供可以調(diào)用自定義函數(shù)的接口,以方便調(diào)用者在某些條件下調(diào)用該自定義函數(shù)。本步驟中,該某些條件是指所述對象的被保護(hù)函數(shù)被調(diào)用,因此,可以在注冊對象回調(diào)函數(shù)的參數(shù)中設(shè)置第一過濾函數(shù)的入口地址,以及所述對象的被保護(hù)函數(shù),如NtOpenProcess或NtOpenThread,從而在系統(tǒng)驅(qū)動程序加載時就將對象的被保護(hù)函數(shù)與第一過濾函數(shù)關(guān)聯(lián)起來。一旦該對象的被保護(hù)函數(shù)被調(diào)用,則根據(jù)該關(guān)聯(lián)會自動按照上述入口地址找到第一過濾函數(shù)并執(zhí)行該第一過濾函數(shù)。本實(shí)施例中,線程是操作系統(tǒng)CPU時間的基本單元,是系統(tǒng)中最小的執(zhí)行單元。它與進(jìn)程的主要差別在于它們是不同的操作系統(tǒng)資源管理方式。操作系統(tǒng)創(chuàng)建并控制進(jìn)程,進(jìn)程包含和控制線程,一個進(jìn)程可以包含多個線程,而且Windows系統(tǒng)中可以同時運(yùn)行多個進(jìn)程。202:當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第一過濾函數(shù);203 :第一過濾函數(shù)判斷當(dāng)前的非窗口對象是否為被保護(hù)的進(jìn)程或線程;如果是,則清除該進(jìn)程或線程的危險權(quán)限。本實(shí)施例中,進(jìn)程或線程均可以擁有多項(xiàng)權(quán)限,如創(chuàng)建權(quán)限、終止權(quán)限、讀取權(quán)限等等,當(dāng)需要對進(jìn)程或線程進(jìn)行保護(hù)時,能夠修改、掛起或關(guān)閉進(jìn)程或線程的權(quán)限就被視為危險權(quán)限,通過清除危險權(quán)限可以使得進(jìn)程或線程在打開的狀態(tài)下無法被修改、掛起或關(guān)閉,從而達(dá)到保護(hù)的目的。其中,進(jìn)程的危險權(quán)限可以包括但不限于以下至少一種PR0CESS_CREATE_THREAD ;// 創(chuàng)建一個線程的權(quán)限
PR0CESS_SET_INF0RMATI0N ;// 設(shè)置進(jìn)程屬性的權(quán)限PROCESS_SUSPEND_RESUME ;// 暫?;蚧謴?fù)進(jìn)程的權(quán)限PROCESS_TERMINATE ;// 終止一個進(jìn)程的權(quán)限PR0CESS_VM_0PERATI0N ;//操作進(jìn)程內(nèi)存空間的權(quán)限PROCESS_VM_WRITE ;//讀取進(jìn)程內(nèi)存空間的權(quán)限第一過濾函數(shù)通過清除上述進(jìn)程危險權(quán)限,可以使得windows 64位系統(tǒng)中打開的進(jìn)程不能被寫入、掛起及關(guān)閉,從而達(dá)到保護(hù)進(jìn)程的目的。其中,線程的危險權(quán)限可以包括但不限于以下至少一種 THREAD_TERMINATE ;// 終止一個線程的權(quán)限THREAD_SUSPEND_RESUME ; //暫?;蚧謴?fù)線程的權(quán)限THREAD_SET_CONTEXT ; //設(shè)置線程的上下文的權(quán)限THREAD_SET_INFORMATION ; // 設(shè)置線程屬性的權(quán)限WRITE_DAC ;//修改線程的訪問控制列表的權(quán)限WRITE_0WNER ;//修改線程安全屬性所有者的權(quán)限第一過濾函數(shù)通過清除上述線程危險權(quán)限,可以使得windows 64位系統(tǒng)中打開的線程不能被寫入、掛起及關(guān)閉,從而達(dá)到保護(hù)線程的目的。204 :預(yù)先在多用戶管理驅(qū)動文件中設(shè)置鉤子,建立窗口對象的第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián);其中,第二函數(shù)是指窗口對象的被保護(hù)函數(shù),至少包括以下的一種NtUserPostMessage ;// 投遞消息NtUserFindffindowEx ;//查找窗口NtUserBuildHwndList ;//枚舉窗口NtUserffindowFromPoint ; //根據(jù)屏幕上的點(diǎn)查找窗口NtUserSendInput ;// 向窗口發(fā)送輸入消息NtUserGetForeGroundffindow ;// 獲取前臺窗口第二過濾函數(shù)為自定義的對窗口對象進(jìn)行過濾保護(hù)的函數(shù),該過濾保護(hù)包括過濾所述窗口的危險消息或不返回找到的所述窗口。其中,對于被保護(hù)的窗口向其發(fā)送消息則被視為危險消息,需要進(jìn)行過濾,另外,查找被保護(hù)的窗口也被視為危險行為,需要屏蔽使其查找不到,因此,對于窗口對象的不同被保護(hù)函數(shù),執(zhí)行的過濾操作也不完全相同。下面舉例說明上述六種被保護(hù)函數(shù)對應(yīng)的過濾操作,具體如下a) NtUserPostMessage 函數(shù)對應(yīng)的第二過濾函數(shù)執(zhí)行如下過濾判斷目標(biāo)窗口是否是被保護(hù)的窗口,如果是,則過濾掉危險消息,該危險消息包括WM_CL0SE消息和WM_QUIT消息。b) NtUserFindWindowEx 函數(shù)對應(yīng)的第二過濾函數(shù)執(zhí)行如下過濾調(diào)用真實(shí)的NtUserFindWindowEx函數(shù)查找窗口,如果找到的窗口是被保護(hù)的窗口,則返回空,否則返回找到窗口的句柄。c)NtUserBuildHwndList 函數(shù)對應(yīng)的第二過濾函數(shù)執(zhí)行如下過濾調(diào)用真實(shí)的NtUserBuildHwndList函數(shù)生成窗口列表,然后遍歷該窗口列表,將被保護(hù)的窗口從該窗口列表中刪掉,然后系統(tǒng)調(diào)用返回。d) NtUserffindowFromPoint 函數(shù)對應(yīng)的過濾函數(shù)執(zhí)行如下過濾調(diào)用真實(shí)的NtUserWindowFromPoint函數(shù)獲取窗口,如果找到的窗口是被保護(hù)的窗口,則返回空,否則返回找到的窗口。e) NtUserSendInput 函數(shù)對應(yīng)的過濾函數(shù)執(zhí)行如下過濾判斷目標(biāo)窗口是否是被保護(hù)的窗口,并且輸入?yún)?shù)中含有鼠標(biāo)或者鍵盤消息,如果是,則返回失敗,否則調(diào)用真實(shí)的NtUserSendlnput函數(shù)發(fā)送。f) NtUserGetForeGroundffindow 函數(shù) 對應(yīng)的過濾函數(shù)執(zhí)行如下過濾調(diào)用真實(shí)的NtUserGetForeGroundffindow函數(shù)獲取前臺窗口,如果該前臺窗口是屬于被保護(hù)進(jìn)程的,則返回空,否則返回前臺窗口。本步驟在多用戶管理驅(qū)動文件中設(shè)置鉤子,建立窗口對象的第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián)的具體過程可以如下I)為 win32k. sys 對 ntoskrnl. exe 的導(dǎo)入表中的 KeAddSystemServiceTable 函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表Shadow SSDT的基地址;其中,win32k. sys文件是Windows系統(tǒng)中的多用戶管理的驅(qū)動文件,一般在c:\Windows\System32\Dllcache目錄下有此文件的備份;2)搜尋win32k. sys中任一函數(shù)邊界的NOP指令,NOP指令是用于函數(shù)在內(nèi)存空間對齊的填充指令,因此可以將其替換為別的指令且不會對程序造成影響;3)用轉(zhuǎn)移Jmp指令代替該NOP指令,該Jmp指令的目標(biāo)地址為第二過濾函數(shù)的地址,從而保證執(zhí)行到Jmp指令時可以按照該目標(biāo)地址跳轉(zhuǎn)到第二過濾函數(shù);4)對Jmp指令的地址相對于win32k. sys的偏移值進(jìn)行左移4位,再加上第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值,其中,該數(shù)值是用來替換Shadow SSDT中的表項(xiàng)的,因此該數(shù)值是按照windows 64位系統(tǒng)的Shadow SSDT中表項(xiàng)的計(jì)算方法得到的;5)根據(jù)上述得到的Shadow SSDT的基地址,在Shadow SSDT中用該數(shù)值替換其中與第二函數(shù)對應(yīng)的表項(xiàng),建立第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián)。205 :當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第二過濾函數(shù);206 :第二過濾函數(shù)判斷當(dāng)前對象是否為被保護(hù)的窗口 ;如果是,則過濾該窗口的危險消息或不返回查找到的窗口,從而保證窗口對象的安全。本實(shí)施例中204還可以由以下步驟替換預(yù)先將窗口對象的第二函數(shù)中的起始指令替換為目標(biāo)地址為第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立第二函數(shù)和第二過濾函數(shù)的關(guān)聯(lián)。本實(shí)施例提供的上述方法應(yīng)用于windows 64位系統(tǒng)。其中,64位是指CPUGPRs通用寄存器的數(shù)據(jù)寬度為64位,與32位處理器一次只能處理32位即4個字節(jié)的數(shù)據(jù)明顯不同,64位處理器一次就能處理64位即8個字節(jié)的數(shù)據(jù)。另外,本發(fā)明實(shí)施例還提供了 windows 32位系統(tǒng)上的對象保護(hù)方法,包括分別為SSDT和Shadow SSDT設(shè)置鉤子H00K,當(dāng)執(zhí)行非窗口對象的被保護(hù)函數(shù)時,通過H00KSSDT關(guān)聯(lián)的過濾函數(shù)對進(jìn)程或線程進(jìn)行保護(hù),當(dāng)執(zhí)行窗口對象的被保護(hù)函數(shù)時,通過H00KShadow SSDT關(guān)聯(lián)的過濾函數(shù)對窗口進(jìn)行保護(hù)。其中,在windows 32位系統(tǒng)中為SSDT設(shè)置鉤子的過程如下提升當(dāng)前IRQL到DPCLEVEL ;關(guān)中斷;清除CRO寄存器的WP位;原子寫入操作替換SSDT項(xiàng);恢復(fù)CRO寄存器的WP位;開中斷;恢復(fù)當(dāng)前IRQL。在windows 32位上為Shadow SSDT設(shè)置鉤子的過程如下找到Csrss. exe進(jìn)程,KeStackAttachProcess切換到Csrss ;從當(dāng)前線程結(jié)構(gòu)中找到ShadowSSDT的指針;提升當(dāng)前IRQL到DPC DEVEL ;關(guān)中斷;清除CRO寄存器的WP位;原子寫入操作替換SSDT項(xiàng);恢復(fù)CRO寄存器的WP位;開中斷;恢復(fù)當(dāng)前IRQL。在windows 32位系統(tǒng)上對進(jìn)程或線程進(jìn)行保護(hù)時,涉及的進(jìn)程危險權(quán)限以及線程危險權(quán)限均與上述windows 64位系統(tǒng)中的描述相同,涉及的窗口對象被保護(hù)的函數(shù)以及對應(yīng)的過濾操作也與上述windows 64位系統(tǒng)中的描述相同,此處不贅述。本實(shí)施例提供的上述方法,通過注冊對象回調(diào)函數(shù)關(guān)聯(lián)第一函數(shù)與第一過濾函數(shù),實(shí)現(xiàn)對非窗口對象的保護(hù),通過多用戶管理驅(qū)動文件或第二函數(shù)中的鉤子關(guān)聯(lián)第二函 數(shù)與第二過濾函數(shù),實(shí)現(xiàn)對窗口對象的保護(hù),解決了 windows 64位系統(tǒng)上無法實(shí)現(xiàn)對象保護(hù)的問題,達(dá)到了 windows 64位系統(tǒng)上對象保護(hù)的效果。實(shí)施例3參見圖3,本實(shí)施例提供了一種對象保護(hù)裝置,包括第一處理模塊301,用于當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第一過濾函數(shù),第一過濾函數(shù)執(zhí)行對非窗口對象的保護(hù);第二處理模塊302,用于當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或第二函數(shù)中的鉤子所建立的第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到第二過濾函數(shù),第二過濾函數(shù)執(zhí)行對窗口對象的保護(hù)。參見圖4,本實(shí)施例中,所述裝置還可以包括第一建立模塊303,用于預(yù)先通過注冊對象回調(diào)函數(shù)建立第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián)。本實(shí)施例中,所述裝置還可以包括第二建立模塊304,用于預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表Shadow SSDT的基地址;搜尋win32k. sys中任一函數(shù)邊界的空操作NOP指令;用轉(zhuǎn)移Jmp指令代替該NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為第二過濾函數(shù)的地址;對所述轉(zhuǎn)移指令的地址相對于win32k. sys的偏移值進(jìn)行左移4位,再加上第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值;根據(jù)所述Shadow SSDT的基地址,在Shadow SSDT中用所述數(shù)值替換與第二函數(shù)對應(yīng)的表項(xiàng),建立第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián);或者包括第三建立模塊305,用于預(yù)先將第二函數(shù)中的起始指令替換為目標(biāo)地址為第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián)。本實(shí)施例中,第一處理模塊301可以用于第一過濾函數(shù)判斷非窗口對象是否為被保護(hù)的進(jìn)程或線程,如果是,則清除所述進(jìn)程或線程的危險權(quán)限。本實(shí)施例中,第二處理模塊302可以用于第二過濾函數(shù)判斷窗口對象是否為被保護(hù)的窗口,如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。本實(shí)施例提供的上述裝置,通過注冊對象回調(diào)函數(shù)關(guān)聯(lián)第一函數(shù)與第一過濾函數(shù),實(shí)現(xiàn)對非窗口對象的保護(hù),通過多用戶管理驅(qū)動文件或第二函數(shù)中的鉤子關(guān)聯(lián)第二函數(shù)與第二過濾函數(shù),實(shí)現(xiàn)對窗口對象的保護(hù),解決了 windows 64位系統(tǒng)上無法實(shí)現(xiàn)對象保護(hù)的問題,達(dá)到了 windows 64位系統(tǒng)上對象保護(hù)的效果。以上實(shí)施例提供的技術(shù)方案中的全部或部分內(nèi)容可以通過軟件編程實(shí)現(xiàn),其軟件程序存儲在可讀取的存儲介質(zhì)中,存儲介質(zhì)例如計(jì)算機(jī)中的硬盤、光盤或軟盤。以上所述僅為本發(fā)明的較佳實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和 原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種對象保護(hù)方法,其特征在于,所述方法包括 當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的所述第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第一過濾函數(shù),所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù); 當(dāng)執(zhí)行窗口對象的第二函數(shù) 時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或所述第二函數(shù)中的鉤子所建立的所述第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第二過濾函數(shù),所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。
2.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述方法還包括 預(yù)先通過注冊對象回調(diào)函數(shù)建立所述第一函數(shù)與所述第一過濾函數(shù)的關(guān)聯(lián)。
3.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述方法還包括 預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表Shadow SSDT的基地址; 搜尋所述win32k. sys中任一函數(shù)邊界的空操作NOP指令,用轉(zhuǎn)移Jmp指令代替所述NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為所述第二過濾函數(shù)的地址; 對所述Jmp指令的地址相對于所述win32k. sys的偏移值進(jìn)行左移4位,再加上所述第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值; 根據(jù)所述Shadow SSDT的基地址,在所述Shadow SSDT中用所述數(shù)值替換與所述第二函數(shù)對應(yīng)的表項(xiàng),建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。
4.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述方法還包括 預(yù)先將所述第二函數(shù)中的起始指令替換為目標(biāo)地址為所述第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。
5.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù),包括 所述第一過濾函數(shù)判斷所述非窗口對象是否為被保護(hù)的進(jìn)程或線程; 如果是,則清除所述進(jìn)程或線程的危險權(quán)限。
6.根據(jù)權(quán)利要求I所述的方法,其特征在于,所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù),包括 所述第二過濾函數(shù)判斷所述窗口對象是否為被保護(hù)的窗口; 如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。
7.一種對象保護(hù)裝置,其特征在于,所述裝置包括 第一處理模塊,用于當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的所述第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第一過濾函數(shù),所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù); 第二處理模塊,用于當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或所述第二函數(shù)中的鉤子所建立的所述第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第二過濾函數(shù),所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括 第一建立模塊,用于預(yù)先通過注冊對象回調(diào)函數(shù)建立所述第一函數(shù)與所述第一過濾函數(shù)的關(guān)聯(lián)。
9.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括 第二建立模塊,用于預(yù)先為多用戶管理驅(qū)動文件win32k. sys對ntoskrnl. exe的導(dǎo)入表中的添加系統(tǒng)服務(wù)表KeAddSystemServiceTable函數(shù)設(shè)置鉤子,得到影子系統(tǒng)服務(wù)描述符表Shadow SSDT的基地址;搜尋所述win32k. sys中任一函數(shù)邊界的空操作NOP指令;用轉(zhuǎn)移Jmp指令代替所述NOP指令,所述轉(zhuǎn)移指令的目標(biāo)地址為所述第二過濾函數(shù)的地址;對所述轉(zhuǎn)移指令的地址相對于所述win32k. sys的偏移值進(jìn)行左移4位,再加上所述第二函數(shù)的參數(shù)個數(shù),得到一個數(shù)值;根據(jù)所述Shadow SSDT的基地址,在所述Shadow SSDT中用所述數(shù)值替換與所述第二函數(shù)對應(yīng)的表項(xiàng),建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。
10.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述裝置還包括 第三建立模塊,用于預(yù)先將所述第二函數(shù)中的起始指令替換為目標(biāo)地址為所述第二過濾函數(shù)的地址的轉(zhuǎn)移Jmp指令,建立所述第二函數(shù)與所述第二過濾函數(shù)的關(guān)聯(lián)。
11.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述第一處理模塊用于所述第一過濾函數(shù)判斷所述非窗口對象是否為被保護(hù)的進(jìn)程或線程,如果是,則清除所述進(jìn)程或線程的危險權(quán)限。
12.根據(jù)權(quán)利要求7所述的裝置,其特征在于,所述第二處理模塊用于所述第二過濾函數(shù)判斷所述窗口對象是否為被保護(hù)的窗口,如果是,則過濾所述窗口的危險消息或不返回找到的所述窗口。
全文摘要
本發(fā)明公開了一種對象保護(hù)方法及裝置,屬于計(jì)算機(jī)領(lǐng)域。所述方法包括當(dāng)執(zhí)行非窗口對象的第一函數(shù)時,根據(jù)注冊對象回調(diào)函數(shù)建立的所述第一函數(shù)與第一過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第一過濾函數(shù),所述第一過濾函數(shù)執(zhí)行對所述非窗口對象的保護(hù);當(dāng)執(zhí)行窗口對象的第二函數(shù)時,根據(jù)多用戶管理驅(qū)動文件中的鉤子或所述第二函數(shù)中的鉤子所建立的所述第二函數(shù)與第二過濾函數(shù)的關(guān)聯(lián),跳轉(zhuǎn)到所述第二過濾函數(shù),所述第二過濾函數(shù)執(zhí)行對所述窗口對象的保護(hù)。所述裝置包括第一處理模塊和第二處理模塊。本發(fā)明解決了windows 64位系統(tǒng)上無法實(shí)現(xiàn)對象保護(hù)的問題,達(dá)到了windows 64位系統(tǒng)上對象保護(hù)的效果。
文檔編號G06F21/22GK102737198SQ201110092598
公開日2012年10月17日 申請日期2011年4月13日 優(yōu)先權(quán)日2011年4月13日
發(fā)明者謝飛, 高小明 申請人:騰訊科技(深圳)有限公司