相关Hook技术及原理

R0权限只能让系统用,比较危险。R3权限为应用层用。大部分非驱动程序都是R3应用层的...

Hook也分为R0和R3两个层次。

R3应用层Hook又分为两种,一种是 API Hook,一种是系统钩子。

R0内核层Hook我只介绍一种,SSDT Hook

系统钩子:

系统钩子实质上是系统提供的一个API函数,叫做 SetWindowsHookEx(),可以拦截指定的13种消息类型
全局钩子包含这样13种消息类型:具体参考百度百科:http://baike.baidu.com/link?url=5-gmumJKhgDSvAZiYb018vhbevJ-kcfzkHxRPG2k8dClvJaFy473iL0FiixCA0waNeD16sosZQlWoMp9irvYoq
这个是系统提供的功能,百度百科也有详细的原理介绍。我也不太熟就不多说了...实在是用的太少

系统钩子应用:键盘鼠标监控/禁用等等

API Hook:

API Hook可以说是很简单很暴力的Hook方法。
要知道,程序调用一个API实质上调用的是那个API函数的入口地址。
也就是说,只要把API函数入口地址修改成我们自己的子程序的入口地址,那么程序就会调用API的时候调用到我们自己的子程序,从而实现Hook的效果
那么我们应该是这样做的:

寻找需要Hook的函数地址-修改地址改成自己的子程序地址-还原为原来的函数地址
举个例子,比如MessageBoxA()函数,它的地址是12345
我写了个子程序叫做MyMessageBoxA(),它的地址是56789
我们只要将MessageboxA()在内存里把存放函数地址的12345改成56789,
那么别人调用MessageBoxA()的时候就会调用到地址56789,也就是我们自己写的MyMessageBoxA()
至于我们是在自己的MyMessageBoxA()里怎么操作就随意了
是放行(Call调用原地址)
还是拦截(直接无视调用请求)
还是修改(修改参数后Call调用原地址)都可以

然而这时候我们会面临一个无法避免的问题:我们自己写的子程序在自己的进程空间内,和目标进程完全不在一起。事实上windows似乎无法跨进程访问
那么我们只能让子程序和目标进程在同一个进程空间内运行...这个就需要另外一项技术:dll注入
所以我们通常能看到封包助手,软件多开器之类的都会有个DLL...就是为了注入后Hook用的...
简单的说下API Hook的应用
封包拦截。hook send函数,这样发送封包(调用send函数)之前会先调用自己的函数,就可以获取甚至修改封包内容了
软件多开。已知道软件可以通过创建互斥体(一个api函数)来限制多开...也就是说我们只要Hook掉那个api...然后实现多开。

SSDT Hook:

所谓R0级的Root,其实还有种称呼:内核钩子
是杀毒软件广泛采用的一项技术(SSDT Hook已经落后了...很多杀毒软件都能在SSDT之前就Hook到...我就不吐槽我SSDT都要靠百度改源码什么的了)
这里要介绍下SSDT。
SSDT(System Services Descriptor Table),系统服务描述符表。这个表就是一个把ring3的Win32 API和ring0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数个数等。

知道这句话里包含着什么?我们从R3层调用的API函数实质上要通过查询SSDT获取R0层的真正地址...

这意味着如果我们可以把SSDT里的地址修改掉,就可以实现全局API Hook的效果。
不过权限问题← ←R3无驱进R0有多困难我就不吐槽了...你们可以自己试试...
驱动(Sys)加载后本身就是R0权限...所以R0层的Hook基本都会要写驱动...
具体实现方法不说了,我也不会← ←到了这个层次不会汇编真的没法玩...坑出翔....

有兴趣自己百度,我相信你们的智慧

说下SSDT Hook的具体应用吧

1、已知关闭进程需要用函数TerminateProcess()。
2、调用TerminateProcess之前需要调用OpenProcess()获取进程句柄。
3、那么我们如果Hook掉OpenProcess函数,检测到如果是某个指定进程就不调用OpenProcess而是去返回获取句柄失败。那么会怎样呢?
4、Windows任务管理器尝试关闭进程,会因为OpenProcess在SSDT被Hook,访问到你的子程序。然后你的子程序告诉了任务管理器:打开进程失败

于是任务管理器就会返回一个经典的提示:无法完成操作 拒绝访问(收集于网络,作者不详)

以前没有PG的时候,相信绝大部分人都是用的SSDT HOOK 来进行进程保护的。
等有了PG该怎么办呢?答案就是用微软提供的 ObRegisterCallbacks 函数。


发布日期:

所属分类: 易语言