如何对抗硬件断点之一 --- 调试寄存器
Author:Lenus
From: www.popbase.net
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