INT3断点是断点的一种,在诸如Ollydbg中的快捷键是F2,是一种很常用的断点类型。INT3指令的机器码为CC,所以通常也称之为CC指令。当被调试进程执行INT3指令导致一个异常时,调试器就会捕捉这个异常从而停在断点处,然后将断点处的指令恢复成原来的指令。当然,如果自己写调试器,也可以用其他一些指令代替INT3指令来触发异常。
用INT3断点的好处是可以设置无数个断点,缺点是改变了原程序指令,容易被软件检测到。例如为了防范API被下断,一些软件会检测API的首地址是否为CCh,以此来判断是否被下了断点。
但是如果将断点下在函数的内部或者末尾,例如可以将断点下在函数入口的下一行,就可以躲过检测了。
Int3断点的处理
Int3断点处理的大致流程是:
1、 获取当前寄存器的信息,重点是Eip的值
2、 根据Int3断点的类型(0xCC或0xCD03)回溯指针地址
3、 触发Int3异常,被调试程序断下;
4、 若继续跑的话,则恢复原有的指令,让被调试程序正确执行指令;
5、 走完正确指令之后,再重新设置指令为Int3断点;
常在反汇编中看到如下代码:
004113B7 mov eax,0CCCCCCCCh //将eax全部初始化为0CCCCCCCCh,即INT 3断点