一種Windows的進程保護方法
【專利摘要】本發(fā)明公開了一種Windows的進程保護方法,其通過驅(qū)動程序把含有核心功能代碼的dll注入到系統(tǒng)進程運行,從而監(jiān)視被保護進程的狀態(tài)。通過注入的dll動態(tài)庫這個跳板,系統(tǒng)動態(tài)庫scesrv.dll就會重新加載到系統(tǒng)進程services.exe的內(nèi)存空間中,這也使注入的dll動態(tài)庫神不知鬼不覺地加載到系統(tǒng)進程services.exe的內(nèi)存空間中去。本發(fā)明方法有很好的穩(wěn)定性和兼容性,實現(xiàn)難度不大,隱蔽性好,由于沒有Patch系統(tǒng)代碼,所以64位Windows操作系統(tǒng)也同樣適用。
【專利說明】-種Windows的進程保護方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及網(wǎng)絡(luò)安全【技術(shù)領(lǐng)域】,尤其涉及一種Windows的進程保護方法。
【背景技術(shù)】
[0002] 進程保護是為了防止惡意程序破壞進程的正常運行。很多軟件,如機房的監(jiān)控系 統(tǒng)、計費系統(tǒng)等,以及一些必須確保自身運行過程中不被強行中斷,否則會導(dǎo)致數(shù)據(jù)丟失、 操作系統(tǒng)崩潰等嚴重后果的軟件,都需要對自身進行必要的防護,防止惡意行為或者操作 者的誤操作引起的損失。
[0003] 要強制關(guān)閉一個進程,通常的做法是在應(yīng)用層調(diào)用OpenProcess函數(shù)打開進程, 打開進程后再調(diào)用TerminateProcess函數(shù)強制關(guān)閉進程。所以,進程保護的方法就是要阻 止這兩個函數(shù)的其中一個運行就可以了。在Windows系統(tǒng)的內(nèi)核,這兩個函數(shù)分別對應(yīng)的 是NtOpenProcess函數(shù)和NtTerminateProcess函數(shù)。要接管這兩個函數(shù),可以在驅(qū)動層的 SSDT表(System Services Descriptor Table)把指向這兩個函數(shù)的地址替換成自己函數(shù) 的地址(Hook方法)。這樣,所有調(diào)用這兩個函數(shù)的調(diào)用,都先會經(jīng)過自己函數(shù)的判斷,才會 去調(diào)用真正的函數(shù)去執(zhí)行,這樣就可以起到保護進程的作用。
[0004] 采用SSDT Hook的方法實現(xiàn)簡單,系統(tǒng)本身就會導(dǎo)出SSDT表。但是就是因為過于 簡單,所以很多殺毒軟件、病毒和一些監(jiān)控類軟件,都會檢查或者使用這個SSDT表。所以使 用SSDTHook方法會有隱藏性不足的問題,并且會和其他軟件產(chǎn)生穩(wěn)定性和兼容性的問題 等。由于在64位的Windows下系統(tǒng)自帶一個PatchGuard技術(shù),這個技術(shù)會定期檢查系統(tǒng) 的內(nèi)核有無被修改(Patch),一旦修改就會引發(fā)藍屏,所以SSDT Hook方法在64位系統(tǒng)下不 能使用。
[0005] 針對SSDT Hook的方法存在不足,就產(chǎn)生了 inLine Hook方法。inLine Hook方 法是指在函數(shù)開頭處寫入jmp XXXX的匯編指令,來轉(zhuǎn)跳到自己的函數(shù)。這樣就可以使 被Hook函數(shù)先執(zhí)行我們自己的判斷函數(shù)后,再執(zhí)行被Hook函數(shù),從而到達Hook目的。 對于進程保護的兩個函數(shù):NtOpenProcess函數(shù)和NtTerminateProcess函數(shù),他們執(zhí)行 中會調(diào)用到:0bReference0bjectByHandle 函數(shù)、ObReferenceObjectByPointer 函數(shù)和 ObpCreateHandle函數(shù)。所以,只要對這3個函數(shù)進行inLine Hook就可以達到進程保護的 目的。
[0006] 由于要Patch系統(tǒng)代碼,所以采用inLine Hook的方法難度高,穩(wěn)定性差。如果其 他進程保護軟件也inLine Hook同一函數(shù),就會存在兼容性的問題。另外,在64位Windows 系統(tǒng)下也存在不能使用的問題。
【發(fā)明內(nèi)容】
[0007] 本發(fā)明為了克服現(xiàn)有技術(shù)中的缺點或不足,提供了一種Windows的進程保護方 法,從而實現(xiàn)了保護進程的目的。
[0008] -種Windows的進程保護方法,其通過驅(qū)動程序把含有核心功能代碼的dll注入 到系統(tǒng)進程運行,從而監(jiān)視被保護進程的狀態(tài)。
[0009] 該發(fā)明方法的具體流程為:當Windows系統(tǒng)啟動的時候通過自定義的驅(qū)動程序調(diào) 用映像加載通知函數(shù)來注冊自定義的映像加載回調(diào)函數(shù)。當被注入的目標系統(tǒng)進程啟動 前,并且映像開始加載的時候,自定義的映像加載回調(diào)函數(shù)就會馬上被調(diào)用。在自定義的回 調(diào)函數(shù)中檢查目標系統(tǒng)進程的導(dǎo)入表,當找到可以注入的系統(tǒng)動態(tài)庫dll的時候,就修改 目標系統(tǒng)進程的導(dǎo)入表,把系統(tǒng)動態(tài)庫dll更改為自定義的動態(tài)庫,即注入的dll動態(tài)庫, 這樣就完成dll注入動作。當系統(tǒng)進程啟動后,注入的dll動態(tài)庫中的代碼就可以秘密地 運行。在后臺隱藏運行的代碼可以不斷地監(jiān)視被保護進程的相關(guān)情況,在遇到特殊情況發(fā) 現(xiàn)被保護進程關(guān)閉后,就可以馬上重啟被保護進程,這樣就可以達到進程保護的目的。
[0010] 本發(fā)明技術(shù)方案帶來的有益效果:
[0011] 本發(fā)明方法有很好的穩(wěn)定性和兼容性,實現(xiàn)難度不大,隱蔽性好,由于沒有Patch 系統(tǒng)代碼,所以64位Windows操作系統(tǒng)也同樣適用。
【專利附圖】
【附圖說明】
[0012] 為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本 發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以 根據(jù)這些附圖獲得其它的附圖。
[0013] 圖1是本發(fā)明的方法流程圖。
【具體實施方式】
[0014] 下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完 整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;?本發(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他 實施例,都屬于本發(fā)明保護的范圍。
[0015] 針對現(xiàn)有技術(shù)出現(xiàn)的問題,本發(fā)明方法采用:通過驅(qū)動程序把含有核心功能代碼 的dll注入到系統(tǒng)進程來運行,從而監(jiān)視被保護進程的狀態(tài)的方案。該方案有很好的穩(wěn)定 性和兼容性,同時在64位Windows系統(tǒng)下也能正常使用。具體流程如圖1所示。
[0016] 本發(fā)明方案分為驅(qū)動層和應(yīng)用層兩部分,具體實施流程如下。
[0017] 1、驅(qū)動層部分。
[0018] 在被注入的系統(tǒng)進程中選取系統(tǒng)服務(wù)控制進程services.exe,這個進程是 Windows系統(tǒng)管理服務(wù)用的,注入到這個進程有很好的隱蔽性。當Windows系統(tǒng)啟動的 時候通過自定義的驅(qū)動程序調(diào)用映像加載通知函數(shù)PsSetLoadlmageNotifyRoutine來注 冊自己的映像加載回調(diào)函數(shù)。當系統(tǒng)進程services, exe啟動前,并且映像開始加載的時 候,自定義的映像加載回調(diào)函數(shù)就會馬上被調(diào)用。在自定義的回調(diào)函數(shù)中檢查系統(tǒng)進程 services, exe的導(dǎo)入表,當找到系統(tǒng)導(dǎo)入的動態(tài)庫scesrv. dll的時候,就可以修改系統(tǒng)進 程services, exe的導(dǎo)入表,把動態(tài)庫scesrv. dll更改為自己的動態(tài)庫,這樣就可以完成 dll注入動作。系統(tǒng)進程services, exe啟動完成的時候,注入的dll中的進程保護代碼就 可以運行。
[0019] 2,應(yīng)用層部分。
[0020] 應(yīng)用層部分介紹一下注入的dll動態(tài)庫。注入的dll動態(tài)庫也分為兩部分,分別 是dll注入的后期收尾工作和實現(xiàn)進程保護的原理。
[0021] dll注入的后期收尾工作:因為在驅(qū)動層更改了系統(tǒng)進程services, exe的導(dǎo)入 表,所以注入的dll動態(tài)庫必須偽裝成為系統(tǒng)的動態(tài)庫scesrv. dll,讓系統(tǒng)察覺不到有dll 動態(tài)庫被注入。用Pe工具打開動態(tài)庫scesrv. dll,就會發(fā)現(xiàn)動態(tài)庫scesrv. dll有兩個導(dǎo) 出函數(shù),分別是 ScesrvInitializeServer 函數(shù)和 ScesrvTerminateServer 函數(shù)。
[0022] 這兩個導(dǎo)出函數(shù)正是系統(tǒng)進程services, exe的導(dǎo)入函數(shù),所以注入的dll動態(tài)庫 的導(dǎo)出表必須包含這兩個函數(shù)。
[0023] 另外由于注入的dll動態(tài)庫無辦法實現(xiàn)這兩個函數(shù)的具體功能,所以注入的dll 動態(tài)庫也必須從動態(tài)庫scesrv. dll導(dǎo)入這兩個函數(shù),來實現(xiàn)系統(tǒng)相關(guān)的功能代碼。
[0024] 這樣,通過注入的dll動態(tài)庫這個跳板,系統(tǒng)動態(tài)庫scesrv. dll就會重新加載到 系統(tǒng)進程services, exe的內(nèi)存空間中,這也使注入的dll動態(tài)庫神不知鬼不覺地加載到系 統(tǒng)進程services, exe的內(nèi)存空間中去。
[0025] 進程保護的原理:當系統(tǒng)進程services, exe啟動后,我們注入的dll動態(tài)庫 中的代碼就可以秘密地運行。在后臺隱藏運行的代碼可以調(diào)用函數(shù)EnumProcesses、 Process32First和Process32Next不斷地監(jiān)視被保護進程的相關(guān)情況,在遇到特殊情況發(fā) 現(xiàn)被保護進程關(guān)閉后,就可以馬上調(diào)用CreateProcess函數(shù)來重啟被保護進程,這樣就可 以達到進程保護的目的。。
[0026] 以上對本發(fā)明實施例所提供的一種Windows的進程保護方法進行了詳細介紹,本 文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于 幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思 想,在【具體實施方式】及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對 本發(fā)明的限制。
【權(quán)利要求】
1. 一種Windows的進程保護方法,其特征在于,其通過驅(qū)動程序把含有核心功能代碼 的dll注入到系統(tǒng)進程運行,從而監(jiān)視被保護進程的狀態(tài),具體流程如下: 當Windows系統(tǒng)啟動的時候通過自定義的驅(qū)動程序調(diào)用映像加載通知函數(shù)來注冊自 定義的映像加載回調(diào)函數(shù); 當被注入的目標系統(tǒng)進程啟動前,并且映像開始加載的時候,自定義的映像加載回調(diào) 函數(shù)就會馬上被調(diào)用; 在自定義的回調(diào)函數(shù)中檢查目標系統(tǒng)進程的導(dǎo)入表,當找到可以注入的系統(tǒng)動態(tài)庫 dll的時候,就修改目標系統(tǒng)進程的導(dǎo)入表,把系統(tǒng)動態(tài)庫dll更改為自定義的動態(tài)庫,即 注入的dll動態(tài)庫,這樣就完成dll注入動作; 當系統(tǒng)進程啟動后,注入的dll動態(tài)庫中的代碼就可以秘密地運行,在后臺隱藏運行 的代碼可以不斷地監(jiān)視被保護進程的相關(guān)情況。
2. 根據(jù)權(quán)利要求1所述的方法,其特征在于,當Windows系統(tǒng)啟動的時候通過自定義的 驅(qū)動程序調(diào)用映像加載通知函數(shù)PsSetLoadlmageNotifyRoutine來注冊自己的映像加載 回調(diào)函數(shù)。
3. 根據(jù)權(quán)利要求1所述的方法,其特征在于,選取系統(tǒng)服務(wù)控制進程services, exe作 為被注入的目標系統(tǒng)進程。
4. 根據(jù)權(quán)利要求1所述的方法,其特征在于,在自定義的回調(diào)函數(shù)中檢查系統(tǒng)進程 services, exe的導(dǎo)入表,當找到系統(tǒng)導(dǎo)入的動態(tài)庫scesrv. dll的時候,修改系統(tǒng)進程 services, exe 的導(dǎo)入表。
5. 根據(jù)權(quán)利要求4所述的方法,其特征在于,動態(tài)庫scesrv. dll有兩個導(dǎo)出函數(shù),分別 是ScesrvInitializeServer函數(shù)和ScesrvTerminateServer函數(shù),這兩個導(dǎo)出函數(shù)正是系 統(tǒng)進程services, exe的導(dǎo)入函數(shù),注入的dll動態(tài)庫的導(dǎo)出表必須包含這兩個函數(shù),另外 由于注入的dll動態(tài)庫無辦法實現(xiàn)這兩個函數(shù)的具體功能,所以注入的dll動態(tài)庫也必須 從動態(tài)庫scesrv. dll導(dǎo)入這兩個函數(shù),來實現(xiàn)系統(tǒng)相關(guān)的功能代碼。
6. 根據(jù)權(quán)利要求1所述的方法,其特征在于,后臺隱藏運行的代碼調(diào)用函數(shù) EnumProcesses、Process32First和Process32Next不斷地監(jiān)視被保護進程的相關(guān)情況。
7. 根據(jù)權(quán)利要求1所述的方法,其特征在于,遇到特殊情況發(fā)現(xiàn)被保護進程關(guān)閉后,馬 上調(diào)用CreateProcess函數(shù)來重啟被保護進程,這樣就可以達到進程保護的目的。
8. 根據(jù)權(quán)利要求1所述的方法,其特征在于,該方法也適用于64位Windows操作系統(tǒng)。
【文檔編號】G06F21/51GK104123492SQ201410347284
【公開日】2014年10月29日 申請日期:2014年7月21日 優(yōu)先權(quán)日:2014年7月21日
【發(fā)明者】柯宗貴, 楊育斌, 梁永秋 申請人:藍盾信息安全技術(shù)有限公司