当前位置: 移动技术网 > 网络运营>安全>加解密 > 如何对抗硬件断点之一 调试寄存器

如何对抗硬件断点之一 调试寄存器

2018年04月19日  | 移动技术网网络运营  | 我要评论

Author:Lenus
From:
E-mail:Lenus_M@163.com

--------------------------------------------------
1.前言

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

2.正文
--------------------------------------------------
   i.硬件断点的原理

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

   对于Dr0-Dr3的四个调试寄存器,他们的作用是存放中断的地址,例如:401000
   对于Dr4,Dr5这两个寄存器我们一般不使用他们,保留
   对于Dr6,Dr7这两个寄存器的作用是用来记录你在Dr0-Dr3中下断的地址的属性,比如:对这个401000是硬件读还是写,或者是执行;是对字节还是对字,或者是双字。
  
   好了,从这里你可能明白一些东西。
   
1.   为什么在OD里面只能下4个硬件断点?  
2.   为什么下硬件断点有byte,word,dword只分?
3.   为什么下硬件断点有读,写,执行只分?

   ii.关于F4,F8,F7,F2的区别
   
   在ollydbug的help里面只是提到如何使用F7和F8的使用,并没说明他们的实现原理
  
   现在我们来做一个实验

实验一(F4的原理)

1.随便找一个程序,载入OD,构造一个死循环

就象这样:

00400154  >  90               nop                                   //EP停在这里
00400155     90               nop
00400156     90               nop
00400157     90               nop
00400158   ^ EB FA            jmp short 天2国际.<ModuleEntryPoint>  //构造一个死循环
0040015A     61               popad
0040015B     94               xchg eax,esp

2.对0040015A这一行按下F4,由于死循环,程序一直运行

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

结果在Drx里面显示:

DR0 0040015A                      //地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF0FF0                     //断点属性
DR7 00000401

实验二(F8原理)

1.随便找一个程序,载入OD,构造一个子程序的死循环

就像这样

00400154 t>  E8 0100D03F      call 4010015A         //EP,停在这里
00400159     90               nop
0040015A     90               nop               
0040015B     90               nop
0040015C     90               nop                //对这里下F2断点
0040015D     C3               retn              // 返回

2.按下F8,由于INT3断点,程序中断在0040015C

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

结果在Drx里面显示:

DR0 00400159                             //call的返回地址
DR1 00000000
DR2 00000000
DR3 00000000
DR6 FFFF4FF1                          //断点属性
DR7 00000401


实验三(F7原理)

1.随便找一个程序,载入OD

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

3.F9运行

结果程序断在了下面的一行

实验四(F2的原理)

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

004010CC N>  90               nop                                 //EP,挺在这里
004010CD     90               nop
004010CE   ^ EB FC            jmp short NOTEPAD.<ModuleEntryPoint> //死循环
004010D0     90               nop                                //在这里按下F2,普通断点
004010D1     90               nop

2.按下F9,由于死循环,程序一直运行着

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

4.重新载入OD

来看看成什么样子了

004010CC d> $Content$nbsp; 90             nop
004010CD    .  90             nop
004010CE    .^ EB FC          jmp short dumped.<ModuleEntryPoint>
004010D0       CC             int3                                  //这里变成了CC了
004010D1       90             nop

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

3.总结

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网