如何使用一些“时间”检查策略来检测调试器?

逆向工程 调试器 反调试
2021-07-10 15:38:32

看过几种反调试策略,想知道有没有一些反调试方法可以评估程序运行时间,从而检测调试器的存在。

2个回答

这是一个相当广泛的主题:-) 有几个例子:

  1. GetTickCount()- 检索自系统启动以来经过的毫秒数。将它们放在程序的不同部分,然后检查差异可以为您提供一些原始检测。
  2. time() - 获取当前日历时间。
  3. RDTSC- 获取处理器时间戳计数器的当前值。如果放置得当,这个可能很难找到。

问题是,一旦研究人员意识到它们,所有这些都可以被中和。有各种调试器插件可以通过修补 API、安装驱动程序等来实现这一点。当然,在大多数情况下可以手动完成。

您真正应该考虑的是将它们放置和集成到您的代码中,因此调用 API/指令的真正目的将不太明显。

有 CPU 指令和 OS API 可以实现这一点,例如

RDPMC
RDTSC
GetLocalTime
GetSystemTime
GetTickCount
KiGetTickCount
QueryPerformanceCounter
timeGetTime

结果是通过请求当前时间,执行某种 CPU 密集型操作(或要求调试代码的人这样做,例如单步执行),再次请求时间,然后计算两者之间的差值来实现的。如果增量明显大于您在本机执行模式下的预期,则表明存在调试器。但是请注意,这远不是一种准确的方法,因为该结果与重负载下的系统无法区分。

这在我的“终极”反调试参考 ( http://pferrie.host22.com/papers/antidebug.pdf ) 的“(C) 执行时间”部分中有详细介绍