调试器的基础知识

2019.11.24

序:

尽管昨天排了一整天的队去体测,不过使用晚上的时间,也终于是看完了第2章的内容。 第2章的内容主要是介绍了寄存器、栈和3种调试断点等调试器的基础知识。


调试器

一.通用寄存器

1. 寄存器们

通用寄存器是在CPU上的几个小存储单位,不同的寄存器却有着不同的作用,以下列出几种通用寄存器的作用。

寄存器 作用
EAX 存储函数的返回值,或者进行累加器的作用(高级可做乘除)
EDX 存储数据,一般是辅佐EAX完成计算作业
ECX 存储循环操作的下标,但其下标是递减的(由大到小)
ESI 存储输入数据的地址(指向输入源)
EDI 存储目的数据的地址(指向输出源)
ESP 当有函数被调用时,指向栈顶的指针
EBP 在有函数被调用时,指向栈底的指针;平时是普通寄存器
EBX 保留,以待不时之需
EIP 指向马上要执行的指令的地址


二. 栈

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。 向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。


  1. 图示
栈的工作原理


三.调试断点

一个优秀的调试器必须要能捕捉到不同的调试事件。一般在启用调试器之后,调试器会不断循环,直到捕捉到一个调试事件,这个行为称为 陷入之后CPU便会收到中断请求从而暂停,黑客们可以在此时查看各变量、堆栈的地址和内容,监视程序的细节。 而断点便是人为地暂停程序进行调试的手段,于是便有了以下3种调试断点。



I. 软件断点

1. 必要知识:关于操作码:

对于我们平时使用的高级语言写的语句,都会在编译过程中转译为汇编语言,例如

汇编指令

尽管如此,CPU还是完完全全不能明白这个指令的,所以在进行汇编这一步之后, 汇编指令就会被转化成CPU可以理解的语言:操作码。 举个例子,上述的例子将会被转换成:
操作码

其中0x44332211是指令的地址。 一般的调试器都会如上显示信息:地址、操作码、汇编指令。


2. 软件断点的具体操作原理

  • 操作码是两个字节组成的,当我们给某一个代码设置一个断点之后, 系统会获取代码(指令)的地址,并将操作码的前一个字节修改成3号中断信号(INT 3),其值为0xCC,随后保存原操作码的前一个字节的内容;并将代码的地址加入到中断列表中。
  • 当程序运行调试时, 如果遇到操作码前一个字节是3号中断信号,便去查找当前代码地址是否在中断列表中,如在,便将保存了的原操作码前一个字节的内容写回操作码中,并使用3号中断信号时CPU暂停。 此时变可以监视程序中变量的值了。
  • 断点分为 一次性断点 持久性断点后者会在执行了一次断点之后,再次修改当前地址的操作码,才执行下一句,以达到每次到这一次的语句时都能中断的效果。
  • 示意图


    软件断点示意图

3. 软件断点的问题

由于软件断点是通过修改操作码来实现中断的, 所以它会导致冗余校验码(CRC)发生改变,从而在调试之后验证失败。 如果他人的程序有写防止他人软件断点测试的代码,一定会检验冗余校验码,如果被修改,则进行 自我了断(kill itself)防止别人继续调试。所以这就有可能导致我们无法监视想要监视的程序。



II. 硬件断点

1. 原理

  • 在CPU中有8个专门用于调试的调试寄存器,记作DR0~DR7。以下为它们的作用。
寄存器名称 作用
DR0~DR3 存储硬件断点的信息(地址、操作码等)
DR4~DR5 保留,以备不时之需
DR6 状态寄存器
DR7 存储所有硬件断点的开关信息(DR0~DR3的状态和信息)
  • DR7可以设置以下3种情况的中断:
    DR7可设置的3种中断
  • 以下为DR7记录的信息的类型
断点类型 断点长度
00 - 在执行指令时中断 00 - 1byte
01 - 在可以写入数据时中断 01 - 2 bytes[WORD]
11 - 在有数据可读写但不执行时 11 - 4 bytes[DWORD]
DR7的详情

2. 硬件断点的具体操作原理

  • 调试器不断循环, 并一直都在检查当前代码是否设置了断点或是否在中断列表中,或者当前代码调用了再中断列表中的代码, 当检查到断点时,若未设置到硬件断点中,则将具体信息写入DR7,并将断点写入DR0~DR3中最小且空闲的一个中,其后仍继续循环检查。
  • 当碰到断点时,使用1号中断信号(INT 1)来发起中断请求,CPU暂停。
  • 示意图


    硬件断点操作过程

3. 问题:

虽可以在不修改数据的前提下设置断点,同一时间可以设置的断点数量至多为4个,且每个断点只能监视一个地址,无法同时监视一个内存块。



III. 内存断点

1. 具体操作原理

  • 内存断点实际上不是一种断点,它的实质是修改内存页的权限,将一块内存设置为保护页(Guard Page),当有对保护页的访问时,抛出异常,CPU会暂停,从而达到暂停的效果。


你可能感兴趣的:(调试器的基础知识)