一.利用hook 保護進程
1.inline hook
採用inlink hook 保護自身的進程,對抗CreateRemoteThread的Dll注入。在ring3下Dll注入的標準做法是使用CreateRemoteThread控制目標進程調用Loadlibrary加載,針對這一做法,可以按如下的步驟進行自身保護:
1)在自身初始化完畢後,掛鉤自身的LoadLibraryExW,並在主線程中獲取當前線程ID。
2)在掛鉤函數中判斷當前線程ID是否和主線程ID相等,如不相等則可能是來自外部的DLL注入,進行拒絕或通知用戶處理。
3)對於自身所需要的LoadLibrary行爲,可以在主線程中進行,或調用原始的LoadLibraryExW。
2.SSDT hook
當打開任務管理器時,選擇一個進程並結束進程這個過程,可以詳細的分爲以下幾步:
1) taskmgr 進程首先獲取要結束的進程句柄,通過 OpenProcess()這個下API,OpenProcess 調用在Kernel32.dll 中;
2)系統捕獲API調用,轉到Ring0 級下,從 SSDT中取得對應的 RintOpenProcess 的入口地址,執行相應操作,此過程在 ntdll.dll 中;
3)完成NtOpenProcess 操作後轉回Ring3 級下返回 OpenProcess 函數返回taskmgr進程,因此獲取了要結束的進程的句柄;
4)taskmgr 執行 TerminateProcess()這個 Ring3 下的 API,傳入進程句試結束進程;
5)系統捕獲API調用,再次轉到 Ring0 級下,從SSDT中取得對應的PI:NtTerminateProcess 的入口地址,執行結束進程操作;
6、完成 NtTerminateProcess 操作後轉回 Ring3 級下返回 TerminatePro數,繼而返回taskmgr 進程,完成結束進程過程;
在這一個流程中,SSDT起到了重要的作用。於是針對這一流程可以hook ssdt,
改變這處流程的處理。
二.採用多進程保護進程
它是指一個或多個程序運行多遍,只有一個進程處於工作狀態,其餘進程的目的是爲了保護這個進程。一旦其中一個進程被殺或失效,其他的進程將會創建出另外進程來填補。
應用多進程來實現進程的保護中,可以綜合運用多種保護的方法來實現對進程的保護。雙進程保護基本的做法如下:
1)若A爲要保護的進程,在創建A進程的同時,同是創建副進程B。B的作用主要是用來監視A進程的狀態
2)若A進程被結束,B進程根據記錄A進程的狀態重新創建A進程
3)若B進程被結束,A進程也會自動去創建B進程
在對A和B的保護中也可以利用一些其它的單獨的方法來保護自身的進程不被結束。
三.對管理系統的進程保護的看法
CDMS系統能正常運行依賴的一個進程是UniFrm2.exe要實行對此進程的保護單一運用一種方法的安全性不是很高。如每種方法被攻破的概率爲50%,那麼綜合一下同時採用兩種方法保護UniFrm2.exe,此進程倖存的概率爲(1-50%*50%)=75%一下就提高了不少。
估應該採用多種方法結合的方法來對些進程的保護。