PS: 毕业设计的题目定了,开工了。想起同事的微博,要把勤奋的小人复活!
对于监控系统,替换必要的函数为自己使用是很重要的,用到简单的替换ssdt表中的跳转地址就可以实现
1. 首先要创建好自己的fake函数,例如监控阻止某进程创建子进程或可以使用空指针替换ZwCreateProcess
NTSTATUS FakedZwCreateProcess {
if !needblock(进程名)
return RealZwCreateProcess
else
return STATUS_SUCCESS
2 找到替换函数的dll的地址
网上这个函数很多了~大概就是
2 保存旧函数入口地址
函数地址中第二位就是在ssdt表中的偏移量可以通过*(DWORD(address)+1)来获取
这样
RealZwCreateProcess = (ZWCREATEPROCESS)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + position));
就实现了保存旧函数入口地址的功能
3 在驱动中根据传过来IRP的参数,进行设定on和off函数
如果是开启过滤就通过禁用中断、更换CR0的写保护位,把替换函数地址更换为fake函数
_asm { CLI //disable interrupt MOV EAX, CR0 //move CR0 register into EAX AND EAX, NOT 10000H //disable WP bit MOV CR0, EAX //write register back } (ZWCREATEPROCESS)(*(((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase + position)) = FakedZwCreateProcess ; _asm { MOV EAX, CR0 //move CR0 register into EAX OR EAX, 10000H //enable WP bit MOV CR0, EAX //write register back STI //enable interrupt }