亚洲免费人人妻人人,cao78在线视频,福建一级毛片,91精品视频免费观看,高清另类图片操逼,日本特黄特色大片免费看,超碰欧美人人澡曰曰澡夜夜泛

防止全局鉤子的侵入 -電腦資料

電腦資料 時間:2019-01-01 我要投稿
【www.msguai.com - 電腦資料】

    Author: pjf(jfpan20000@sina.com)

    Windows消息鉤子一般都很熟悉了,

防止全局鉤子的侵入

。它的用處很多,耳熟能詳?shù)木陀小面I盤鉤子獲取目標(biāo)進程的鍵盤輸入,從而獲得各類密碼以達到不可告人的目的。朋友想讓他的軟件不被別人的全局鉤子監(jiān)視,有沒有辦法實現(xiàn)呢?答案是肯定的,不過缺陷也是有的。

    首先簡單看看全局鉤子如何注入別的進程。

    消息鉤子是由Win32子系統(tǒng)提供,其核心部分通過NtUserSetWindowsHookEx為用戶提供了設(shè)置消息鉤子的系統(tǒng)服務(wù),用戶通過它注冊全局鉤子。當(dāng)系統(tǒng)獲取某些事件,比如用戶按鍵,鍵盤driver將掃描碼等傳入win32k的KeyEvent處理函數(shù),處理函數(shù)判斷有無相應(yīng)hook,有則callhook。此時,系統(tǒng)取得Hook對象信息,若目標(biāo)進程沒有裝載對應(yīng)的Dll,則裝載之(利用KeUserModeCallback"調(diào)用"用戶例程,它與Apc調(diào)用不同,它是仿制中斷返回環(huán)境,其調(diào)用是"立即"性質(zhì)的)。

    進入用戶態(tài)的KiUserCallbackDispatcher后,KiUserCallbackDispatcher根據(jù)傳遞的數(shù)據(jù)獲取所需調(diào)用的函數(shù)、參數(shù)等,隨后調(diào)用。針對上面的例子,為裝載hook dll,得到調(diào)用的是LoadLibraryExW,隨后進入LdrLoadDll,裝載完畢后返回,后面的步驟就不敘述了。

    從上面的討論我們可以得出一個最簡單的防侵入方案:在加載hook dll之前hook相應(yīng)api使得加載失敗,不過有一個缺陷:系統(tǒng)并不會因為一次的失敗而放棄,每次有消息產(chǎn)生欲call hook時系統(tǒng)都會試圖在你的進程加載dll,這對于性能有些微影響,不過應(yīng)該感覺不到。剩下一個問題就是不是所有的LoadLibraryExW都應(yīng)攔截,這個容易解決,比如判斷返回地址。下面給出一個例子片斷,可以添加一些判斷使得某些允許加載的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() //在使用用戶界面服務(wù)前調(diào)用ProcessAttach

    {

    user32 = (ULONG)GetModuleHandle("User32.dll");

    ProcessAttach();

    出處:http://www.blogcn.com/user17/pjf/blog/4432308.html

最新文章