Python灰帽子-黑客与逆向工程师的Python编程之道
- 1.调试器原理和设计
-
- 调试器
-
- 白盒调试器
- 黑盒调试器
- 2.寄存器
-
- 2.1通用寄存器
-
- EAX(ADD)
- EDX(DEPOSIT)
- ECX(Count)
- ESP和EBP
- EBX
- 2.2 栈
- 2.3 调试事件
- 2.4 断点
-
- 软断点
1.调试器原理和设计
调试器
调试器被称为“黑客之瞳”。调试器使你能够跟踪一个进程的运行时状态,我们称之为动态分析技术。大多数调试器都具备以下基本功能:运行、暂停执行和单步执行,除此之外还包括:设置断点、修改寄存器与内存数据值以及捕获发生在目标进程中的异常事件。
白盒调试器
绝大多数开发平台以及IDE通常都会自带一个内建调试器,用于帮助开发人员对他们的程序进行源码级别的跟踪与调试,这种源码级别的调试方式能够使用户对呗调试的进程获取较高级别的控制能力。
黑盒调试器
黑盒调试器分为两类:用户态调试器和内核态调试器。
- 用户态是指CPU处理器在执行应用程序代码时所处的一种特定状态,用户态下的应用程序是以最低权限运行的。
- 内核态则代表了最高级别的权限,操作系统的内核代码,连同驱动程序等着一类底层组件正hi运行在内核态下。
2.寄存器
2.1通用寄存器
寄存器可以呗认为是位于CPU上的小型存储器,CPU获取数据的最快方式就是直接访问寄存器。在x86指令集中,一个CPU具有8个通用寄存器:EAX、EDX、ECX、ESI、EDI、EBP、ESP和EBX。除此之外还有其他类型的寄存器。
EAX(ADD)
EAX寄存器也被称为累加器,用于协助执行一些常见的运算操作一级用于传递函数调用的返回值。
EDX(DEPOSIT)
EDX是一个数据寄存器。这个寄存器可以被认为是EAX寄存器的延伸部分,用于协助一些更为复杂的运算指令,如乘法和除法。EDX也可以用于通用目的的数据存储
ECX(Count)
ECX寄存器也被称为计数器,用于支持循环操作。存储一个字符串或者进行计数就是典型的循环操作。需要特别注意的是ECX寄存器通常是反向计数的,而非正向计数。
ESP和EBP
ES(STACK)P(POINTER)和EB(Base address)P(Pointer)寄存器分别被称为栈指针和基址指针。这些寄存器用于控制函数调用和相关的栈操作。
EBX
EBX寄存器是唯一一个没有被指定特殊用途的寄存器。它可以被作为额外的存储单元来使用。
2.2 栈
栈中存储着有关函数如何被调用的信息,这包括函数所接受的参数以及该函数在执行结束后该如何返回的相关信息。
栈是一个“先进后出”(FILO)的数据结构,参数在函数调用前被压入栈并在函数结束调用后出栈。ESP寄存器用于记录当前栈帧的顶部,而EBP寄存器则用于记录当前栈帧的底部。栈是由内存高地址向内存低地址的方向增长的。
2.3 调试事件
调试器必须捕获以下几种常见的调试事件:
- 断点触发
- 非法内存操作(也被称为非法访问或者段违规)
- 由被调试程序抛出的异常
2.4 断点
软断点
软断点能够使目标进程在执行到位于某个特定位置的指令时暂停执行。软断点时目前最常用的断点类型。