千里之行,始于足下!
今天是正式启程的第一天,一直明白自己的缺点就是不够坚持,同时没有坚定目标,或许是目标不够诱人吧。但是如果我可以成为这个领域中相当牛逼的人,那还是十分有吸引力的。
之前学习的过程中,学会了一项技术,时常感觉“无用武之地”,这应该是我自己学习的一个误区,之后自己会多在实战中检验技术,也希望有大佬多多指点。
本文内容
本文将简单介绍Windows Hook的基本内容,以及一些自己的看法,希望可以帮助您快速了解这一内容。
HOOK是什么?
Hook,中文里常常被译作“钩子”或者“挂钩”,其实是Windows操作系统里的一种中断消息机制。
是一种可以改变程序执行流程的技术,也就是讲程序原有的执行流程拦截,更改程序流向,并可以执行自己新代码的技术。
举个不恰当的例子:
通俗来说,就是一条高速公路,我们去追击一个罪犯(要截获的消息或事件),然后在他要经过的地方提前埋下埋伏,等到罪犯到来时,实现截获,并执行自己的操作。
或者说我们就是坏蛋,在要道打劫好人,“此树是我栽,此路是我开,要想过此路,留下买路财”
Hook可以干什么?
Hook技术被广泛应用于安全的多个领域,比如杀毒软件的主动防御功能,涉及到对一些敏感API的监控,就需要对这些API进行Hook;窃取密码的木马病毒,为了接收键盘的输入,需要Hook键盘消息;甚至是Windows系统及一些应用程序,在打补丁时也需要用到Hook技术。
Hook的基本原理
Hook技术的原理的:就是修改程序的运行时PC“指针”,让程序跳到我们指定的代码中运行,运行完我们的程序,程序PC指针又回到原来程序的下一条指令。简而言之:就篡改程序的运行路径,来执行我们的程序。
示例:
在notepad.exe和kernel32.dll之间挂上一个“钩子”,把它们要使用的CreateFile()函数替换掉,换成MyCreateFile()函数,实现我们想要的自定义功能。
Hook的基本类型
Hook大体分为应用层和内核层Hook;(这里暂时不完整,后续将补充)
应用层Hook:
- 消息Hook
- 注入Hook
- inline Hook
- IAT Hook
- HoxFix Hook
- 调试Hook
内核层Hook:
- SSDT Hook
常见Hook技术介绍
API函数都保存在操作系统提供的DLL文件中,当在程序中调用某个API函数并运行程序后,程序会隐式地将API函数所在的DLL文件加载入内存中,这样,程序就会像调用自己的函数一样调用API。Inline Hook这种方法是在程序流程中直接进行嵌入jmp指令来改变流程的。
Inline Hook流程
- 构造跳转指令。
- 在内存中找到欲Hook函数地址,并保存欲Hook位置处的前5字节。
- 将构造的跳转指令写入需Hook的位置处。
- 当被Hook位置被执行时会转到自己的流程执行。
- 如果要执行原来的流程,那么取消Hook,也就是还原被修改的字节。
- 执行原来的流程。
- 继续Hook住原来的位置
这就是Inline Hook的大概流程。
-
导入地址表钩子-IAT HOOK
导入地址表是PE文件结构中的一个表结构。在可执行文件中使用其他DLL可执行文件的代码或数据,成为导入或者输入。当PE文件需要运行时,将被系统加载至内存中,此时windows加载器会定位所有的导入的函数或者数据将定位到的内容填写至可执行文件的某个位置供其使用。这个地位是需要借助于可执行文件的导入表来完成的。导入表中存放了所使用的DLL的模块名称及导入的函数名称或函数序号。
在加壳和脱壳的研究中,导入表是非常关键的部分。加壳要尽可能地隐藏或破坏原始的导入表。脱壳一定要找到或者还原或者重建原始的导入表,如果无法还原或修过脱壳后的导入表的话,那么可执行文件仍然是无法运行的。
-
windows钩子函数
windows下的窗口应用程序是基于消息驱动的,但是在某种情况下需要捕获或者修改消息,从而完成一些特殊的功能。对于捕获消息而言,无法使用IAT或Inline Hook之类的方式去进行捕获,不过windows提供了专门用于处理消息的钩子函数。
windows系统提供的钩子按照挂钩范围分为局部钩子和全局钩子。局部钩子是针对一个线程的,而全局钩子这是针对这个操作系统内基于消息机制的应用程序的。全局钩子需要使用DLL文件,DLL文件里面存放了钩子函数的代码。
在操作系统中安装全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自动或强行加载到该进程中,由此可见,设置消息钩子也是一种可以进行DLL注入的方法。
windows下的钩子函数,主要用3个,分别是SetWindowsHookEx() 、CallNextHookEx()和UnhookWindowsHookEx()
聊聊Hook现状
上面只是对Hook做了简要的介绍,包括它是什么,可以做什么以及分类。
但是它作为一个比较老的技术,现在教程和实践有较为缺乏的时候,很多教程和书籍中的技术都已经略有过时,已经不能在实际的攻防中发挥作用。
展望
实话实说,现在网上大部分资料都比较老,目前看来,难以在当前Windows 10环境中发挥作用,但是作为学习所用还是受益无穷的,我将从这些教程中取长补短,尽可能地去探索在当下环境使用的可能性。
并且了为了技术的发展,我将尽可能多地使用C++的一些新特性,并遵守一些代码规范,和完整的代码检验流程,整理出规范优美的代码。
参考资料
《逆向工程核心原理》