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