hook工具_SSDT-HOOK保护进程

实验环境:win7虚拟机
示例是对内核层进行SSDT-HOOK实现保护进程的功能

一会儿会用到的API是OpenProcess,在3环也就是用户层调用此API它保存一些信息传入到0环内核层后实际调用的是ZwOpenProcess函数,所以先使用OD随意打开一个.exe可执行程序,然后在kernel32模块里面查找OpenProcess函数,经过2个jmp后进入下一层,找到一个call进入其中便是ZwOpenProcess的调用。

64a3208fedc4a0de200e83752808dd68.png

d97d704d97a82678461b996f27851495.png

下面调用API代码才是我们需要注意的,每个API函数调用时在进入关键函数之前有一句汇编代码mov eax,0xXX,这是用eax保存一个调用号。

f92222cf6cc0e265be1909ee0fdaf75b.png

在进入内核层后,而每个调用号对应一个内核函数,为此Windows设计了一张表通过调用号作为序号,就能找到函数的地址。
Windows内核把这张函数地址表称为 : 系统服务描述表(System Service Descriptor Table ) 简称SSDT

6f62d74a2f238b4039cc98e50ae1bc19.png


例如根据之前截图知在调用ZwOpenProcess时调用号就是0xbe,那么我们如果通过调用号找到了函数地址,把这个地址替换成我们自己的函数,这样就能完成HOOK,类似于3环的IAT-HOOK。

在Windows内核中设计了两张系统服务描述符表,一张表是上述所说的SSDT,它只保存非用户界面相关的系统服务(例如创建文件、创建进程等);另一张表称为ShadowSSDT,它专门用于保存和用户界面相关的服务(例如创建窗口等),这两张表在内核中都使用了同一个结构体的表示:

8726e26c80e47c1b6ec3d3dab574a889.png

调用号

进入0环时调用号是eax传递的,但这个调用号并不只是一个普通的数字作为索引序号,系统会把他用32位数据表示,拆分成19:1:12的格式,如下:

178810bc9fbd5d4842a825d04ee0a8a7.png


分析一下0-11这低12位组成一个真正的索引号,第12位表示服务表号,13-31位没有使用。
而进入内核后调用哪一张表,就由调用号中的第12位决定,为0则调用SSDT表,为1则调用ShadowSSDT表。

想要对SSDT表进行HOOK,首先要找到SSDT表,可以通过服务表找到它,服务表存在于KTHREAD结构体的偏移为0xbc的一个字段中,可双机调试使用windbg查看,输入dt _kthread,然后再找到偏移为0xbc的字段

e85b0f3c73ebbc752b6815f6759240b4.png

019deaaa3bb848df9192647f2433ca2d.png

还是要说明一点KTHREAD这个结构体是未文档化的,所以里面的数据随着系统版本的不同各个字段偏移就有可能不同,所以使用前最好用windbg确认下所需要的字段偏移。

使用PsGetCurrentThread()函数可获取当前KTHREAD的首地址。
但是需要注意的是SSDT表所在的内存页属性是只读,没有写入的权限,所以需要把该地址设置为可写入,这样才能写入自己的函数。
我使用的是CR0寄存器关闭只读属性
简单介绍下CR0寄存器:

dd026f0c0feb21905c58427718703d99.png


可以看到这里使用32位寄存器,而在CR0寄存器中,我们重点关注的是3个标志位:
PE ­ 是否启用保护模式,置1则启用。
PG ­ 是否使用分页模式, 置1则开启分页模式, 此标志置1时, PE 标志也必须置1,否则CPU报异常。WP ­ WP为1 时, 不能修改只读的内存页 , WP为0 时, 可以修改只读的内存页。

所以在进行HOOK时,只要把CR0寄存器中的WP位置为0,就能对内存进行写入操作。
操作代码如下

9971cf8823a2eec2d683801106f0f682.png

2ee57d1498c5bd80fecbe35a89fbee90.png

609021cfc36ba32edc4eaa7c7bc8a6a9.png

生成.sys文件后使用工具安装驱动服务,然后打开任务管理器,关闭被保护的进程,就可以看到拒绝访问,到此保护进程就成功了。在这主要描述了SSDT-HOOK,HOOK的功能就可以去任意发挥了。

0579b1b6a7efe2da5a0fddc4dac64477.png

完整源码如下

834e6916631af7fec02b3143a9151cc4.png

本文由看雪论坛 九阳道人 原创

原文链接:https://bbs.pediy.com/thread-250832.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值