防范Windows消息钩子的入侵

Windows消息钩子一般都很熟悉,它有很多用途,熟悉键盘输入的键盘进程,通过键盘钩子,可以获得各种密码,以达到别有用心的目的。答案是肯定的,但也存在缺陷。

首先,您可以简单地看到如何将全局钩子注入到其他进程中。

消息钩子由Win32子系统提供。其核心部分为用户提供了通过ntusersetwindowshookex设置消息钩子的系统服务和用户注册全局钩子穿过它。当系统取得了一些事件,如用户按键,键盘驱动keyEvent将扫描码转换成Win32K处理功能,处理功能,以确定是否有相应的钩,然后是callhook在这一点上,该系统获得了挂钩对象信息。如果目标进程不加载相应的Dll,则它将被加载。(KeUserModeCallback,调用用户程序它不同于APC呼叫。它是模仿中断来返回环境,它的调用是直接性质的)。

进入用户状态的KiUserCallbackDispatcher后,KiUserCallbackDispatcher就需要调用基于过去的数据的功能和参数,然后调用。在上面的例子中,加载钩子DLL,它被称为loadlibraryexw,然后进入ldrloaddll。加载完成后,它返回。以下步骤未被描述。

通过上面的讨论,我们可以在加载失败前绘制一个简单的反侵入方案:钩子钩子DLL API,但是存在一个缺点,即系统不会因为故障而放弃,每次尝试加载DLL时都会产生调用钩子系统的消息。这种性能影响不大,但不应感到。剩下的问题是,并不是所有的LoadLibraryExW应该被拦截,这是很容易解决的,如判断返回地址。例片段如下,可使某些钩子DLL允许负载。

这里HOOK API使用Detours库,它可以修改本身。 U3000 U3000

下面是程序代码:

Typedef HMODULE(__stdcall * loadlib)(

lpcwstr lpwlibfilename,

映射文件的句柄,

DWORD dwFlags);
U3000 U3000

externC{

detour_trampoline(hmodule __stdcall real_loadlibraryexw(

lpcwstr lpwlibfilename,

映射文件的句柄,

DWORD dwFlags),

LoadLibraryExW);

}
U3000 U3000

同步参数= 0;
U3000 U3000

hmodule __stdcall mine_loadlibraryexw(

lpcwstr lpwlibfilename,

映射文件的句柄,

DWORD dwFlags)

{

页地址;
U3000 U3000

_asm mov eax,{ 4 }电子书+

_asm MOV EAX地址,

U3000 U3000

如果((要0xffff0000)(地址= 0xffff0000))

{

返回0;

}
U3000 U3000

hmodule分辨率=(loadlib(real_loadlibraryexw))(

LpwLibFileName,

HFile,

dwFlags);
U3000 U3000

返回水库;

}
U3000 U3000

布尔processattach()

{

DetourFunctionWithTrampoline((PBYTE)real_loadlibraryexw,

(PBYTE)mine_loadlibraryexw);

返回true;

}

U3000 U3000
布尔processdetach()

{

DetourRemove((PBYTE)real_loadlibraryexw,

(PBYTE)mine_loadlibraryexw);

返回true;

}
U3000 U3000

canti_hookapp::canti_hookapp()文件: / /电话processattach在使用用户界面服务

{

参数=(ULONG)那么(user32. dll);

processattach();

}