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

 计算机寄存器作用:

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

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

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

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

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

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

 EBP 基址指针寄存器

 EBX 没有特定用途的寄存器

 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的调试寄存器,典型的CPU有8个调试寄存器(DR0-7),DR0-3保存调试地址,DR4以及DR5保留使用,DR6为调试状态寄存器(断点触发时的事件类型),DR7为硬件断点的激活开关,存储各个断点触发条件的信息。触发条件如下:特定的内存地址指令被执行、写入一个特定的内存地址、读写一个特定非可执行的内存地址。DR7 0-7位上的L域与G域分别对应局部和全局断点,16-31位决定了相关调试寄存器上所设置的断点的类型和字节长度。

硬件断点触发INT1事件,调试器捕获之后可以进行单步调试等等操作。实际上是CPU每执行一条指令的时候会进行断点检测,所以断点不能设置多,最大支持4个并且长度是4字节,大块内存的断点硬件断点无法实现。


内存断点:

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

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

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

转载于:https://my.oschina.net/u/659405/blog/101866

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值