随着安全对抗的日益升级,在进行 native 层逆向分析时,我们经常会遇到目标 so 文件中的字符串被加密的情况。由于字符串是定位关键代码的重要手段,因此对加密字符串进行解密还原显得尤为重要。本文将介绍几种常见的字符串加密破解方法,并结合实际案例进行讲解。
追踪所有返回的字符串
某些字符串混淆方案会在运行时调用字符串解密函数,将解密后的字符串以 C 指针的形式返回给调用者。然而,这些解密函数可能较难快速定位。因此,我们可以通过 Frida 对模块中的所有函数进行 hook,在函数返回时使用 readCString() 尝试输出结果。
优点:
如果运气好,可以直接看到一些敏感的关键字符串,从而快速定位关键函数。
缺点:
可能导致 APP 崩溃,追踪过程不够稳定。
输出数据较多,有效信息难以筛选。
具体流程:
运行脚本 toolchain_collect_ret_insn.py 。
选择“是”:在 IDB 所在目录生成对所有函数的 ret 指令处进行 hook 的脚本。
选择“否”:仅生成导出函数的 ret 指令处的 hook 脚本。
4.对生成的脚本进行简单调整后即可使用。
效果示例:
定位高频调用函数
思路
某些字符串混淆方案会在运行时频繁调用固定的字符串解密函数。由于一个 so 文件通常包含数百甚至上千个字符串,这些解密函数的调用次数往往远高于普通功能函数。通过统计所有函数的交叉引用次数并按从高到低排序,可以快速定位这些字符串解密函数。此外,这种方法还可以用于定位字符串的构造函数,作为去混淆的关键点。