windows内核函数替换

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
	}
原文地址:https://www.cnblogs.com/amaoxiaozhu/p/2366365.html