首页
社区
课程
招聘
[分享]编写驱动保护进程
发表于: 2019-2-22 11:55 18237

[分享]编写驱动保护进程

2019-2-22 11:55
18237

内核保护进程

使用驱动编写SSDT HOOK保护进程不被附加(win7下)

 

结果如图使用CE附加被保护的记事本程序会报错。


实现原理

三环程序附加进程最终会通过内核层的NtOpenprocess函数,内核层HOOK此函数判断PID是否为保护进程PID来返回结果达到保护目的。


NtOpenprocess函数的第四个参数为结构体,其中UniqueProcess字段为进程PID,根据这个字段判断PID

驱动的实现:

构建自己的MyNtOpenProcess函数与NtOpenProcess函数原型需一致,判断上述字段


构建好自己的函数后,需要获取当前NtOpenProcess地址

首先查看SSDT表(System Services Descriptor Table,系统服务描述符表)

typedef structServiceDescriptorTable{

   PVOIDServiceTableBase; //System Service Dispatch Table 的基地址

   PVOID ServiceCounterTable(0);//包含着SSDT 中每个服务被调用次数的计数器。这个计数器一般由sysenter更新。

   unsigned intNumberOfServices;//由ServiceTableBase 描述的服务的数目。

   PVOID ParamTableBase; //包含每个系统服务参数字节数表的基地址-系统服务参数表

   }  

搭建环境加载符号可以使用windbg指令查看dd poi [KeServiceDescriptorTable]


查看NtOpenProcess的调用号 U ZwOpenProcess指令


查看到调用号为0xBE(win7其他版本的调用号可能一样),编写代码获取


使用MmGetSystemRoutineAddress函数可以获取原函数NtOpenProcess的地址


当当前地址与原地址不同时,该函数已经被HOOK

构建一个JMP结构,方便理解



如果已经被HOOK需要将原函数地址填回当前位置,计算我们需要写入的地址

写入地址 = 原地址 - 当前地址 - 5(jmp及地址指令的大小)

因为分页有属性不能直接修改,将CR0控制寄存器的WP(为1时不能修改只读的内存页 )置0


在驱动的入口函数判断当前位置与原函数位置是否已经被HOOK

编写HOOK函数


和上面的差不多,只不过把地址改为我们自己构建的MyOpenProcess函数

取消的UNHOOK需要保存一下原来的地址,在调用UNHOOK时更改回来就可以了(不要忘了改wp属性)

在卸载驱动的函数上最好加上判断如果被hook还原,没有则跳过

最后在IRP的switch case语句上调用hook(并根据缓冲区来从三环获取PID)


至此驱动部分的核心代码逻辑差不多就这些

三环部分:

使用CreateFile打开驱动获取句柄

使用DeviceIoControl函数传输自定义控制码与内核交互传输PID


值得注意的是驱动与三环包含同意头文件时


三环需要包含#include<winioctl.h>,而驱动不需要,否则会报错

编译程序、驱动,在WIN7使用工具加载启动驱动


启动程序测试


由于边学边编写的简单进程保护,所以代码可能并不是很规范

驱动萌新谢谢

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 5
支持
分享
最新回复 (14)
雪    币: 195
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
沙发 支持
2019-2-22 12:33
0
雪    币: 351
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
快乐的萌小萌 沙发 支持[em_39]
支持
2019-2-22 13:05
0
雪    币: 1564
活跃值: (3572)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
4
OpenProcess(PID+1) 
2019-2-22 13:15
1
雪    币: 1535
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享~
2019-2-22 14:02
0
雪    币: 2306
活跃值: (3427)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
6
xiaofu OpenProcess(PID+1) [em_86]
我懂= =。。。
最后于 2019-2-22 14:05 被Cc28256编辑 ,原因:
2019-2-22 14:05
0
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
蟹蟹
2019-2-22 15:11
0
雪    币: 168
活跃值: (180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
支持
2019-2-22 15:23
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持
2019-3-7 09:38
0
雪    币: 6832
活跃值: (1637)
能力值: ( LV5,RANK:67 )
在线值:
发帖
回帖
粉丝
10
你安装驱动不报错嘛
2019-3-22 14:38
0
雪    币: 225
活跃值: (73)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
这个64位下问题有点恶心人!
2019-3-27 23:01
0
雪    币: 6977
活跃值: (1780)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
xiaofu OpenProcess(PID+1) [em_86]
想问下这个pid+1是什么意思,和原来的pid有关系吗?
2019-4-4 11:38
0
雪    币: 80
活跃值: (425)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个能直接用工具恢复的吧我记得
2020-10-5 21:35
0
雪    币: 6300
活跃值: (3832)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
有支持win8.1或者win10的吗?
2021-6-23 07:52
0
雪    币: 6628
活跃值: (1964)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
15
TopC 想问下这个pid+1是什么意思,和原来的pid有关系吗?
pid 是对齐的
2021-6-23 08:29
0
游客
登录 | 注册 方可回帖
返回
//