Day13:反调试(二)
时间差检测、断点检测
时间差检测
- CPU的运行十分迅速,一段代码可能在几毫秒内就可以执行完毕,但是调试的时候,代码运行时间会显著地变慢,这就是时间差检测的原理。时间差检测主要通过计算时间差然后与预设的值比较实现。
RDTSC指令计算
rdtsc是一个汇编指令,用于将时间读入edx:eax寄存器(高32位:低32位)。通过取两次时间把结果相减可以得到一个时间差。显著特征就是rdtsc指令
效果:


应对方法:
根据程序的逻辑,可以在计算出时间差并比较之后改变比较结果。
GetTickCount计算
原理和RDTSC类似,只不过时间差采用GetTickCount计算。GetTickCount也是WINAPI,会有明显标记。
效果:


应对方法:
修改比较结果即可
QueryPerformanceCounter计算
原理类似,只是采用QueryPerformanceCounter计算,也是WINAPI,比较好识别
效果:


应对方法:
修改比较结果即可
断点检测
- 断点是调试的一个显著特点。断点可以分为软件断点、硬件断点和内存断点。软件断点通过将目标代码修改为中断指令(X86\X64下一般为INT3\0xCC)实现;硬件断点通过将指令地址写入调试寄存器的DR0-DR3监控地址访问来实现;内存断点通过修改内存页(一片片内存区域)的访问权限实现。三者的实现方法都会触发异常让调试器捕获进而中断。反调试的断点检测主要利用软件断点和硬件断点,内存断点由于针对内存区域而非具体指令,精度太低,一般不考虑。
软件断点检测
常见手段是在内存区域搜索0xCC(使用汇编指令repnz scasb)
效果:


因为进行了比较,所以修改比较结果即可绕过
硬件断点检测
常见手段是获取DR寄存器的值并和0比较。特征是GetThreadContext函数(或者其他ThreadContext相关的函数)和与0的比较
效果:


应对方法:
还是进行了比较,修改比较结果绕过
Day13:反调试(二)