Windows 反訊息鉤子(2)

來源:互聯網
上載者:User

     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();    }   

  WINDOWS核心編程裡的用IAT的APIHOOK是不全面的。  

 ::GetProcAddress(::GetModuleHandle("kernel32.dll"),   "SetWindowsHookA");   

  就可以繞過。  

  APIHOOK最好的方法還是直接修改API進入點的代碼。

  同時HOOK   GetProcAddress   不就行了,但是要是對方使用搜尋PE函數匯出表的話就沒用

  防止IAT型的鉤子我要是對PE檔案的IAT加密,調用時解密調用,就可以了吧(極其複雜)  

  防止jmp型的鉤子我沒想到好辦法  
  防止調試我可以判斷api入口處是否有int3中斷代碼就可以了吧(簡單)

  訊息鉤子的反攔截其實核心是利用API攔截,來取消鉤子攔截.  

  如果API攔截被破解也就是說訊息鉤子反攔截沒有成功.


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.