虫虫联盟

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 2414|回复: 6

[转载引用] 硬件断点的原理 ---- OD各种断点的原理

[复制链接]
  • TA的每日心情
    郁闷
    2016-2-6 23:12
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    17

    主题

    94

    帖子

    953

    积分

    高级会员

    Rank: 4

    积分
    953

    猴年

    晨曦小月 发表于 2015-11-26 19:54:15 | 显示全部楼层 |阅读模式

    转自C博客,本人觉得不错,拿来分享一下

    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是一个不错的建议。如果有哪位兄弟知道有什么好办法,希望能告诉我。当然也很欢迎各位和我讨论。
       
          如果转载请保持文章完整,谢谢您能看完。


  • TA的每日心情
    郁闷
    2016-2-6 23:12
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    17

    主题

    94

    帖子

    953

    积分

    高级会员

    Rank: 4

    积分
    953

    猴年

     楼主| 晨曦小月 发表于 2015-11-26 19:56:22 | 显示全部楼层
    鼓励一下
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 1491 天

    [LV.10]以坛为家III

    209

    主题

    1566

    帖子

    1万

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    10735

    处女座

    血海无边 发表于 2015-11-26 23:10:04 | 显示全部楼层

    你的od F7是下断点?不是步进吗?你的odF4是什么热键
    你的意思是步进和步过都是用硬件断点,只是放进DRx的地址不同而已,而F2就是IN3断点
  • TA的每日心情
    擦汗
    2016-9-14 10:38
  • 签到天数: 33 天

    [LV.5]常住居民I

    4

    主题

    93

    帖子

    336

    积分

    中级会员

    Rank: 3Rank: 3

    积分
    336
    gxjsmm 发表于 2016-8-18 23:19:36 | 显示全部楼层
    本人觉得不错
  • TA的每日心情
    奋斗
    2017-12-22 08:54
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    1

    主题

    24

    帖子

    79

    积分

    注册会员

    Rank: 2

    积分
    79
    198738655 发表于 2017-12-20 09:46:08 | 显示全部楼层
      老哥们,我想请教一个问题。我已经到了法定结婚年龄,去民政局领证的时候老婆是自己带还是等他们发?
  • TA的每日心情
    奋斗
    2017-12-22 08:54
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    1

    主题

    24

    帖子

    79

    积分

    注册会员

    Rank: 2

    积分
    79
    198738655 发表于 2017-12-20 09:46:53 | 显示全部楼层
      老哥们,我想请教一个问题。我已经到了法定结婚年龄,去民政局领证的时候老婆是自己带还是等他们发?
  • TA的每日心情
    奋斗
    2018-4-15 21:04
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    7

    帖子

    48

    积分

    新手上路

    Rank: 1

    积分
    48
    吾已成魔 发表于 2018-4-15 21:33:04 | 显示全部楼层
    保留意见
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    QQ|手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

    GMT+8, 2020-10-26 02:41 , Processed in 0.573925 second(s), 34 queries .

    Powered by Discuz! X3.4 Licensed

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表