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

	}

 

你可能感兴趣的:(windows)