查看: 55|回复: 54

[相关教程] 用Unidbg在PC上跑通Android的SO:逆向Native算法环境

[复制链接]

96

主题

5

回帖

951

积分

UID
2
贡献
9 点
钻石
7 个
C币
993 个
发表于 2026-3-26 13:11:12 | 显示全部楼层 |阅读模式
为什么用Unidbg

逆向Android Native算法最头疼的不是算法本身,是把它从so库里抠出来单独跑。Frida hook要真机,IDA静态分析看不到运行时数据,Unidbg是个折中——在JVM里模拟ARM指令,直接调so里的函数,传参拿返回值,连真机都省了。我上周用它跑通了一个App的sign算法,记一下流程。


  • 装环境:JDK 1.8加Maven,clone unidbg仓库。README写支持JDK 11,但实际跑11会有报错,1.8最稳。
  • 定位函数:用IDA打开libxxx.so,找到目标JNI函数地址,记下偏移。
  • 写调用类:继承from UnicornContext,加载so,call函数,打印结果。
  • 补环境:so里调JNI方法(FindClass、GetStaticMethodID等)会缺,要实现这些hook。


最难的是第4步。一个商业App的sign函数通常调5到10个JNI方法,每个都要在Unidbg里模拟返回值。比如GetStringUTFChars要返回传入的字符串,GetByteArrayElements要返回一个内存指针。我那个项目调了8个JNI方法,补了3天才跑通。

跑通的标志是输入相同字符串,Unidbg输出的sign和真机hook出来的一致。不一致就是补环境补错了,最常见的是某个JNIEnv方法返回NULL导致后续逻辑短路。

代码骨架贴一下:
  1. import com.github.unidbg.AndroidEmulator;
  2. import com.github.unidbg.linux.android.AndroidEmulatorBuilder;
  3. import com.github.unidbg.linux.android.AndroidResolver;
  4. import com.github.unidbg.memory.Memory;
  5. AndroidEmulator emulator = AndroidEmulatorBuilder.for32Bit().build();
  6. Memory memory = emulator.getMemory();
  7. memory.setLibraryResolver(new AndroidResolver(23));
  8. emulator.getSyscallHook().setVerbose(false);
  9. DalvikModule dm = emulator.loadLibrary(new File("libxxx.so"));
  10. dm.callJNI_OnLoad(emulator);
  11. Module module = dm.getModule();
  12. long addr = module.base + 0x1234;
  13. Object[] args = { "input_string" };
  14. Object result = runAddress(emulator, addr, args, false);
  15. System.out.println(result);
复制代码

性能上Unidbg比Frida慢10倍,但胜在可重复,跑通了能直接集成到批量请求里。我的方案是Unidbg算sign,Python起50个协程并发请求,日处理200万次签名,跑了半年没崩过。

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

使用道具 举报

0

主题

385

回帖

41

积分

UID
404479
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-3-27 12:03:42 | 显示全部楼层
试了下你说的第二种方法,成功率更高,推荐。
回复

使用道具 举报

0

主题

355

回帖

45

积分

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

使用道具 举报

0

主题

401

回帖

0

积分

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

使用道具 举报

0

主题

386

回帖

53

积分

UID
514827
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-3-28 04:57:25 | 显示全部楼层
这个技术本身是中性工具,关键看用途,楼主的态度挺正的。
回复

使用道具 举报

0

主题

381

回帖

50

积分

UID
764601
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-3-28 16:13:14 | 显示全部楼层
同意楼主的判断,现在加固手段越来越多,纯手工成本太高了。
回复

使用道具 举报

0

主题

372

回帖

372

积分

UID
738620
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-3-29 06:18:01 | 显示全部楼层
照着试了一下,第一遍没成功,发现是权限问题,建议楼主补充个提示。
回复

使用道具 举报

0

主题

378

回帖

36

积分

UID
501439
贡献
0 点
钻石
0 个
C币
1 个
发表于 2026-3-29 23:11:45 | 显示全部楼层
楼主的排版可以再优化下,代码块用起来会更清楚。
回复

使用道具 举报

0

主题

378

回帖

41

积分

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

使用道具 举报

0

主题

389

回帖

0

积分

UID
786345
贡献
0 点
钻石
0 个
C币
0 个
发表于 2026-3-31 17:26:06 | 显示全部楼层
这篇干货,比那些只有命令没有解释的强太多了。
回复

使用道具 举报

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

本版积分规则

QQ客服返回顶部