#include<intrin.h> __try { int a = __readeflags(); a |= 0x100; __writeeflags(a); a++; ;随便一个指令触发异常 } __except (GetExceptionCode()==EXCEPTION_SINGLE_STEP?EXCEPTION_EXECUTE_HANDLER:EXCEPTION_CONTINUE_SEARCH) { printf("EXCEPTION_SINGLE_STEP"); }
示例4:int 2D 异常
int 2D 原为内核模式中用来触发断点异常的指令,也可以在用户模式下触发异常,但程序调试运行时不会触发异常,只是忽略。在调试模式下执行 int 2d 指令后,下条指令的第一个字节将被忽略,后一个字节会被识别为新的指令继续执行。并且在调试器(OllyDbg、x32dbg)中,跟踪 int 2d 指令时,不会停在下条指令开始的地方,而是一直运行,直到遇到断点
RDTSC push EDX ;记录原值 push EAX ;需要保护的代码 xor eax,eax mov ecx,0x3e8 loc:inc EAX loop loc RDTSC pop esi pop edi ;进行比较,如果两次值之差>0xFFFFFF就return cmp edx,edi ja re sub eax,esi mov ss:[ebp-4],eax cmp eax,0xFFFFFF ja re normalcode: ... re: retn
在 VS2019 和 gcc 里,msvc 将RDTSC指令包装为了函数,使使用变得简单:
1 2 3 4 5 6 7 8 9 10
longlong time=__rdtsc(); for (int i = 0; i < 1000; i++) { } longlong time2 = __rdtsc(); if (time2 - time > 0xFFFFFF) { return0; } printf("success");