论坛首页 安全工具分享区 阅读主题

[原创]native去混淆——字符串加密

159 浏览 15 回复
#1 楼主 2026-06-01 21:09:13
随着安全对抗的日益升级,在进行 native 层逆向分析时,我们经常会遇到目标 so 文件中的字符串被加密的情况。由于字符串是定位关键代码的重要手段,因此对加密字符串进行解密还原显得尤为重要。本文将介绍几种常见的字符串加密破解方法,并结合实际案例进行讲解。某些字符串混淆方案会在运行时调用字符串解密函数,将解密后的字符串以 C 指针的形式返回给调用者。然而,这些解密函数可能较难快速定位。因此,我们可以通过 Frida 对模块中的所有函数进行 hook,在函数返回时使用 readCString() 尝试输出结果。优点:缺点:具体流程:运行脚本 toolchain_collect_ret_insn.py 。选择“是”:在 IDB 所在目录生成对所有函数的 ret 指令处进行 hook 的脚本。选择“否”:仅生成导出函数的 ret 指令处的 hook 脚本。
对生成的脚本进行简单调整后即可使用。
效果示例:
思路
某些字符串混淆方案会在运行时频繁调用固定的字符串解密函数。由于一个 so 文件通常包含数百甚至上千个字符串,这些解密函数的调用次数往往远高于普通功能函数。通过统计所有函数的交叉引用次数并按从高到低排序,可以快速定位这些字符串解密函数。此外,这种方法还可以用于定位字符串的构造函数,作为去混淆的关键点。优点
稳定性较高,只需针对少量函数进行 hook。
干扰数据较少。
适用于基于堆和基于栈的字符串加密方案。缺点:
需要手动排查并定位字符串解密函数。使用方法:
运行脚本 top_xrefs.py,输入需要查看的调用次数最多的 N 个函数。
示例结果:
xxard:
字符串解密实现:
xxsec:
xxny:
思路:
在 native 层通过 Java 传递字符串参数或返回 Java 类型的字符串时,通常会调用 NewString、NewStringUTF、GetStringUTFChars 等 JNI 接口。我们可以通过 hook 这些接口来追踪字符串。优点:缺点:具体实现:
1、使用 deathmemory 大佬的开源项目 FridaContainer 进行 JNI trace:2、使用珍惜大佬的开源项目 41aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4x3U0V1$3y4o6R3^5x3K6t1H3i4K6u0r3d9X3&6A6N6s2u0S2j5$3g2r3L8%4u0o6M7s2l9`. 思路:
某些 so 文件使用开源的 OLLVM 进行字符串加密,其特点是在 init 函数中将字符串解密回 data 段。我们可以通过 Frida dump 工具直接从内存中提取解密后的字符串。优点:缺点:具体流程:启动 APP,触发关键逻辑,确保目标模块加载到内存。使用 Frida dump 工具从内存中提取解密后的 so 文件。将 fix_convey_str_list.py 脚本拷贝到 IDA 插件目录,重启 IDA 生效。在 IDA 中加载 dump 的 so 文件,使用插件导出解析的字符串列表。
导出字符串列表后,将其重新导入非 dump 的 so 文件中进行分析。
思路:
针对基于堆的字符串加密方案,动态申请内存保存解密后的字符串,并将字符串指针保存在全局变量中。我们可以编写 IDA 脚本扫描 data 和 bss 段的内存空间,尝试读取字符串指针并输出解密后的字符串。优点:缺点:具体流程:使用 toolchain_trace_dyn_dec_str.py 脚本生成 Frida js 脚本,修改 Module.findBaseAddress 中的模块名。启动 APP,触发关键逻辑,等待字符串解密后frida加载脚本进行 dump。 由于有的地址是bss段的,没有在文件中分配实际的空间,因此不能直接 patch 对应地址的内容。 我这里的解决思路是在对应地址下个断点,并添加一个注释,这样通过断点窗口就可以方便的进行 字符串查找了…… Ctrl+ALT+B 打开断点界面,右击选择Columns仅展示 comment(同样Ctrl+F搜索字符串即可):
在汇编窗口上可以看到字符串备注:
本文围绕 native 层字符串加密的逆向破解方法展开,结合实际案例详细介绍了多种应对策略,包括追踪返回字符串、定位高频调用函数、JNI 字符串追踪、内存 dump 和内存扫描等技术手段。通过这些方法,可以有效应对不同类型的字符串加密方案,为逆向分析提供强有力的支持。希望本文的分享能为读者在实际工作中提供启发和帮助。 仓库地址: d52K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8h3t1@1k6r3@1@1L8W2)9J5c8V1c8W2j5h3c8D9P5g2)9J5k6o6x3H3x3o6l9`.FCAnd.jni.hookJNI('NewString', {

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287499.htm
#2 2026-06-01 21:09:13
感谢分享
#3 2026-06-01 21:09:13
感谢分享
#4 2026-06-01 21:09:13
过来瞧瞧
#5 2026-06-01 21:09:13
感谢分享
#6 2026-06-01 21:09:13
感谢分享
#7 2026-06-01 21:09:13
必须回复
#8 2026-06-01 21:09:13
感谢分享
#9 2026-06-01 21:09:13
很强
#10 2026-06-01 21:09:13
感谢分享
#11 2026-06-01 21:09:13
给力!
#12 2026-06-01 21:09:13
感谢分享
#13 2026-06-01 21:09:13
感谢分享
#14 2026-06-01 21:09:13
样本app 是哪个?
#15 2026-06-01 21:09:13
学习
#16 2026-06-01 21:09:13
优秀
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号