-
-
[求助]关于调试寄存器部分的问题
-
发表于:
2005-6-17 14:44
4931
-
在P99页 “使用DRx调试寄存器框架程序”
当中断在dll.ntContinue后需要把DR0中的地址设置为程序的入口地址,
可是这时不能用SetContectThread而要用ESP的地址作为跳板,这是为什么??
不知道有没有详细点的资料???
另外,ESP作为跳板的代码是这样的
::GetThreadContext(pi.hThread, &Regs) ;
Regs.Dr0 = Regs.Dr7 = 0 ;
::SetThreadContext(pi.hThread, &Regs) ;
::ReadProcessMemory(pi.hProcess, (LPCVOID)(Regs.Esp+4), &dwAddrProc, sizeof(DWORD), NULL) ;
::ReadProcessMemory(pi.hProcess, (LPCVOID)dwAddrProc, &Regs, sizeof(CONTEXT), NULL) ;
Regs.Dr0 = dwBreakAddr ;
Regs.Dr7 = 0x101 ;
::WriteProcessMemory(pi.hProcess, (LPVOID)dwAddrProc, &Regs, sizeof(CONTEXT), NULL) ;
就我自己的理解dwAddrProc是指向PEB结构,至于ESP+4怎么会到这个位置,
就算我再怎么会幻想也想不出为什么
还有我在试验的时候,当中断到这部分(ntdll.ntContinue),当执行完WriteProcessMemory后,
如果我再用GetThreadContext取得修改后Regs进行验证
发现Regs中除了段寄存器和标志之外都变为0(当然包括EIP),
这样执行下去就产生访问错误。????
顺便再问个小问题,"::"存不存在有什么区别?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课