首页
社区
课程
招聘
[原创]native去混淆——字符串加密
发表于: 2025-7-5 15:56 7452

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

2025-7-5 15:56
7452

随着安全对抗的日益升级,在进行 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、使用珍惜大佬的开源项目 f4aK9s2c8@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 和内存扫描等技术手段。通过这些方法,可以有效应对不同类型的字符串加密方案,为逆向分析提供强有力的支持。希望本文的分享能为读者在实际工作中提供启发和帮助。

仓库地址: 791K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8h3t1@1k6r3@1@1L8W2)9J5c8V1c8W2j5h3c8D9P5g2)9J5k6o6x3H3x3o6l9`.

FCAnd.jni.hookJNI('NewString', {
 
    onEnter: function (args) {
 
        try {
 
            var str = args[1].readCString();
 
            console.log('NewString ' + ' str: ' + str);
 
        } catch (error) {
 
   
 
        }
 
    }
 
});
 
FCAnd.jni.hookJNI('NewStringUTF', {
 
    onEnter: function (args) {
 
        try {
 
            var str = args[1].readCString();
 
            console.log('NewStringUTF ' + ' str: ' + str  );
 
        } catch (error) {
 
   
 
        }
 
    }
 
});
 
FCAnd.jni.hookJNI('GetStringUTFChars', {
 
    onLeave: function (retval) {
 
        try {
 
            var str = retval.readCString();
 
            console.log('GetStringUTFChars ' + ' str: ' + str  );
 
        } catch (error) {
 
   
 
        }
 
    }
 
});
FCAnd.jni.hookJNI('NewString', {
 
    onEnter: function (args) {
 
        try {
 
            var str = args[1].readCString();
 
            console.log('NewString ' + ' str: ' + str);
 
        } catch (error) {
 
   
 
        }
 
    }
 
});
 
FCAnd.jni.hookJNI('NewStringUTF', {
 
    onEnter: function (args) {
 
        try {
 

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 126
支持
分享
最新回复 (88)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-7-5 20:30
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2025-7-5 22:54
0
雪    币: 3031
活跃值: (3879)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
过来瞧瞧
2025-7-6 00:27
0
雪    币: 3501
活跃值: (5020)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2025-7-6 11:30
0
雪    币: 70
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享
2025-7-6 12:59
0
雪    币: 160
活跃值: (1571)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
必须回复
2025-7-6 14:37
0
雪    币: 3780
活跃值: (4065)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2025-7-6 15:17
0
雪    币: 293
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
666666
2025-7-6 15:31
0
雪    币: 3868
活跃值: (2474)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很强
2025-7-6 22:09
0
雪    币: 104
活跃值: (7159)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
666
2025-7-7 09:03
0
雪    币: 242
活跃值: (3350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
666
2025-7-7 09:13
0
雪    币: 14
活跃值: (574)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢分享
2025-7-7 10:09
0
雪    币: 777
活跃值: (2022)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
给力!
2025-7-7 10:10
0
雪    币: 25
活跃值: (2071)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
感谢分享
2025-7-7 10:17
0
雪    币: 208
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
16
感谢分享
2025-7-7 10:19
0
雪    币: 2724
活跃值: (2631)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
1
2025-7-7 10:39
0
雪    币: 2307
活跃值: (3950)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
样本app 是哪个?
2025-7-7 11:17
0
雪    币: 375
活跃值: (3191)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
666
2025-7-7 11:38
0
雪    币: 0
活跃值: (1109)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
666
2025-7-7 14:16
0
雪    币: 105
活跃值: (2262)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
66666
2025-7-7 14:25
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
学习
2025-7-7 14:59
0
雪    币: 1495
活跃值: (3698)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
23
6666
2025-7-7 15:49
0
雪    币: 169
活跃值: (973)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
24
优秀
2025-7-7 16:56
0
雪    币: 603
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
25
666
2025-7-7 19:40
0
游客
登录 | 注册 方可回帖
返回