以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断点法
软件断点
- 打开命令栏:在软件界面底部找到命令输入框。
- 输入命令:直接输入
bp IsDebuggerPresent然后按回车。 - 确认断点:x64dbg 会自动定位到
IsDebuggerPresent函数的入口地址并下断点。当程序调用该 API 时,调试器就会中断。 如果软件断点(bp)被程序的反调试机制检测或清除,可以改用硬件断点:
硬件断点
如果软件断点(bp)被程序的反调试机制检测或清除,可以改用硬件断点:
- 在命令栏输入:
bph IsDebuggerPresent。
建立:26/4 复查时间:26/9/15
// comments
评论
正在读取评论…