我想调试个进程 该进程HOOK了NtOpenProcess
看图:
因为它会检测到是否被恢复了 所以不能直接恢复
我想了个办法 就是在call 之前jmp 到我的函数去 执行代码:
DWORD dwEditCodeAddress,dwRetAddress,dwObOpenObjectByPointer;
#pragma PAGECODE
__declspec(naked)VOID MyNtOpenProcess()
{
__asm
{
push dword ptr [ebp-38h]
push dword ptr [ebp-24h]
call dwObOpenObjectByPointer
mov edi,eax
lea eax,[ebp-0B8h]
push eax
mov ebx,dwRetAddress
jmp ebx //返回图上第三行红字那里
}
}
#pragma PAGECODE
VOID Hook()
{
UNICODE_STRING Us_ObOpenObjectByPointer,Us_NtOpenProcess;
DWORD dwNtOpenProcess;
//
RtlInitUnicodeString(&Us_ObOpenObjectByPointer,L"ObOpenObjectByPointer");
RtlInitUnicodeString(&Us_NtOpenProcess,L"NtOpenProcess");
//
dwObOpenObjectByPointer=(DWORD)MmGetSystemRoutineAddress(&Us_ObOpenObjectByPointer);//取得ObOpenObjectByPointer函数地址
dwNtOpenProcess=(DWORD)MmGetSystemRoutineAddress(&Us_NtOpenProcess);//取得NtOpenProcess函数地址
//
dwEditCodeAddress=dwNtOpenProcess+0x21e; //NtOpenProcess+0x21e是要修改的地址
dwRetAddress=dwNtOpenProcess+0x232; //这个是MyNtOpenProcess执行完毕后返回的地址
__asm
{
//去掉保护
cli
mov eax,cr0
and eax,not 10000h
mov cr0,eax
//修改NtOpenProcess
mov ebx,dwEditCodeAddress
mov al,0xe9
mov byte ptr[ebx],al //往要修改的地址里写入jmp
lea eax,MyNtOpenProcess
sub eax,ebx
sub eax,5
mov DWORD ptr[ebx+1],eax //写入jmp的函数地址
mov al,0x90
mov byte ptr[ebx+5],al //因为要修改代码处是6字节而jmp MyNtOpenProcess是5字节所以剩下一字节写入个NOP指令
//开启保护
mov eax,cr0
or eax,10000h
mov cr0,eax
}
}
不知道为什么在虚拟机里加载了编译出来的驱动可行 可是我要调试的程序不能再虚拟机里运行
在物理机不行 加载驱动后想打开OD就蓝屏了
这问题已经纠结了我好几天了 求高手帮个忙分析下啦
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课