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。

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

转载于:https://www.cnblogs.com/milantgh/p/3861367.html

如何对抗硬件断点--- 调试寄存器相关推荐

  1. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  2. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  3. 【Windows 逆向】OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )

    文章目录 一.添加硬件断点 二.关键代码 三.MOV 汇编指令格式 四.EAX 寄存器值分析 五.使用命令查看 esi+0cc 地址 一.添加硬件断点 在上一篇博客中 , 在子弹个数数据内存地址 07 ...

  4. 软件调试学习笔记(六)—— 硬件断点

    软件调试学习笔记(六)-- 硬件断点 硬件断点 设置硬件断点 触发硬件断点 处理硬件断点 实验:硬件断点的设置与处理 硬件断点 描述: 与软件断点与内存断点不同,硬件断点不依赖被调试程序,而是依赖于C ...

  5. 调试器工作原理--CPU软件断点/硬件断点/单步执行标识

    断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能. 断点是调试器的最常用技术之一.其基本思想是在某一个位置设置一个陷阱,当CPU执行到此位置时,中断到调试器中,让调试者分析和调试,之后恢复 ...

  6. 通过硬件断点对抗hook检测

    前言 我们知道常见的注入方式有IAT hook.SSDT hook.Inline hook等,但其实大体上可以分为两类,一类是基于修改函数地址的hook,一类则是基于修改函数代码的hook.而基于修改 ...

  7. 【Windows 逆向】OD 调试器工具 ( OD 调试数据时硬件断点对应的关键代码 | 删除硬件端点恢复运行 )

    文章目录 前言 一.OD 调试数据时硬件断点对应的关键代码 二.删除硬件端点恢复运行 前言 在 [Windows 逆向]OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址 ...

  8. 硬件设备二 调试分类、软/硬件断点、OpenOCD、JLink、STLink 使用

      近期工作开始主用 OpenOCD 来进行相关开发工作的调试,因此本文重点来学习一下!本文以 OpenOCD 为重点,辅以 JLink.STLink 作为对比来进行学习. 调试 本地调试   本地调 ...

  9. 调试寄存器 原理与使用:DR0-DR7

    调试寄存器 原理与使用:DR0-DR7 下面介绍的知识性信息来自intel IA-32手册(可以在intel的开发手册或者官方网站查到),提示和补充来自学习调试器实现时的总结. 希望能给你带去有用的信 ...

最新文章

  1. 开机f8修复电脑步骤_电脑无法启动,屏幕显示白色小横条,怎么办?可收藏以备不时之需...
  2. 【渝粤教育】国家开放大学2019年春季 0691-22T物理化学及实验 参考试题
  3. matlab显示曲线图中某个点的坐标值
  4. MySQL 面试,必须掌握的 8 大核心点
  5. sniffer模拟arp***
  6. ubuntu - 14.04,配置GOPATH(GO语言开发代码存放目录)
  7. IDEA 2021 的 debug 是怎么实现?出于这个好奇心,我越挖越深。。。
  8. 基础篇:数据库 SQL 入门教程
  9. html canvas 遮罩蒙版,canvas生成遮罩图片
  10. 【飞鱼SEO】sem竞价的特点以及相关规则
  11. 网站WEB都有哪些攻击?
  12. 2020-07-24
  13. mariadb Galera集群部署
  14. 超大Excel文件读取(支持50w+)(三)
  15. 苹果对NFT敞开怀抱?最新App Store审核指南解读
  16. java开发nao机器人,NAO机器人学习小计
  17. kaggle竞赛 | 计算机视觉 | Doodle Recognition Challenge
  18. 详细Redis入门教程
  19. 【图文教程】如何使用USB及wubi安装ubuntu11.10
  20. 三边封制袋机程序 采用松下PLC和威纶通触摸屏 前后双伺服送料

热门文章

  1. mac最好用的markdown_「建议收藏」PCMaclinux,最好用Markdown编辑器清单
  2. Redux学习(一)——Redux的使用过程
  3. LeetCode 1716. 计算力扣银行的钱(等差数列)
  4. Pandas入门2(DataFunctions+Maps+groupby+sort_values)
  5. 基于奇异值分解(SVD)的图片压缩实践
  6. LeetCode 1346. 检查整数及其两倍数是否存在(哈希)
  7. LeetCode 637. 二叉树的层平均值(层次遍历queue)
  8. LeetCode 17. 电话号码的字母组合(回溯)
  9. flash html5 chrome,为了支持 HTML5 ,谷歌 Chrome 浏览器将“封杀”Flash
  10. svg载入html,SVG系列教程:SVG简介与嵌入HTML页面的方式