// blog / 逆向笔记

反调试速览

以IsDebuggerPresent函数为例

一、原理

c源码示例:

#include <windows.h>
#include <stdio.h>

int main() {

    // 检查当前进程是否正在被调试
    if (IsDebuggerPresent()) {
        printf("检测到调试器正在运行,程序即将退出!\n");
        ExitProcess(0);  // 立即终止进程
    }
	
    // 正常运行
    printf("程序正常运行中...\n");
    printf("按任意键退出...\n");
    getchar();
    return 0;
}

汇编示例:

call IsDebuggerPresent    ; 第1段:检查
                           ; 被调试时返回1,没被调试时返回0
                           ; 返回值存在eax寄存器里

test eax, eax             ; 第2段:判断
                           ; eax=0 → ZF=1(零标志位置位)
                           ; eax≠0 → ZF=0

jz normal_code            ; jz = "零则跳"(ZF=1时跳转)
                           ; eax=0(没被调试)→ ZF=1 → 跳到normal_code
                           ; eax=1(被调试)→ ZF=0 → 不跳,继续往下走

push 0
call ExitProcess          ; 第3段:退出(被调试了,退出程序)

normal_code:
; ... 正常的程序逻辑 ...

更多反调试原理


二、绕过方法

1、patch

  • 改相反跳转
  • 如:jz (74) 改 jnz(75)

2、修改寄存器

  • 动态调试,当 test eax, eax 时,将eax寄存器值改为0

三、其他定位方法

当反调试函数有多个时,一步一步动态调试追踪有点慢,怎么更快找到这段代码在哪?

1,导入表检查法

  • IDA 看 imports视图,ctrl + f 搜索函数

2,x64dbg,API断点法

软件断点

  1. 打开命令栏:在软件界面底部找到命令输入框。
  2. 输入命令:直接输入 bp IsDebuggerPresent 然后按回车。
  3. 确认断点:x64dbg 会自动定位到 IsDebuggerPresent 函数的入口地址并下断点。当程序调用该 API 时,调试器就会中断。 如果软件断点(bp)被程序的反调试机制检测或清除,可以改用硬件断点:

硬件断点 如果软件断点(bp)被程序的反调试机制检测或清除,可以改用硬件断点:

  • 在命令栏输入:bph IsDebuggerPresent。

建立:26/4 复查时间:26/9/15

// comments

评论

加载中…

正在读取评论…

// related

相关文章