萬盛學電腦網

 萬盛學電腦網 >> 健康知識 >> 防止Windows全局鉤子的入侵

防止Windows全局鉤子的入侵

  Windows消息鉤子一般都很熟悉了。它的用處很多,耳熟能詳的就有——利用鍵盤鉤子獲取目標進程的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟件不被別人的全局鉤子監視,有沒有辦法實現呢?答案是肯定的,不過缺陷也是有的。   首先簡單看看全局鉤子如何注入別的進程。   消息鉤子是由Win32子系統提供,其核心部分通過NtUserSetWindowsHookEx為用戶提供了設置消息鉤子的系統服務,用戶通過它注冊全局鉤子。當系統獲取某些事件,比如用戶按鍵,鍵盤driver將掃描碼等傳入win32k的KeyEvent處理函數,處理函數判斷有無相應hook,有則callhook。此時,系統取得Hook對象信息,若目標進程沒有裝載對應的Dll,則裝載之(利用KeUserModeCallback“調用”用戶例程,它與Apc調用不同,它是仿制中斷返回環境,其調用是“立即”性質的)。   進入用戶態的KiUserCallbackDispatcher後,KiUserCallbackDispatcher根據傳遞的數據獲取所需調用的函數、參數等,隨後調用。針對上面的例子,,為裝載hook dll,得到調用的是LoadLibraryExW,隨後進入LdrLoadDll,裝載完畢後返回,後面的步驟就不敘述了。   從上面的討論我們可以得出一個最簡單的防侵入方案:在加載hook dll之前hook相應api使得加載失敗,不過有一個缺陷:系統並不會因為一次的失敗而放棄,每次有消息產生欲call hook時系統都會試圖在你的進程加載dll,這對於性能有些微影響,不過應該感覺不到。剩下一個問題就是:不是所有的LoadLibraryExW都應攔截,這個容易解決,比如判斷返回地址。下面給出一個例子片斷,可以添加一些判斷使得某些允許加載的hook dll被加載。   這裡hook api使用了微軟的detours庫,可自行修改。
  以下內容為程序代碼: typedef HMODULE (__stdcall *LOADLIB)( LPCWSTR lpwLibFileName, HANDLE hFile, DWORD dwFlags); extern "C" {   DETOUR_TRAMPOLINE(HMODULE __stdcall Real_LoadLibraryExW(                LPCWSTR lpwLibFileName,                HANDLE hFile,                DWORD dwFlags),               LoadLibraryExW); } ULONG user32 = 0; HMODULE __stdcall Mine_LoadLibraryExW(        LPCWSTR lpwLibFileName,        HANDLE hFile,        DWORD dwFlags) {   ULONG addr;   _asm mov eax, [ebp 4]   _asm mov addr, eax   if ((user32 & 0xFFFF0000) == (addr & 0xFFFF0000))   {     return 0;   }   HMODULE res = (LOADLIB(Real_LoadLibraryExW)) (             lpwLibFileName,             hFile,             dwFlags);   return res; } BOOL ProcessAttach() {   DetourFunctionWithTrampoline((PBYTE)Real_LoadLibraryExW,          (PBYTE)Mine_LoadLibraryExW);   return TRUE; } BOOL ProcessDetach() {   DetourRemove((PBYTE)Real_LoadLibraryExW,          (PBYTE)Mine_LoadLibraryExW);   return TRUE; } CAnti_HookApp::CAnti_HookApp() //在使用用戶界面服務前調用ProcessAttach {   user32 = (ULONG)GetModuleHandle("User32.dll");   ProcessAttach(); }
copyright © 萬盛學電腦網 all rights reserved