首页
社区
课程
招聘
看雪请进(关于<<内幕>>一书中的DRx调试寄存器)
发表于: 2005-3-1 18:14 7332

看雪请进(关于<<内幕>>一书中的DRx调试寄存器)

2005-3-1 18:14
7332
在书中看到给出的C代码,翻译成c++(bcb)后如下:

但在调试过程中发现根本无法捕捉设置DR0后的单步中断异常,结果
iTotal始终为1!!
请看雪老师帮忙检查下面这段翻译后的代码是否有误.

  do
  {
    ::WaitForDebugEvent(&DBEvent,INFINITE);
    dwState=DBG_EXCEPTION_NOT_HANDLED;
    switch(DBEvent.dwDebugEventCode)
    {
        case EXCEPTION_DEBUG_EVENT:
        {
           switch(DBEvent.u.Exception.ExceptionRecord.ExceptionCode)
               {
                   case EXCEPTION_BREAKPOINT:
                   {
                       ++dwBpCnt;
                       if(dwBpCnt==1)
                       {
                         ::GetThreadContext(pi.hThread,&Regs);
                         Regs.Dr0=(DWORD)(::GetProcAddress(::GetModuleHandle("ntdll.dll"),"NtContinue"));
                         Regs.Dr7=0x101;
                         ::SetThreadContext(pi.hThread,&Regs);
                        
                         dwState=DBG_CONTINUE;
                       }
                       break;
                   }
                   case EXCEPTION_SINGLE_STEP:
                   {
                       ++dwSSCnt;
                       if(dwSSCnt==1)
                       {
                           ::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);
                           dwState=DBG_CONTINUE;
                       }
                       else if(dwSSCnt==2)
                       {
                           ::GetThreadContext(pi.hThread,&Regs);
                           Regs.Dr0=Regs.Dr7=0;
                           Regs.EFlags|=0x100;
                           ::SetThreadContext(pi.hThread,&Regs);
                           ++iTotal;
                           dwState=DBG_CONTINUE;
                       }
                       else
                       {
                           ::GetThreadContext(pi.hThread,&Regs);
                           Regs.EFlags|=0x100;
                           ::SetThreadContext(pi.hThread,&Regs);
                           ++iTotal;
                           dwState=DBG_CONTINUE;
                       }
                       break;
                   }
               }
               break;
        }
        case EXIT_PROCESS_DEBUG_EVENT:
        {
            ++iTotal;
            STOP=true;
            Edit1->Text=iTotal;
            ShowMessage("over!");
            //::ExitProcess(-1);
            break;
        }
    }
    if(!STOP) {::ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,dwState);}
  }while(!STOP);

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 50161
活跃值: (20610)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
什么系统?
我将你的问题转给了原文作者罗翼了。
2005-3-2 15:16
0
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
windows xp + sp2

我测试多次问题依然存在. 从网上搜索到的资料来看基本都是用
的同样的方法来进行调试寄存器的设置,但愿不是系统的问题!:(
2005-3-2 17:36
0
雪    币: 156
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这个段
::GetThreadContext(pi.hThread,&Regs);
                         Regs.Dr0=(DWORD)(::GetProcAddress(::GetModuleHandle("ntdll.dll"),"NtContinue"));
                         Regs.Dr7=0x101;
                         ::SetThreadContext(pi.hThread,&Regs);

是必须吗 ?
第三版上面 有一个 直接用 drx 寄存器的方法,
不知道这个连个的区别
哪位老大 总结总结吧
2009-5-10 22:18
0
游客
登录 | 注册 方可回帖
返回
//