//获得调用者的EPROCESS
g_processEPROCESS = IoGetCurrentProcess();
KdPrint(("EPROCESS=%x",g_processEPROCESS));
//将调用者的进程名保存到str1中
RtlInitAnsiString(&p_str1,(CONST char *)(ULONG)g_processEPROCESS+0x174);
//将我们要比对的进程名放入str2
RtlInitAnsiString(&p_str2,DNF_EXE); (1)
获得调用者进程名是是DNF.EXE 被调用 就执行第一个 不是执行第二个
if (RtlCompareString(&p_str1,&p_str2,TRUE) == 0)
{
//说明是DNF进程访问了这里
__asm
{
push dword ptr [ebp-38h]
push dword ptr [ebp-24h]
push g_ProcessReturnAddress
mov eax,g_ProcessGameHookAddress
jmp eax
}
}
else
{
__asm
{
push dword ptr [ebp-38h]
push dword ptr [ebp-24h]
push g_ProcessReturnAddress
mov eax,g_ProcessObjByPointer
jmp eax
}
}
这是两个不同的函数
/*#pragma PAGECODE
void __declspec(naked) myInt3Proc()
{
__asm
{
pushf
}
//获取进程上下文
PEPROCESS EP;
ULONG jmpaddr;
EP=PsGetCurrentProcess();
//这个 函数 在DDK里面也是 获得调用者进程名 那他不是 notepad.exe 作为调用者了 吗 明明 是要把 notepad.exe 保护起来 确破坏他 这样不是错了吗
这里变成了 是 notepad.exe调用次函数 就 执行第一个蓝屏 不是就执行第二个 // (PTSTR)((ULONG)EP+0x174)是否等于 需要反断点的进程
if (strcmp((PTSTR)((ULONG)EP+0x174),"notepad.exe")==0)
{
//需要保护的进程 直接反回
KdPrint(("\n ------------ __asm iretd 直接返回;--------\n"));
__asm iretd;
}else
{
KdPrint(("\n ------------ entry myInt3Proc 正常执行 ;--------\n"));
//不是需要保护 正常执行
//jmp 回原int3proc_addr+5位置运行
jmpaddr=int3proc_addr;
// KdPrint(("\n ------------jmp jmpaddr 不需要保护正常执行 int 3;---------\n"));
__asm
{
popf
}
__asm
{
push 0
mov word ptr [esp+2], 0
add jmpaddr,9
jmp jmpaddr
}
}//end else
}*/
百思不得其解
到底 PsGetCurrentProcess();和 IoGetCurrentProcess(); 有啥区别 是获得调用者进程名 还是获得 被访问者进程名 就是说 我用OD打开 QQ.exe
那获取的到底是 OD。EXE 还是qq.exe 两个都是一样吗
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)