-
-
[分享]编写驱动保护进程
-
发表于:
2019-2-22 11:55
18506
-
内核保护进程
使用驱动编写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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!