12345下一页
查看: 48|回复: 41

[相关教程] 逆向遇到反调试怎么办:六种检测和绕过方法

[复制链接]

96

主题

5

回帖

951

积分

UID
2
贡献
9 点
钻石
7 个
C币
993 个
发表于 2026-5-22 22:51:57 | 显示全部楼层 |阅读模式
逆向时遇到反调试是最烦的。程序一检测到调试器就退出或者改逻辑。这篇讲几种常见的反调试和绕过方法。

一、ptrace 检测
最经典的反调试。Linux 下程序调用 ptrace(PTRACE_TRACEME) 来检测是否已被调试。如果返回 -1 说明已经有一个调试器在跟踪它。

绕过方法:用 Frida hook ptrace 函数,让它永远返回 0:
  1. Interceptor.attach(Module.findExportByName(null, "ptrace"), {
  2.     onEnter: function(args) {
  3.         args[0] = ptr(0);  // 改成 PTRACE_TRACEME
  4.     },
  5.     onLeave: function(retval) {
  6.         retval.replace(0);  // 返回0表示成功
  7.     }
  8. });
复制代码

二、TracerPid 检测
程序读取 /proc/self/status 文件,看 TracerPid 字段。正常是 0,被调试时是调试器的 PID。

绕过方法:hook fopen 或 open 函数,当打开 /proc/self/status 时替换内容:
  1. var fopen = Module.findExportByName(null, "fopen");
  2. Interceptor.attach(fopen, {
  3.     onLeave: function(retval) {
  4.         var path = this.context.r0; // 需要根据架构调整
  5.         // 读取文件内容,把 TracerPid 改成 0
  6.     }
  7. });
复制代码

更简单的办法:用 Frida 的文件重定向,或者直接 patch so 二进制,把检测函数 NOP 掉。

三、时间检测
程序在关键函数前后读取系统时间,如果差值过大就认为被断点调试了。

绕过方法:hook clock_gettime 或 gettimeofday,在断点暂停期间让时间"不流逝":
  1. var orig_clock_gettime = Module.findExportByName(null, "clock_gettime");
  2. var fake_time = 0;
  3. Interceptor.attach(orig_clock_gettime, {
  4.     onLeave: function(retval) {
  5.         if (fake_time === 0) fake_time = this.context.r1.toInt32 ? this.context.r1 : 0;
  6.         // 固定返回相同时间戳
  7.     }
  8. });
复制代码

四、inotify 文件监控检测
程序用 inotify 监控 /proc/self/maps 或 /proc/self/mem 的访问。调试器读内存时会触发通知。

绕过方法:hook inotify_add_watch,当监控的路径包含 /proc/self 时返回一个假 fd。

五、调试器特征检测
程序检查 /proc/self/cmdline 是否包含 "frida"、"gdb"、"lldb" 等字符串。或者扫描端口看有没有 Frida server 在 27042 端口。

绕过方法:

  • 改 Frida server 名称和默认端口:./frida-server -l 0.0.0.0:8888
  • 用 frida-gadget 注入而不是 frida-server,不开放端口
  • hook 字符串比较函数,让 "frida" 比较返回不匹配


六、实战思路
遇到反调试不要一个一个绕,按这个流程来:

  • 先用 Frida trace 看程序调用了哪些检测函数(ptrace、open、clock_gettime 等)
  • 找到检测逻辑的入口点
  • 批量 hook 所有检测函数
  • 如果还有问题,可能有多层检测,逐层排查


七、终极方案:静态 patch
如果动态绕过太麻烦,直接在 IDA 里找到检测函数的二进制代码,用 NOP 指令替换。ARM64 的 NOP 是 0x1F2003D5。改完后保存 so 文件,替换回去。



反调试的本质是猫鼠游戏。开发者加检测是为了增加逆向成本,你绕过是为了降低成本。大部分反调试都可以用 Frida 动态 hook 绕过,少数需要静态 patch。掌握这两种方法就够了。
温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
回复

使用道具 举报

0

主题

373

回帖

46

积分

UID
262534
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-5-23 00:27:32 | 显示全部楼层
想请教一下,你用的这个版本是哪个?我这边跑起来报错。
回复

使用道具 举报

0

主题

376

回帖

376

积分

UID
420254
贡献
0 点
钻石
0 个
C币
2 个
发表于 2026-5-23 03:44:25 | 显示全部楼层
感谢,正需要这个,之前找的资料都太老了。
回复

使用道具 举报

0

主题

380

回帖

0

积分

UID
406169
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-5-23 10:18:11 | 显示全部楼层
这个方法我用过,确实可行,不过新一点的版本已经加了检测。
回复

使用道具 举报

0

主题

390

回帖

48

积分

UID
619646
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-5-23 20:08:50 | 显示全部楼层
我这边环境是Mac,有些步骤要调整,回头补个差异说明。
回复

使用道具 举报

0

主题

362

回帖

362

积分

UID
873904
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-5-24 09:16:22 | 显示全部楼层
这篇干货,比那些只有命令没有解释的强太多了。
回复

使用道具 举报

0

主题

368

回帖

368

积分

UID
801652
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-5-25 01:40:47 | 显示全部楼层
步骤写得很清楚,跟着走了一遍,卡在第二步的环境配置上,后来装了老版本才好。
回复

使用道具 举报

0

主题

401

回帖

43

积分

UID
541319
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-5-25 21:22:05 | 显示全部楼层
实战出来的经验和文档里写的完全是两码事,楼主这个很真实。
回复

使用道具 举报

0

主题

391

回帖

42

积分

UID
928478
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-5-26 20:20:16 | 显示全部楼层
这个思路让我想到另一个场景,回头试试能不能套用。
回复

使用道具 举报

0

主题

376

回帖

0

积分

UID
485586
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-5-27 22:35:20 | 显示全部楼层
感谢分享,之前一直卡在这个点,看完豁然开朗。
回复

使用道具 举报

温馨提示:
1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
3、当政府机关依照法定程序要求披露信息时,论坛均得免责。
4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
6、网络世界也请遵守我国的法律法规!一旦发现违法行为,将立即封存相关信息并报警处理!
12345下一页
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

QQ客服返回顶部