ULONG pNtOpenProcess_TpHookAddress = 0; //TP的HOOK函数地址
ULONG pNtOpenProcess_ReturnAddress = 0; //返回到的地址
ULONG pNtOpenProcess_MyHookAddress = 0; //我们的HOOK函数在哪写入
PEPROCESS processEPROCESS = NULL; //保存访问者的EPROCESS
ANSI_STRING p_str1,p_str2; //保存进程名称
TOP5CODE *top5code = NULL; //保存字节内容
#define DNF_EXE "DNF.exe"
//////////////////////////////////////////////////////////////////////
// 名称: My_RecoveryHook_NtOpenThread
// 功能: 解除游戏保护对NtOpenThread 的HOOK
// 参数:
// 返回: 状态
//////////////////////////////////////////////////////////////////////
void My_RecoveryHook_NtOpenProcess ()
{
ULONG NtOpenProcessAddress = 0; //NtOpenProcess的地址
ULONG ObOpenObjectByPointerAddress = 0; //ObOpenObjectByPointer的地址
UCHAR JmpAddress[6] = {0xE9,0,0,0,0,0x90};
KIRQL Irql;
//获取NtOpenProcess的地址
NtOpenProcessAddress = (ULONG)MyGetFunAddress(L"NtOpenProcess");
ObOpenObjectByPointerAddress = (ULONG)MyGetFunAddress(L"ObOpenObjectByPointer");
//将p指向NtOpenProcess函数开始处
PUCHAR p = (PUCHAR)NtOpenProcessAddress;
//用一个无限循环来判断给定的特征码来确定被HOOK位置
ULONG i = 0;
while (i <1000)
{
if (*(p-7) == 0x50 &&
*(p-14) == 0x56 &&
*(p+3) == 0xFF &&
*(p+2) == 0x06 &&
*(p-1) == 0xDC &&
*p == 0xE8 &&
*(p+5) == 0x8B &&
*(p+6) == 0xF8 )
{
break;
}
i++;
p++;
}
//将top5code指向p 的当前处
//用以取出call [地址] 这字节里面的地址
top5code = (TOP5CODE*)p;
pNtOpenProcess_TpHookAddress = (ULONG)((ULONG)p+5+top5code2->address);
//找到我们写入自定义函数的地址
pNtOpenProcess_MyHookAddress = (ULONG)p- 6;
//保存调用ObOpenObjectByPointer函数以后的返回地址
pNtOpenProcess_ReturnAddress = (ULONG)p+5;
//将一条JMP Nakd_NtOpenProcess写入到数组中
*(ULONG *)(JmpAddress+1)=(ULONG)Nakd_NtOpenProcess - ((ULONG)pNtOpenProcess_MyHookAddress+5);
DisableWP(); //清除CR0
//提升IRQL中断级
Irql=KeRaiseIrqlToDpcLevel();
//写入
RtlCopyMemory((PVOID)pNtOpenProcess_MyHookAddress,JmpAddress,6);
//恢复Irql
KeLowerIrql(Irql);
EnableWP(); //恢复CR0
}
__declspec(naked) VOID Nakd_NtOpenProcess()
{
processEPROCESS = IoGetCurrentProcess();
RtlInitAnsiString(&p_str1,(PCSZ)((ULONG)processEPROCESS+0x174));
RtlInitAnsiString(&p_str2,DNF_EXE);
if (RtlCompareString(&p_str1,&p_str2,TRUE) == 0)
{
__asm
{
push dword ptr [ebp-38h]
push dword ptr [ebp-24h]
call pNtOpenProcess_TpHookAddress
mov eax, pNtOpenProcess_ReturnAddress
jmp eax
}
}
else
{
__asm
{
push dword ptr [ebp-38h]
push dword ptr [ebp-24h]
call ObOpenObjectByPointerAddress
mov eax,pNtOpenProcess_ReturnAddress
jmp eax
}
}
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课