OD各种断点的原理

news/2024/5/19 7:59:31 标签: OD, 断点, 硬件断点, CC断点, 内存断点

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


http://www.niftyadmin.cn/n/640298.html

相关文章

python_异常和处理、文件的各种操作

1.异常 程序在运行过程中不可避免出现的错误。 比如直接print&#xff08;abc&#xff09;&#xff0c;哈哈哈 比如引用了没有赋值的变量和超出索引… 这些错误我们称之为“异常” 程序一旦出现异常&#xff0c;会导致程序立即终止&#xff01;&#xff01;&#xff01; 异常…

SCOM2012部署系列之十:监控Windows server

在前面的文章中&#xff0c;针对SCOM2012的安装工作已经基本完成&#xff0c;下面来谈一谈如何进行操作系统的基础监控&#xff0c;为了监控Windows server系列产品&#xff0c;我们需要导入Windows server相关的监控包。 SCOM的监控包一般下载下来后&#xff0c;有两种形式&am…

看雪CTF.TSRC 2018 团队赛 第二题 半加器 writeup

首先查壳&#xff0c;发现没有壳 然后根据PE看一下是不是32位程序&#xff0c;这个是32位程序&#xff0c;所以可以用OD来分析&#xff08;希望OD能早日开发出支持64位的版本&#xff09; 根据程序特征我们可以根据 Peease Input 这个字符串定位到关键点 直接载入OD&#xff0c…

丢失控制文件恢复实验记录--3(当前的控制文件损坏,归档日志文件损坏且备份的控制文件是旧的情况恢复数据库)...

一、实验说明&#xff1a; 本文转载于Luocs的丢失控制文件恢复实验记录--3&#xff0c;此处属于转载模拟。 操作系统&#xff1a;rhel 5.4 x32 数据库&#xff1a;oracle 11g r2 二、实验操作&#xff1a; ----先清除历史测试数据然后再产生数据&#xff1a;---- 1 SQL> d…

ubuntu 16.04 server启用root用户方法

步骤1&#xff1a;使用sudo passwd root命令设置root的密码 步骤2&#xff1a;修改/etc/ssh/sshd_config文件 1.把PermitRootLogin Prohibit-password 添加#注释掉 2.新添加&#xff1a;PermitRootLogin yes 3.重启ssh服务/etc/init.d/ssh restart

web全栈_python高阶编程_虚拟机、linux、ubuntu及其操作指令

20200824 高级编程_ 1. 操作系统 操作系统直接运行在计算机上的系统软件&#xff0c;它是控制硬件和支持软件运行的计算机程序。 操作系统的作用是&#xff1a;向下控制硬件向上支持软件的运行&#xff0c;具体是承上启下。 只有安装了操作系统的计算机才能正常工作。 2…

web 全栈 项目前导 redis 和redis 安装, redis 操作和五大数据类型部分

Redis介绍 安装sudo apt-get install redis sever 其他的源码安装很容易出问题&#xff0c;不考虑了。 gcc 是编译器 2.redis常用五大数据类型 这是最重要的redis 知识点 注意set 第二个参数&#xff0c;也只是覆盖&#xff0c;因为键值配对&#xff0c; append 是添加 re…

Publish over SSH插件安装和使用

一、使用说明 这个插件可以通过ssh连接其他Linux机器 二、安装Publish over SSH插件 步骤1&#xff1a;进入【系统管理】-【插件管理】-【可选插件】&#xff0c;输入【Publish Over SSH】即可&#xff0c;如下图&#xff1a; 步骤2&#xff1a;勾选后&#xff0c;点击【直接…