硬件调试:如何对抗硬件断点的一 --- 调试寄存器

  1.前言

  在我跨入ollydbg时候就对ollydbg里面各种断点充满了疑问以前我总是不明白普通断点内存断点硬件断点有什么区别他们为什么有些时候不能混用他们原理是什么在学习了前辈们文章以后终于明白了些东西希望这篇文章能让你对硬件断点原理和使用有些帮助

  2.正文

  --------------------------------------------------

  i.硬件断点原理

  在寄存器中有这么些寄存器它们用于调试人们把他们称为调试寄存器调试寄存器共有8个名字分别从Dr0-Dr7所以我们也把调试寄存器简单称为Drx

  对于Dr0-Dr3 4个调试寄存器他们作用是存放中断地址例如:401000

  对于Dr4Dr5这两个寄存器我们般不使用他们保留

  对于Dr6Dr7这两个寄存器作用是用来记录你在Dr0-Dr3中下断地址属性比如:对这个401000是硬件读还是写或者是执行;是对字节还是对字或者是双字

  好了从这里你可能明白些东西

  1. 为什么在OD里面只能下4个硬件断点? 

  2. 为什么下硬件断点有worddword只分?

  3. 为什么下硬件断点有读执行只分?

  ii.有关F4F8F7F2区别

  在ollydbughelp里面只是提到如何使用F7和F8使用并没介绍说明他们实现原理

  现在我们来做个实验

  实验(F4原理)

  1.随便找载入OD构造个死循环

  就象这样:

00400154 > 90       nop                 //EP停在这里
00400155  90       nop
00400156  90       nop
00400157  90       nop
00400158 ^EBFA      jmp天2国际.<ModuleEntryPo> //构造个死循环
0040015A  61       popad
0040015B  94       xchgeax,esp
  2.对0040015A这行按下F4由于死循环直运行

  3.调试器窗口里右键--查看调试寄存器

  结果在Drx里面显示:

DR00040015A           //地址
DR100000000
DR200000000
DR300000000
DR6FFFF0FF0          //断点属性
DR700000401
  实验 2(F8原理)

  1.随便找载入OD构造个子死循环

  就像这样

00400154t> E80100D03F   call4010015A    //EP停在这里
00400159  90       nop
0040015A  90       nop       
0040015B  90       nop
0040015C  90       nop        //对这里下F2断点
0040015D  C3       retn       //返回
  2.按下F8由于INT3断点中断在0040015C

  3.调试器窗口里右键--查看调试寄存器

  结果在Drx里面显示:

DR000400159              //call返回地址
DR100000000
DR200000000
DR300000000
DR6FFFF4FF1             //断点属性
DR700000401
  实验 3(F7原理)

  1.随便找载入OD

  2.双击调试器窗口里T标志将TF从原来0变成1

  3.F9运行

  结果断在了下面

  实验 4(F2原理)

  1.用98notepad吧载入OD构造个死循环

004010CCN> 90       nop                //EP挺在这里
004010CD  90       nop
004010CE ^EBFC      jmpNOTEPAD.<ModuleEntryPo>//死循环
004010D0  90       nop                //在这里按下F2普通断点
004010D1  90       nop
  2.按下F9由于死循环直运行着

  3.使用LordPE(不要用ollydump)将这个dump下来

  4.重新载入OD

  来看看成什么样子了

004010CCd>$ 90      nop
004010CD  . 90      nop
004010CE  .^EBFC     jmpdumped.<ModuleEntryPo>
004010D0   CC      3                 //这里变成了CC了
004010D1   90      nop
  --------------------------------------------------

  3.整理总结

  从实验和实验 2我们能清楚看到F4是直接将该行地址放入drx里面F8是将下地址放入到drx里面他们都使用了调试寄存器从实验 3中我们知道对于F7来说很可能使用是将TF置办法也就是说当我们按下F7时候OD把TF置对于F2来说他是将个字节悄悄修改成了CC虽然并没有显示给我看到这个是个CC当我们按下F2时候OD还没有运行只是把这个表示记录下来当运行时候他就把所有标记字节修改了尽管还是显示原来代码当然当他暂停下来就又修改回来了

  上面是实验中F7原理只是猜测还没有很好办法能证明他就是使用TF下面我继续猜测下内存断点原理

  1.将设置内存断点地址记录下来

  2.对这个地址内存页面修改其属性

  如果是内存写断点就修改为RE(可读可执行)

  如果是内存访问断点就修改为NOACCESS(不可访问)

  3.只要访问到这个页面就会产生相应异常然后由OD来判断是否和记录断点从而是否中断下来

  --------------------------------------------------

  4.后话

  对于上面F7和内存断点原理我还没想出什么好办法去找出OD原理,或许去调试下ollydbg.exe是个不错建议如果有哪位兄弟知道有什么好办法希望能告诉我当然也很欢迎各位和我讨论

Tags:  移位寄存器 通用寄存器 寄存器 硬件调试

延伸阅读

最新评论

发表评论