inline hook MmIsAddressValid

 
//用于inline hook
#include <ntddk.h>
KIRQL Irql;
extern PEPROCESS pEprocess;

/******************************************************************************************///   hook MmIsAddressValid
ULONG g_uCr0;
ULONG AddrOfOb;
BYTE OldAddr[5]={0};//保存被HOOK函数的前五个字节
BYTE HookAddr[5]={0XE9,0,0,0,0};  //JMP ADDR指令,HOOK时要改写后面四个字节
BYTE jmp_orig_code[7] = { 0xEA, 0, 0, 0, 0, 0x08, 0x00 };//长转移,需要绝对地址
//调用次序:
//ObReferenceObjectByHandle---JMP---MyObReferenceObjectByHandle(内部调用---GotoOriginalMmIsAddressValid(内部跳转到ObReferenceObjectByHandle)---)
//用于调用原始ObReferenceObjectByHandle
/*******************************************************************************************/

_declspec (naked) BOOLEAN GotoOriginalMmIsAddressValid(
	                  IN PVOID  VirtualAddress
)
{
	__asm {  // 共12字节
      _emit 0x90
      _emit 0x90
      _emit 0x90
      _emit 0x90
      _emit 0x90  // 前5字节实现原函数的头5字节功能
      _emit 0x90  // 这个填充jmp
      _emit 0x90
      _emit 0x90
      _emit 0x90
      _emit 0x90  // 这4字节保存原函数+5处的地址
      _emit 0x90  
      _emit 0x90  // 因为是长转移,所以必须是 0x0080
  };
}
//自己的实现函数
//导致XUETR0.45无法看到进程
__declspec (naked) BOOLEAN  MyMmIsAddressValid(
                       IN PVOID  VirtualAddress
)
{
	/*__asm
    {    
       pushad
       pushfd
    }*/
	if(VirtualAddress==pEprocess)
	  {
		  VirtualAddress=0;
		  _asm
		  {
			  jmp GotoOriginalMmIsAddressValid;//(Handle,DesiredAccess,ObjectType,AccessMode,*Object,HandleInformation);
		  }
	}  
	/*__asm
	{
		popfd
		popad
	}*/
	else
	{
	    _asm
        {
            jmp GotoOriginalMmIsAddressValid
        }
	}
}

void inlineHookMmIsAddressValid()
{
    ULONG uAttr;
    AddrOfOb=(ULONG*)MmIsAddressValid;
	DbgPrint("原始MmIsAddressValid地址:%X\n",AddrOfOb);
	//保存原函数前五个字节的内容
	RtlCopyMemory(OldAddr,(BYTE*)MmIsAddressValid,5);

	//保存新函数的偏移
	*(ULONG*)(HookAddr+1)=(ULONG)MyMmIsAddressValid-((ULONG)MmIsAddressValid+5);//相对地址

	//开始inline hook
    //关闭内存写保护

   
    _asm
    {
        push eax;
        mov eax, cr0;
        mov uAttr, eax;
        and eax, 0FFFEFFFFh; // CR0 16 BIT = 0
        mov cr0, eax;
        pop eax;
        ;cli
    }

    g_uCr0 = uAttr; //保存原有的 CRO

  
    //提升IRQL中断级
    Irql=KeRaiseIrqlToDpcLevel();

	RtlCopyMemory((BYTE*)MmIsAddressValid,HookAddr,5);//拷贝到原始函数5个字节
	*((ULONG*)(jmp_orig_code + 1)) = (ULONG)((BYTE*)MmIsAddressValid+5);//这4字节保存原函数+5处的地址
    RtlCopyMemory((BYTE*)GotoOriginalMmIsAddressValid,OldAddr,5);//拷贝原始函数5个字节到跳转函数前五个字节
    RtlCopyMemory((BYTE*)GotoOriginalMmIsAddressValid+ 5,jmp_orig_code,7);//填充跳转函数

	//恢复Irql
    KeLowerIrql(Irql);
    //开启内存写保护
    _asm
    {
        ;sti
        push eax;
        mov eax, g_uCr0; //恢原有 CR0
        mov cr0, eax;
        pop eax;
    }
}
/******************************************************************************************/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值