Day13:反调试(二)

时间差检测、断点检测

时间差检测

  • CPU的运行十分迅速,一段代码可能在几毫秒内就可以执行完毕,但是调试的时候,代码运行时间会显著地变慢,这就是时间差检测的原理。时间差检测主要通过计算时间差然后与预设的值比较实现。

RDTSC指令计算

  • rdtsc是一个汇编指令,用于将时间读入edx:eax寄存器(高32位:低32位)。通过取两次时间把结果相减可以得到一个时间差。显著特征就是rdtsc指令

  • 效果:

    IDA

    XDbg

  • 应对方法:

    根据程序的逻辑,可以在计算出时间差并比较之后改变比较结果。

GetTickCount计算

  • 原理和RDTSC类似,只不过时间差采用GetTickCount计算。GetTickCount也是WINAPI,会有明显标记。

  • 效果:

    IDA

    XDbg

  • 应对方法:

    修改比较结果即可

QueryPerformanceCounter计算

  • 原理类似,只是采用QueryPerformanceCounter计算,也是WINAPI,比较好识别

  • 效果:

    IDA

    XDbg

  • 应对方法:

    修改比较结果即可

断点检测

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

软件断点检测

  • 常见手段是在内存区域搜索0xCC(使用汇编指令repnz scasb)

  • 效果:

    IDA

    XDbg

  • 因为进行了比较,所以修改比较结果即可绕过

硬件断点检测

  • 常见手段是获取DR寄存器的值并和0比较。特征是GetThreadContext函数(或者其他ThreadContext相关的函数)和与0的比较

  • 效果:

    IDA

    XDbg

  • 应对方法:

    还是进行了比较,修改比较结果绕过

作者

SydzI

发布于

2025-08-03

更新于

2025-10-03

许可协议

评论