//用于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;
}
}
/******************************************************************************************/
inline hook MmIsAddressValid
最新推荐文章于 2022-05-25 23:05:30 发布