首页
社区
课程
招聘
[求助]关于调试寄存器部分的问题
发表于: 2005-6-17 14:44 4931

[求助]关于调试寄存器部分的问题

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直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
2
没人??
2005-6-18 22:17
0
雪    币: 223
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是 没人  是偶看不懂
2005-6-20 14:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
参照:(转)
调试寄存器(DRx)理论与实践
By Hume/冷雨飘心

究其原因在于在2K/Xp下程序收到第一个断点异常时被调试程序的主线程内容并未准备好,是无效的!很奇怪但确实如此,这时根本不能通过CONTEXT设置断点或单步等。解决方案之一是Elicz提出来的,就是先在调试程序收到的第一个断点中断中给NtContinue设一bpm断点,截获其第一个参数(Regs.Esp+4),这个参数就是指向即将初始化为主线程有效CONTEXT内容的指针,通过在其内设置一个bpm断点,就可以中断在我们想要中断的任何位置。
2005-12-1 02:52
0
游客
登录 | 注册 方可回帖
返回
//