欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

调试器设计_硬件断点

调试器设计_硬件断点

最近一直在实现一个有OD所有功能的调试器,下面给出对于实现部分的方法和遇到的问题,希望对也在实现调试器的朋友有所帮助。
设置内存断点和对输入表函数里面的函数等等,如果大家觉得需要,我在发帖写出来。
下面是硬件断点的设置问题。
主要实现代码是:
  
           CONTEXT cx;
  cx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
  if(FALSE==GetThreadContext(pi->hThread, &cx))
                
                {
                err=GetLastError();  
                }      
  cx.Dr0 = dwBreakPointAddress;//硬件断点地址
  
                cx.Dr7 |= 0x401;
  
                if(FALSE==SetThreadContext(pi->hThread, &cx))
               
               {
                err=GetLastError();  
                };
代码虽然很短,但是有很多需要注意的地方,比如,pi的权限,获取线程信息的时间。
我就只挑我出现问题的地方做出解释:
cx.ContextFlags = CONTEXT_DEBUG_REGISTERS;这句不能用CONTEXT_CONTROL。
看定义
#define CONTEXT_CONTROL         (CONTEXT_i386 | 0x00000001L) // SS:SP, CS:IP, FLAGS, BP  
知道为什么了吧。

这句
 cx.Dr7 |= 0x401;
设置dr7不是很复杂的问题,大家看看intel的手册就明白了 ,如果只想用dr0设置一个断点,那么这里用0x1或者0x101都可以。如果要有其他复杂的控制,就仔细看看Intel  的手册吧。
下硬件断点的时间需要重点注意下:
在进入调试循环后,第一次EXCEPT_BREAKPOINT就设置硬件断点,肯定不会行的(我在网上查资料的时候,看见很多人犯了这个错误),因为他不是main真正的现场CONTEXT(It's because at the time of the DEBUG_BREAK hasn't the main thread it's real context. NT sets the real context later via the NtContinue API. So a possible method to set a BPM directly at the EntryPoint...)。所以需要在入口地址后下断点 ,然后设置硬件断点。

其他问题和一些异常处理太多我就没有给出代码和分析了。

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功