欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

内核保护进程

使用驱动编写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使用工具加载启动驱动


启动程序测试


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

驱动萌新谢谢

上传的附件 DriverProtectprocess.zip
驱动加载器.rar

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功