首页
论坛
课程
招聘

[转]如何对抗硬件断点之一 --- 调试寄存器

2005-2-4 22:51 55021

[转]如何对抗硬件断点之一 --- 调试寄存器

2005-2-4 22:51
55021
原文出处:
http://www.popbase.net/bbs/dispbbs.asp?boardID=5&ID=2377&page=1

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

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                          //断点属性
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> $  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还没有运行,只是把这个表示记录下来,当运行的时候他就把所有标记的字节修改了,尽管还是显示原来的代码,当然当他一暂停下来就又修改回来了。
   
     上面的是实验中,F7的原理只是猜测,还没有很好的办法能证明他就是使用TF,下面我继续猜测一下内存断点的原理

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

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

如果是内存写断点,就修改为RE(可读,可执行)
如果是内存访问断点,就修改为NO ACCESS(不可访问)

3.只要访问到这个页面就会产生相应的异常,然后由OD来判断是否与记录的断点一致,从而是否中断下来
   
--------------------------------------------------
4.后话
  
     对于上面的F7和内存断点的原理,我还没想出什么好的办法去找出OD的原理,或许去调试一下ollydbg.exe是一个不错的建议。如果有哪位兄弟知道有什么好办法,希望能告诉我。当然也很欢迎各位和我讨论。
   
     下面一篇将讨论,如何anti-hardbreakpoint。

     如果转载请保持文章完整,谢谢您能看完。

[推荐]看雪工具下载站,全新登场!(Android、Web、漏洞分析还未更新)

最新回复 (27)
小虾 10 2005-2-4 23:42
2
0
支持,等下篇Anti_hardbreakpoint。
采臣·宁 1 2005-2-5 00:22
3
0
好,顶啊顶
Lenus 3 2005-2-5 00:44
4
0
还记得对内存断点的问题一直有困惑的地方
是采臣兄点拨了我,要再道一声:谢谢
love8909 2005-2-5 10:57
5
0
为什么每次小lenus的帖子都是linhanshi兄转过来的?
prince 16 2005-2-5 11:17
6
0
期待下一篇!
支持Lenus!
kanxue 8 2005-2-5 11:41
7
0
最初由 love8909 发布
为什么每次小lenus的帖子都是linhanshi兄转过来的?


因为lenus只发表在他论坛上,我曾和linhanshi说过,在网上如看到“十分优秀”的相关文章(一般的文章不转帖),如作者允许转载的话,就转一份拷贝过来.转到这对lenus有好处,让更多的人认识他。;)
newpp 2005-2-5 11:47
8
0
If someone is interesting it,can take a look Intel Software Developes' Manual.
Lenus 3 2005-2-6 00:40
9
0
最初由 kanxue 发布


因为lenus只发表在他论坛上,我曾和linhanshi说过,在网上如看到“十分优秀”的相关文章(一般的文章不转帖),如作者允许转载的话,就转一份拷贝过来.转到这对lenus有好处,让更多的人认识他。;)

我想kanxue老大误会在下的意思了.
我并不是不愿意把文章放到看雪上,在这个给予我知识的地方,有太多的高手在看着我们的一言一行,象我这些小儿科的东西,只是在追求知识的道路上的一些心得,说真的这些东西,就来我再看一遍也觉得很幼稚,如果看过我这些东西的朋友也知道,我所写的只是最最简单的东西....(都是高手不屑一顾去说的)
不是不愿意放到看雪,只是没能找到一份让自己满意的文字能发表在看雪论坛这神圣的知识论坛里面,我不知道linhanshi兄弟如此,看得起在下的垃圾...我只是希望早一天能拿出一写至少起码连自己看起来还满意的文字,能自己放到这里.
我从以前到现在,以及将来都曾经,正在,一定会默默的支持着看雪论坛...
linhanshi 2005-2-6 00:48
10
0
Thanks!!!
发的邮件收到了没有
linhanshi@yahoo.com.cn
prince 16 2005-2-6 09:07
11
0
不用这么谦虚吧?Lenus兄,你这么说我以后还怎么发贴啊?
其实你看看你每篇文章的回贴率就知道你的文章是绝对受欢迎的~
希望加油继续,我还等着下一篇呢!
ljy3282393 1 2005-2-6 13:59
12
0
Lenus兄的文章详细易懂,非常适合我们这些小菜鸟观看!不象有些高手只写HOW(怎么做)不写WHY(为什么这样做)的!期待Lenus兄再写多几篇调试原理方面的文章给我们这些小菜鸟观看!
qiweixue 19 2005-2-6 15:22
13
0
最初由 love8909 发布
为什么每次小lenus的帖子都是linhanshi兄转过来的?


国际问题:石油换食品。。。
David 20 2005-2-7 12:15
14
0
不用太低调。
shoooo 16 2005-2-7 12:41
15
0
很好啊!
有些东西正好是欠缺的
不知道有没有API能直接对Dr0-Dr7进行操作的
DarkBull 18 2005-2-7 15:04
16
0
我用F8步过一个CALL时,代码如下:
004071C0  |. 53         PUSH EBX
004071C1  |. 56         PUSH ESI
004071C2  |. 57         PUSH EDI
004071C3  |. 8965 E8    MOV DWORD PTR SS:[EBP-18],ESP
004071C6  |. FF15 BCD04>CALL DWORD PTR DS:[<&KERNEL32.GetVersion>]             ;  kernel32.GetVersion
004071CC  |. 33D2       XOR EDX,EDX

此时打开断点窗口,显示:
Breakpoints,
item 0 Address=004071CC Module=MiSetup Active=One-shot Disassembly=XOR EDX,EDX
用WINHEX打开该模块内存004071CC处见0xCC.


学无止境...
采臣·宁 1 2005-2-7 15:06
17
0
过CALL肯定是把CALL后的指令为0XCC,跟入CALL才是单步
Sen 1 2005-2-8 01:33
18
0
Lenus,好~
playar 2005-2-21 17:32
19
0


图片倒数第2行
J_1_Joseph 2005-2-23 14:43
20
0
最初由 linhanshi 发布
原文出处:
http://www.popbase.net/bbs/dispbbs.asp?boardID=5&ID=2377&page=1

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

........

若用内存断点断某个dword,按照原理的话只要是这一页的(4k)都会断下,那岂不很不精确. 但我的调试里面都能仅仅断在我设置的地方啊, 这个怎么解释?
东方弘 2005-2-24 10:27
21
0
这样验证F7的功能看看怎么样:1、运行softice,faults off,i1here on(或bpint 1,二者或许有差异,应该都试试);2、运行 OD,忽略所有异常,随便加载一程序,f7运行看看softice窗口能否弹出,f8运行看看softice窗口能否弹出;3、若f7能弹出而f8不能弹出,则可确认f7用了单步中断(或单步标志,还可以进一步区分);4、若二者均弹不出softice窗口,修改所运行程序代码为f1(即单步中断的代码)再试试看:若能弹出窗口,则f7和f8一样用了调试寄存器。softice的命令可以在OD一切都准备好后再设置,以防控制权的先后夺取问题。
sunjing 2005-2-25 09:41
22
0
好文章,好文章
清清嗓子:我是一只小小小小鸟,想呀在看雪飞呀飞到高啊....
无奈无赖 2005-2-25 10:37
23
0
怎么能不支持...

我想说的大家都说了...呵呵
csdsjkk 1 2005-2-25 11:16
24
0
内存断点是利用“页异常”来处理,调试器将断点所在页标为"页不存在",
当访问该页时发生页不存在异常,调试器捕到异常后,取出发生异常的地址和断点比较,相等即表示触发了内存断点
hunter_boy 3 2005-2-25 12:30
25
0
学习
Fpc 4 2005-2-25 12:50
26
0
有道理。
F4断点用的是调试寄存器,普通断点是CC,用小程序都能证明。反跟踪也可以从这角度入手。
内存断点用的页属性
xoojo 2006-7-20 17:35
27
0
我的心情也一样
tosee 2006-8-21 09:42
28
0
虽然是菜鸟 有些还是不懂 还是顶
游客
登录 | 注册 方可回帖
返回