首先让我们知道什么是rdtsc指令
rdtsc(Read Time-Stamp Counter):
- 读取 CPU 的时间戳计数器
- 返回自系统启动以来的 CPU 时钟周期数
- 结果是一个 64 位值,存储在 edx:eax(高 32 位在 edx,低 32 位在 eax)
在我们进行逆向调试的过程中会进行单步调试,在前一步和后一步的调试过程中所花费的时间明显会多于程序运行这两步的时间,因此我们就可以利于该原理使用rdtsc指令来,使程序发现它正在被调试,从而进行防御反调试。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int CheckTime() {
unsigned int delta_allow = 0x1000; //阈值
unsigned int timeLowStart, timeHighStart,timeLowEnd, timeHighEnd,delta;
__asm { //第一次记录cpu的时间
rdtsc
mov timeLowStart, eax
mov timeHighStart, edx
}
__asm { //冷却时间的代码
nop
nop
nop
nop
}
__asm { //第二次记录cpu的时间
rdtsc
mov timeLowEnd, eax
mov timeHighEnd, edx
}
if (timeHighEnd != timeHighStart) { //如果高32位发生了变化,说明被调试了
return 1;
}
delta = timeLowEnd - timeLowStart; //计算低32位的差值
if (delta > delta_allow) { //如果差值大于阈值,说明被调试了
return 1;
}
return 0;
}
int main() {
if (CheckTime()) {
printf("发现被调试");
exit(0); //结束程序
} else {
printf("通过检测");
}
system("pause");
return 0;
}
上面的代码是该反调试函数的内联汇编实现对程序的一种保护手段

Comments NOTHING