8.9 RDTSC时钟检测反调试

发布时间 2023-09-27 09:22:20作者: lyshark

RDTSC时钟检测同样可实现反调试检测,使用时钟检测方法是利用rdtsc汇编指令,它返回至系统重新启动以来的时钟数,并且将其作为一个64位的值存入EDX:EAX寄存器中,通过运行两次rdstc指令,然后计算出他们之间的差值,即可判定对方是否在调试我们的程序。

可以利用时钟检测技术来检测程序是否被调试器附加,其实现基本思路如下:

  • 获取当前时间戳 T1,即通过执行 rdtsc 指令获取当前 CPU 时钟计数器的值。
  • 执行一段代码,例如随机生成一个数字或者MessageBox等,使得程序中断一些时间,防止被调试器单步跟踪。
  • 获取当前时间戳 T2,即通过再次执行 rdtsc 指令获取当前 CPU 时钟计数器的值。
  • 计算时间戳之差,即 T2-T1,如果该差值较小,则表明程序正在被调试器跟踪。
#include <Windows.h>
#include <stdio.h>

BOOL IsDebug()
{
    int Debug = 0;
    __asm
    {
        rdtsc           // 调用时钟
        xor ecx, ecx
        add ecx, eax    // 将eax与ecx相加
        rdtsc           // 再次调用时钟
        sub eax, ecx    // 两次结果做差值
        mov Debug, eax
    }
    
    printf("打印差值: %d \n", Debug);
    if (Debug >= 21)
    {
        return TRUE;
    }

    return FALSE;
}

int main(int argc, char * argv[])
{
    if (IsDebug())
    {
        printf("[-] 进程正在被调试 \n");
    }

    system("pause");
    return 0;
}