天天看点

断点的种类

CC 断点

又叫 int3/F2 断点,软件执行 int3 指令时程序就会暂停,int3 指令的机器码就是CC。设置完 CC 断点后,原本位置的机器码会被调试器改成 0xCC(并对原来的数据备份),程序执行到 0xCC 时程序就会暂停(调试器所为)。

所以也就是说如果在没有调试器的情况下如果我们程序里有 0xCC,程序也不会暂停。

优点:可以设置无数个

缺点:容易被检测到

内存断点

分为:

(1)内存执行断点

把机器码当成程序执行时被断下。

(2)内存写入断点

改写这部分机器码时被断下。

(3)内存访问断点

访问 = 执行 | 写入。

设置内存断点后,调试器会在你下断点的内存页增加一个 PAGE_NOACCESS 属性,这个属性会把当前内存页设为禁止任何形式的访问,如果进行访问会触发一个内存访问异常,之后调试器会捕获这个异常,判断这个异常触发的位置和你下断点的位置是否一样,一样则接管异常并暂停程序运行,不一样则放行。

优点:相比 CC 断点,不容易被检测到。

缺点:只能设置一个(新设置的内存断点会覆盖原有的内存断点),在调试器中没有对应的记录窗口,程序重新加载后消失。

硬件断点

在寄存器中,有这么一些寄存器,它们用于调试。人们把他们称为调试寄存器,调试寄存器一共有8个名字分别从Dr0-Dr7。

Dr0-Dr3 存放中断的地址,Dr4,Dr5一般不使用(保留),Dr6,Dr7 记录在 Dr0-Dr3 中下断的地址的属性。

硬件断点最不容易被断下,分为三种:

(1)硬件执行断点。

(2)硬件写入断点。

(3)硬件访问断点。

硬件断点生效时他会先执行符合条件的代码,执行完后才停下,而内存断点和CC断点在即将执行符合条件的代码处被断下。

优点:更难被检测,程序重新加载后不消失。

缺点:只能设置有限的个数,

条件断点

达到设置的条件时才触发的断点(某种自己设置的逻辑表达式)。

条件记录断点

条件记录断点除了具有条件断点作用,还能记录断点处函数表达式或参数的值,也可以设置通过断点的次数,每次符合暂停条件时,计数器减一。

你可以在一个被反复调用的函数段首下条件记录断点。筛选每一次调用传入的参数,在合适的时机断下。

消息断点

消息断点是对条件记录断点的应用,是针对一个特殊函数:winproc函数的 Message 参数设置的件记录断点 。

windows是基于消息的操作系统,每一个消息都按照相同的格式被写入一个结构体,这个结构体叫MSG。消息发生后windows把该结构体传给WinProc函数,用它来执行消息处理功能。