當前位置:編程學習大全網 - 編程語言 - 易語言 HOOK API 教程 要詳細的說明

易語言 HOOK API 教程 要詳細的說明

#include#include "APIHook.h" extern CAPIHook g_OpenProcess; // 自定義OpenProcess函數 #pragma data_seg("YCIShared") HHOOK g_hHook = NULL; DWORD dwCurrentProcessId=0; #pragma data_seg() HANDLE WINAPI Hook_OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId) { typedef HANDLE (WINAPI *PFNTERMINATEPROCESS)(DWORD, BOOL,DWORD); if(dwProcessId != dwCurrentProcessId) { return ((PFNTERMINATEPROCESS)(PROC)g_OpenProcess)(dwDesiredAccess,bInheritHandle,dwProcessId); } return 0; } // 掛鉤OpenProcess函數 CAPIHook g_OpenProcess("kernel32.dll", "OpenProcess", (PROC)Hook_OpenProcess); ////static HMODULE ModuleFromAddress(PVOID pv) { MEMORY_BASIC_INFORMATION mbi; if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) { return (HMODULE)mbi.AllocationBase; } else { return NULL; } } static LRESULT WINAPI GetMsgProc(int code, WPARAM wParam, LPARAM lParam) { return ::CallNextHookEx(g_hHook, code, wParam, lParam); } BOOL WINAPI SetSysHook(BOOL bInstall, DWORD dwThreadId) { BOOL bOk; dwCurrentProcessId=dwThreadId; if(bInstall) { g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, ModuleFromAddress(GetMsgProc), 0); bOk = (g_hHook != NULL); } else { bOk = ::UnhookWindowsHookEx(g_hHook); g_hHook = NULL; } return bOk; } API 通過HOOK OpenProcess() 實現進程防殺2007-07-04 14:41在WINDOWS操作系統下,當我們無法結束或者不知道怎樣結束壹個程序的時候,或者是懶得去找“退出”按鈕的時候,通常會按“CTRL+ALT+DEL”呼出任務管理器,找到想結束的程序,點壹下“結束任務”就了事了,呵呵,雖然有點粗魯,但大多數情況下都很有效,不是嗎? 設想壹下,如果有這麽壹種軟件,它所要做的工作就是對某個使用者在某臺電腦上的活動作壹定的限制,而又不能被使用者通過“結束任務”這種方式輕易地解除限制,那該怎麽做?無非有這麽三種方法:1.屏蔽“CTRL+ALT+DEL”這個熱鍵的組合;2.讓程序不出現在任務管理器的列表之中;3.讓任務管理器無法殺掉這個任務。對於第壹種方法,這樣未免也太殘酷了,用慣了“結束任務”這種方法的人會很不習慣的;對於第二種方法,在WINDOWS 9X下可以很輕易地使用註冊服務進程的方法實現,但是對於WINDOWS NT架構的操作系統沒有這個方法了,進程很難藏身,雖然仍然可以實現隱藏,但實現機制較為復雜;對於第三種方法,實現起來比較簡單,我的作品:IPGate網址過濾器 就是采用的這種方式防殺的,接下來我就來介紹這種方法。 任務管理器的“結束任務”實際上就是強制終止進程,它所使用的殺手鐧是壹個叫做TerminateProcess()的Win32 API函數,我們來看看它的定義: BOOL TerminateProcess( HANDLE hProcess; // 將被結束進程的句柄 UINT uExitCode; // 指定進程的退出碼 ); 看到這裏,是不是覺得不必往下看都知道接下來要做什麽:Hook TerminateProcess()函數,每次TerminateProcess()被調用的時候先判斷企圖結束的進程是否是我的進程,如果是的話就簡單地返回壹個錯誤碼就可以了。真的是這麽簡單嗎?先提出壹個問題,如何根據hProcess判斷它是否是我的進程的句柄?答案是:在我的進程當中先獲得我的進程的句柄,然後通過進程間通訊機制傳遞給鉤子函數,與hProcess進行比較不就行了?錯!因為句柄是壹個進程相關的值,不同進程中得到的我的進程的句柄的值在進程間進行比較是無意義的。 怎麽辦?我們來考察壹下我的hProcess它是如何得到的。壹個進程只有它的進程ID是獨壹無二的,操作系統通過進程ID來標識壹個進程,當某個程序要對這個進程進行訪問的話,它首先得用OpenProcess這個函數並傳入要訪問的進程ID來獲得進程的句柄,來看看它的參數: HANDLE OpenProcess( DWORD dwDesiredAccess, // 希望獲得的訪問權限 BOOL bInheritHandle, // 指明是否希望所獲得的句柄可以繼承 DWORD dwProcessId // 要訪問的進程ID ); 脈絡漸漸顯現:在調用TerminateProcess()之前,必先調用OpenProcess(),而OpenProcess()的參數表中的dwProcessId是在系統範圍內唯壹確定的。得出結論:要Hook的函數不是TerminateProcess()而是OpenProcess(),在每次調用OpenProcess()的時候,我們先檢查dwProcessId是否為我的進程的ID(利用進程間通訊機制),如果是的話就簡單地返回壹個錯誤碼就可以了,任務管理器拿不到我的進程的句柄,它如何結束我的進程呢? 至此,疑團全部揭開了。由Hook TerminateProcess()到Hook OpenProcess()的這個過程,體現了壹個逆向思維的思想。其實我當初鉆進了TerminateProcess()的死胡同裏半天出也不來,但最終還是蹦出了靈感的火花,註意力轉移到了OpenProcess()上面,實現了進程防殺。喜悅之余,將這心得體會拿出來與大家分享。

參考資料:

/wlw7758/blog/item/9d109322816032f1d7cae2d7.html版權所有,謝絕抄襲!!!!!!

  • 上一篇:請問曹師傅改變形狀和方向的快捷鍵是什麽?
  • 下一篇:合肥通用職業技術學院郵編 附地址和介紹
  • copyright 2024編程學習大全網