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函数,用它来执行消息处理功能。
可以在W窗口中,针对程序窗体消息设置消息断点。