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