首页
社区
课程
招聘
[原创]《逆向工程核心原理》-- Windows消息钩取
发表于: 2020-3-17 21:58 5423

[原创]《逆向工程核心原理》-- Windows消息钩取

2020-3-17 21:58
5423

钩子,英文Hook,泛指偷看或截取信息时所用的手段或工具。

Windows操作系统向用户提供GUI,它是以事件驱动(Event Driven)方式工作。事件发生后,OS将事先定义好的消息发送给相应的应用程序,应用程序分析收到的消息后执行相应动作。以敲击键盘为例,

常规Windows消息流:

附带钩子的信息流:

这是一个实现消息钩子的API,其定义如下:

hook proceduce是由操作系统调用的回调函数;安装消息钩子时,钩子过程需要存在于某个DLL内部,且该DLL的示例句柄即为hMod。

使用SetWindowsHookEx()设置好钩子后,在某个进程中生成指定消息时,OS就会将相关的DLL文件强制注入(injection)相应进程,然后调用注册的钩子程序。

以下以书上例子进行练习,首先过程原理图如下:

KeyHook.dll文件是一个含有钩子过程(KeyboardProc)的DLL文件,HookMain.exe是最先加载KeyHook.dll并安装键盘钩子的程序。HookMain.exe加载KeyHook.dll后使用SetWindowsHookEx()安装键盘钩子;若其他进程(如图中所示)发生键盘输入事件,OS就会强制将KeyHook.dll加载到像一个进程的内存,然后调用KeyboardProc()函数。

实验:HookMain.exe

关于实验操作部分建议跟随书上走一遍流程,体验Hook的魅力。

HookMain程序的主要源代码如下所示:

KeyHook.dll源代码:

总体上代码相对简单,调用导出函数HookStart()时,SetWindowsHookEx()函数就会将KetyboardProc()添加到键盘钩链。

安装好键盘钩子后,无论在哪个进程中,只要发生了键盘输入事件,OS就会强制将KeyHook.dll注入到进程中,加载了KeyHook.dll的进程,发生键盘事件时会首先调用执行KeyHook.KetyboardProc()。

KetyboardProc()函数中发生键盘输入事件时,会比较当前进程的名称与“notepad.exe”是否相同,相同返回1,终止KetyboardProc()函数,意味着截获并删除了消息,这样键盘消息就不会传递到notepad.exe程序的消息队列。

使用OD打开HookMain.exe文件:

我们关心的是核心的键盘钩取部分的代码,如何查找核心代码?

我们已经知道程序的功能,会在控制台显示字符串“press ‘q’ to quit!”,所以先检查程序导入的字符串(Search for -All referencen text strings):

地址40104d处引用了要查找的字符串,双击跳转:

来到main函数处。

在401000处下断,开始调试,了解main函数中主要的代码流。401006地址处调用LoadLibraryA(Keyhook.dll),然后由40104b地址处的CALL EBX指令调用KeyHook.HookStart()函数。跟进查看:

这里的代码是被加载到HookMain.exe进程中的KeyHook.dll的HookStart()函数,第一句就是调用SetWindowsHookExW()函数,在进行参数入栈操作后,我们可以在栈中看到函数的4个参数值。

《逆向工程核心原理》

 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 3
支持
分享
最新回复 (4)
雪    币: 7247
活跃值: (4446)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没有看过这本书,写的很好?
2020-3-17 22:51
0
雪    币: 4
活跃值: (129)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
赞一个   写的很详细
2020-3-17 23:47
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
阅读
2020-3-18 05:05
0
雪    币: 30
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
收藏,小白努力学习中。
2020-3-18 08:52
0
游客
登录 | 注册 方可回帖
返回
//