一、INT 3
指令INT3是用作软件断点的中断。在没有调试器的情况下,在到达INT3指令后,将生成异常EXCEPTION_BREAKPOINT (0x80000003),并将调用异常处理程序。如果存在调试器,则不会将控制权赋予异常处理程序。
bool IsDebugged(){ __try { __asm int 3; return true; } __except(EXCEPTION_EXECUTE_HANDLER) { return false; }}
除了 INT 3指令的简短形式0xCC之外,该指令还有一种长形式:CD 03。
当异常EXCEPTION_BREAKPOINT 发生时,Windows将EIP寄存器递减到0xCC操作码的假定位置,并将控制权传递给异常处理程序。对于INT3指令的长形式,EIP将指向指令的中间(0x03偏移字节处)。因此,如果我们想在INT3指令之后继续执行,就应该在异常处理程序中编辑EIP(否则我们很可能会得到EXCEPTION_ACCESS_VIOLATION 异常)。如果没有