python灰帽子 笔记 一 调试器原理和设计

 计算机寄存器做用: 缓存

 8个通用寄存器:EAX EDX ECX ESI EDI EBP ESP EBX 服务器

 EAX 累加寄存器 进行运算操做与函数调用返回值 乘法和除法必须在EAX里面进行 网络

 EDX 数据寄存器 配合EAX使用,通用数据存储 函数

 ECX 计数器 用于支持循环操做 反向计数(循环最好递减) spa

 涉及数据处理的循环操做依赖于ESI(源变址寄存器,输入数据流位置信息)EDI寄存器(目的变址寄存器,操做结果存放位置信息) 指针

 ESP 栈指针寄存器 始终指向函数栈的最顶端 调试

 EBP 基址指针寄存器 对象

 EBX 没有特定用途的寄存器 three

 EIP 始终指向当前正在执行的指令 事件

 

栈:

C语言函数: int  my_socks(color_one,color_two,color_three)

X86汇编:

Push color_three

Push color_two

Push color_one

Push my_socks

栈结构:

对于汇编是由左至右压栈,而后由右至左出栈,若是这时候涉及到运算的话就是在出栈的时候进行

若是my_socks函数存在局部变量,那么局部变量就在返回地址之上,对应的ESP寄存器也往上

调试器:

调试器须要可以处理:断点触发、非法内存操做、由被调试程序抛出的异常


断点分为:软断点、硬件断点、内存断点


软断点的实现方式是:肯定断点以后更改相应地址的操做指令(好比0xCC,INT3事件),中断当前程序的执行,产生异常,调试器捕获以后恢复断点部分的指令,检查EIP地址是否与以前要求对应,若是对应,获取堆栈以及各类寄存器的数据。软断点有一次性和永久性的区别。

防止软终端调试的方式:CRC校验,若是校验值不同,程序退出,就能迟滞或者延缓程序被破解的时间。

硬件断点:

硬件断点的对象是断点数量少或者调试目标实现了相似CRC的校验方式。使用的是CPU的调试寄存器,典型的CPU8个调试寄存器(DR0-7),DR0-3保存调试地址,DR4以及DR5保留使用,DR6为调试状态寄存器(断点触发时的事件类型),DR7为硬件断点的激活开关,存储各个断点触发条件的信息。触发条件以下:特定的内存地址指令被执行、写入一个特定的内存地址、读写一个特定非可执行的内存地址。DR7 0-7位上的L域与G域分别对应局部和全局断点,16-31位决定了相关调试寄存器上所设置的断点的类型和字节长度。

硬件断点触发INT1事件,调试器捕获以后能够进行单步调试等等操做。其实是CPU每执行一条指令的时候会进行断点检测,因此断点不能设置多,最大支持4个而且长度是4字节,大块内存的断点硬件断点没法实现。


内存断点:

内存页访问权限:可执行、可读、可写、保护页,权限能够组合

保护页的做用:隔离堆和栈、确保内存增加不会超出某一预约边界、实现内存断点机制

内存断点调试的例子:网络服务器的缓存内存页调试的时候设置内存页保护页权限,这样程序运行到访问该内存的时候暂停程序,这样就能调试程序对应的堆栈信息,这样就能够绕过相应的CRC校验等等问题。

相关文章
相关标签/搜索