csharp hook 简介

发布时间 2023-07-09 21:33:15作者: 凌枫玖

对于csharp的hook程序,基于manage的性质,不是hook自身进程内消息,就是hook全局windows消息。

一般我们hook都是native dll将它放入第三方进程的内存空间里去。

 

csharp里的几种hook方式

1. 在win32,winform或wpf的窗口内添加消息hook,这样接受的是只在该窗口上产生的消息。

2。SetWindowsHookEx。功能最齐全的钩子程序,尝试过后可以在自身应用线程窗口内插入钩子,也可以设置应用全局钩子,但是想给第三方程序注入时提示access deniny,想定可能是manage的原因,也可能不是native的原因,或者必须是同架构dll的形式?

3. SetWinEventHook,该钩子即可以指定全局,也可以指定针对某一进程与其UI thread,设置钩子时也需注意必须在自身的带消息循环的Thread上设置(如窗口应用的主线程),该api提供两组flag,一,是否上下文,二,排除跳过自身线程或进程。 根据manage特性,我感觉是.net是无法设置InContext的。

 

SetWinEventHook是简化后的钩子,提供了众多消息WinEvent,从0x00000001-0x7FFFFFFF?

https://learn.microsoft.com/zh-cn/windows/win32/winauto/event-constants

由系统发出的事件 EVENT_SYSTEM_,比如前台窗口变化的事件,也可以监控用户按下和释放alt tab。

针对 window handle 命名开头 EVENT_OBJECT_,0x8000开始。提供众多事件,如窗口位置改变,标题名称改变,收到可输入的键盘焦点,窗口的创建销毁等等。

EVENT_CONSOLE 控制台相关

 

SetWindowsHookEx 提供以下挂钩

-1 至 14 个,关于这些msdn都有 https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setwindowshookexa

只介绍一下自己感兴趣的,以及关于.net下的表现。

一,鼠标键盘钩子

WH_KEYBOARD WH_KEYBOARD_LL WH_MOUSE WH_MOUSE_LL

不知道为什么这些钩子序号这么乱,对于鼠标和键盘的钩子,LL是low layer,并且只能设置为全局挂钩。普通的键盘和鼠标挂钩对自身程序窗口hook没问题,但是无法对除自身以外的其他窗口。这样看SetWinEventHook是更具优势的,他是将别窗口消息回调上来了,也不需要incontext嵌入到别的程序空间内。而SetWindowsHookEx更像是需要注入代码,所以net下只能全局或自身hook用。

 

二,窗口消息事件

4 WH_CALLWNDPROC 安装一个挂钩过程,该过程在系统将消息发送到目标窗口过程之前对其进行监视。CallWindowProc。听起来更像是拦截消息用的

12 WH_CALLWNDPROCRET  安装挂钩过程,该挂钩过程在目标窗口过程处理消息后对其进行监视。 HOOKPROC

这俩者便是给win32窗口winform和wpf里安转钩子类似的WndProc的方法了,他们处理一个WH_CALLWNDPROCRET结构体

 

其他 

3 WH_GETMESSAGE  安装用于监视发布到消息队列的消息的挂钩过程。  GetMsgProc。专门用来监视? GetMessage 或 PeekMessage

WH_CBT 缩写,说是给computer-based training 应用用的,更与窗口的移动变化状态最大最小这些有关,和WinEvents相关。

-1 WH_MSGFILTER 与 6 WH_SYSMSGFILTER 安装一个挂钩过程,用于监视由于对话框、消息框、菜单或滚动条中的输入事件而生成的消息。 MessageProc

听上去这个很适合搞逆向断点做一些事儿。。也许只是想天然。

更详细的官方介绍 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks