快捷搜索:

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

}

您可能还会对下面的文章感兴趣: