簡單的HOOK OpenProcess函數、達到不讓任務管理器使用OpenProcess來獲取我們要保護的進程的句柄、
從而達到使任務管理器使用TerminateProcess無法結束該進程的目的、、、
當我們HOOK到OpenProcess的時候、我們要在自己的MyOpenProcess中、判斷一下、所打開的進程是否為我們要保護的進程、如果是簡單的返回錯誤碼0、如果不是就在我們的MyOpenProcess中調用真正的OpenProcess、
判斷的時候是這樣的、、
先通過我們進程窗口的名字得到窗口的句柄 涉及API FindWindow
再通過我們窗口的句柄得到創建窗口的進程ID、涉及API GetWindowThreadProcessId
這里獲得的ID是我們要保護進程的真實ID而任務管理器獲得ID即是第三個參數、
所以有下邊的代碼、、、
//獲取 要保護進程的標題 的窗口句柄系統API函數前使用::為了和類擴展函數區別
//為了代碼的健壯性使用TEXT宏、 HWND窗口句柄、
HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
{
HWND HProtect = ::FindWindow(NULL,TEXT("Windows當前所有進程"));
if(!HProtect)
{
return ( pRealOpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId) );
} //若不存在則調用返回
//獲取創建此窗口的進程的ID、保存在 &ProtectId 地址中、
DWORD ProtectId; //下邊找出某個窗口的創建者(線程或進程)
GetWindowThreadProcessId(HProtect,&ProtectId);
if(ProtectId == dwProcessId)//dwProcessId是任務管理器要結束的進程ID
{
return 0;//如果結束的是我們的進程則返回錯誤碼0、
}
return ( pRealOpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId) );
}
這樣就可以了
其中HOOK技術使用的是IAT HOOK 前邊已經寫過這樣的代碼了、
DLL注入也是用的之前寫過的一個簡單的遠程線程注入技術、
演示、
打開任務管理器、使用DLL注入工具向其注入這個有著簡單保護進程功能的DLL、
然后再用任務管理器結束我們在DLL里邊保護的進程、此時沒有反映、進程沒有被結束、、
為什么不彈個框呢、、
因為任務管理器好像在會一直調用OpenProcess、如果使用MessageBox函數的話、會一直彈、效果當然很不好了、、
如果想要彈框可以去HOOK一下TerminateProcess函數、在TerminateProcess里邊實現、、