断点都是通过触发程序异常,来达到使程序断下的目的
1.普通断点:常规的有使用int 3,还有调试器平时的断点,这2种都为该类型断点,通过执行int 3达到触发异常,让程序断下的目的。但该断点修改了代码段,在反调试中容易被察觉。
2.条件断点:在普通断点的基础上,增加限定条件。适用于某一下断处会被多地方调用,则加上限定条件(例:[esp-4]!=某一地址),以达到真正需要断下时触发。
3.内存断点:通过修改内存的属性来达到触发异常。可设置触发条件为读、写、执行。但该断点会消耗较大资源,因为内存断点会将目标地址所在的一整个内存页中下断点,当同内存页非下断位置被读、写、访问也会触发,此时调试器会对比数据,看触发的断点位置是否为当初下断处。虽然内存断点的效率经常很不理想,但是因为仅仅是修改了一个内存属性,所以内存断点可以下数量非常多、单断点范围非常大。这是它的优势。
4.硬件断点:硬件断点为CPU提供给我们的断点,由4个寄存器(DR0-DR3)存放断点地址,断点属性可设置为读、写、执行,由于寄存器数量有限,只能存在4个硬件断点,这4个断点是否执行由DR7的0、2、4、6位决定,当置为1时,断点生效。
读:当被下断位置被执行读取操作后,在执行这个操作的位置断下。 例:a的地址为0x123;在123下读的断点后,0x456 为 if(a==1),则程序会在0x456处断下。
写:当被下断位置被执行写操作后,在执行这个操作的位置断下。例:a的地址为0x123;在123下写的断点后,0x456 为a=1,则程序会在0x456处断下。
执行:当运行到下断位置时,在该位置断下。 例:例如0x123456处的代码为c=a+b;在执行到这句时,会在0x123456处断下。
以上断点的地址都在内存中,不能为寄存器。