Anti 消息钩子注入

MSDN上对消息钩子的描述:

The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread.

 ----------------------------------------------------------------------------------------------------------------------------


1.在内核中,NtUserSetWindowsHookEx函数会首先取得当前线程、当前进程、TEB等的一些信息。然后会调用IntAddHook函数。


2.IntAddHook函数会根据是全局HOOK,还是单进程的HOOK,把钩子插入不同的链表中




3.CallNextHookEx函数会根据不同的消息钩子类型调用不同的函数,如果是WH_CALLWNDPROC和WH_CALLWNDPROCRET类型的,就直接调用NtUserMessageCall函数。如果不是以上两者就会调用NtUserCallNextHookEx函数。

 

4.NtUserMessageCall又会根据传进来的typeid参数调用不同的函数。其中如果是上述的WH_CALLWNDPROC和WH_CALLWNDPROCRET类型的,则会调用co_IntCallHookProc函数。

 

5.co_IntCallHookProc函数经过一系列的参数赋值,初始化后,最后调用的是KeUserModeCallback返回Ring3去执行相应的回调函数。



6.当然上面的NtUserCallNextHookEx函数,经过稍微更加复杂的初始化后,最后调用的还是KeUserModeCallback函数去Ring3执行相应的回调函数。

NtUserCallNextHookEx->UserCallNextHookEx->co_HOOK_CallHookNext->co_IntCallHookProc->KeUserModeCallback

 

总结:

消息钩子的初始化和执行过程看起来思路都比较清晰。要Anti的话从SetWindowsHookEx开始,一路的调用都是可以做手脚的。

当然,还有比较猥琐的XX方法。

--------------------------------------------------------------------------------------------------------------------------

ps:

QQ管家的TCSafeBox.sys是采用的IAT HOOK KeUserModeCallback的方法来防止消息钩子注入的。不过其在判断注入的模块是否是系统常用模块时,采用了strstr函数。这样的话,我们可以随便构造一个目录就可以绕过了。



module_name_array 列表如下,是写死在代码里面的:



因此,我们只要构造一个类似“c:\\my\\Windows\\system32\\csrss.exe\\1.dll”这样的路径便可以实现注入QQ管家了。

本实例由VS2008开发,在提供了一套驱动开发框架的同时,又演示了如何获取Shadow SSDT表函数原始地址的办法。 主要函数:ULONG GetShadowSSDT_Function_OriAddr(ULONG index); 原理说明: 根据特征码搜索导出函数KeAddSystemServiceTable来获取Shadow SSDT基址,以及通过ZwQuerySystemInformation()函数获取win32k.sys基址,然后解析PE定位到Shadow SSDT在win32k.sys的偏移地址,并通过进一步计算来得到Shadow SSDT表函数的原始地址。 这里只测试了三个函数:(460)NtUserMessageCall、(475)NtUserPostMessage和(502)NtUserSendInput,具体使用时可以举一反三,网上完整的源代码实例并不太多,希望可以帮到真正有需要的朋友。 系统环境: 在WinXP SP3系统 + 瑞星杀毒软件 打印输出: [ LemonInfo : Loading Shadow SSDT Original Address Driver... ] [ LemonInfo : 创建“设备”值为:0 ] [ LemonInfo : 创建“设备”成功... ] [ LemonInfo : 创建“符号链接”状态值为:0 ] [ LemonInfo : 创建“符号链接”成功... ] [ LemonInfo : 驱动加载成功... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 开始... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP Enter IRP_MJ_DEVICE_CONTROL... ] [ LemonInfo : 获取ShadowSSDT表 (460)NtUserMessageCall 函数的“当前地址”为:0xB83ECFC4,“起源地址”为:0xBF80EE6B ] [ LemonInfo : 获取ShadowSSDT表 (475)NtUserPostMessage 函数的“当前地址”为:0xB83ECFA3,“起源地址”为:0xBF8089B4 ] [ LemonInfo : 获取ShadowSSDT表 (502)NtUserSendInput 函数的“当前地址”为:0xBF8C31E7,“起源地址”为:0xBF8C31E7 ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP_MJ_DEVICE_CONTROL 成功执行... ] [ LemonInfo : 派遣函数(DispatchRoutine) IRP 结束... ] [ LemonInfo : UnLoading Shadow SSDT Original Address Driver... ] [ LemonInfo : 删除“符号链接”成功... ] [ LemonInfo : 删除“设备”成功... ] [ LemonInfo : 驱动卸载成功... ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值