记一次安卓渗透流量被加密的解决思路
字数 1391 2025-08-22 12:23:00

安卓渗透中流量加密的绕过方法:修改SO文件实现SM4加密绕过

0x1 背景概述

在对银行APP进行渗透测试时,遇到了两个主要防护措施:

  1. APP被加壳保护
  2. 网络流量被加密传输

本文详细记录了如何通过修改SO文件的方式绕过这些防护措施,特别是针对SM4加密流量的处理方案。

0x2 反编译与DEX提取

2.1 加固识别与处理

  • 初步判断为"娜迦加固",但实际分析后发现MT管理器提供的加固识别可能有误
  • 关键函数分析发现了一个可疑的copyAssets方法,其中包含DEX文件处理逻辑

2.2 DEX文件提取关键代码分析

private static void copyAssets(String output, String input, Context context) {
    try {
        InputStream inputStream = context.getAssets().open(input);
        File localFile = new File(output);
        byte[] bytes = new byte[65536];
        BufferedInputStream bufferedInput = new BufferedInputStream(inputStream);
        BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(localFile));
        boolean first = true;
        byte[] nagic = {78, 71, 0, 0};
        byte[] magic = {100, 101, 120, 10};
        
        while (true) {
            int i = bufferedInput.read(bytes);
            if (first) {
                first = false;
                if (!(output.endsWith(Defines._DEX) && bytes[0] == nagic[0] && bytes[1] == nagic[1] && bytes[2] == nagic[2] && bytes[3] == nagic[3]) 
                    && output.endsWith(Defines._DEX) && bytes[0] == 110 && bytes[1] == 97 && bytes[2] == 103 && bytes[3] == 97) {
                    System.arraycopy(magic, 0, bytes, 0, magic.length);
                }
            }
            if (i <= 0) {
                bufferedOutput.flush();
                bufferedOutput.close();
                bufferedInput.close();
                return;
            }
            bufferedOutput.write(bytes, 0, i);
        }
    } catch (Exception e) {}
}

关键点:

  • magic字段{100, 101, 120, 10}对应ASCII码"dex",是DEX文件头
  • 文件最终写入应用程序数据目录的.cache目录下
  • 安装运行APP后,可在该目录找到原生DEX文件

0x3 加密流量分析

3.1 加密函数定位

  • 通过抓包发现API路径以"mobile"开头
  • 搜索相关API找到加密函数telecomSMEncrypt
  • 该函数通过JNI调用SO文件中的原生函数进行加解密

3.2 SO文件分析

使用IDA分析SO文件步骤:

  1. 首先搜索getNativeSM4EncryptValue函数,未找到
  2. 转而搜索JNI_OnLoad函数(幸运的是该函数未被混淆)
  3. 通过JNI_OnLoad定位到实际加密函数_Z10getSMValueP7_JNIEnvP8_jobjectP8_jstringS4_

3.3 SM4加密分析

关键发现:

  • 加密使用SM4算法,ECB模式(无IV)
  • 密钥byte_1FFDB9是32位随机值,来自byte_18703A数组
  • 密钥生成依据byte_1FFDB8值为0的情况,推测每次打开APP都会初始化新密钥

3.4 加密数据格式

请求体格式为%s|%s|%s,分析发现:

  1. 第一个%s(v12):SM2加密的密钥值(非对称加密,需私钥解密)
  2. 第二个%s(v13):SM4加密的密文
  3. 第三个%s(v8):HMAC签名值(推测为SM3哈希)

0x4 绕过加密方案

4.1 固定密钥策略

由于服务端需要解密数据,但客户端每次生成随机密钥,解决方案:

  • 修改SO文件,固定SM4加密密钥为已知值
  • byte_18703A数组所有值改为大写'A'(0x41)
  • 这样密钥将固定为32个'A',便于后续解密

4.2 SO文件修改步骤

  1. 使用IDA定位到byte_18703A数组
  2. 将所有数组值修改为0x41(大写'A'的ASCII码)
  3. 使用IDA的补丁功能保存修改:
    • Edit → Patch program → Apply patches to input file...

4.3 替换SO文件

将修改后的SO文件替换到APK的库目录:

/data/app/~~xxxxxxxxx==/lib/arm/

替换后重启应用程序,即可捕获使用固定密钥加密的流量。

0x5 总结

该方法通过以下步骤实现加密流量绕过:

  1. 提取被加固保护的DEX文件
  2. 分析加密逻辑,定位关键SO文件
  3. 逆向SO文件,理解加密算法和密钥生成机制
  4. 修改SO文件固定加密密钥
  5. 替换SO文件并重启应用

关键点:

  • 识别SM4 ECB模式加密,无需IV
  • 理解密钥生成机制并固定密钥
  • 正确修改和替换SO文件

这种方法不仅适用于SM4加密,对其他类似加密机制的APP也有参考价值。

安卓渗透中流量加密的绕过方法:修改SO文件实现SM4加密绕过 0x1 背景概述 在对银行APP进行渗透测试时,遇到了两个主要防护措施: APP被加壳保护 网络流量被加密传输 本文详细记录了如何通过修改SO文件的方式绕过这些防护措施,特别是针对SM4加密流量的处理方案。 0x2 反编译与DEX提取 2.1 加固识别与处理 初步判断为"娜迦加固",但实际分析后发现MT管理器提供的加固识别可能有误 关键函数分析发现了一个可疑的 copyAssets 方法,其中包含DEX文件处理逻辑 2.2 DEX文件提取关键代码分析 关键点: magic 字段 {100, 101, 120, 10} 对应ASCII码"dex",是DEX文件头 文件最终写入应用程序数据目录的 .cache 目录下 安装运行APP后,可在该目录找到原生DEX文件 0x3 加密流量分析 3.1 加密函数定位 通过抓包发现API路径以"mobile"开头 搜索相关API找到加密函数 telecomSMEncrypt 该函数通过JNI调用SO文件中的原生函数进行加解密 3.2 SO文件分析 使用IDA分析SO文件步骤: 首先搜索 getNativeSM4EncryptValue 函数,未找到 转而搜索 JNI_OnLoad 函数(幸运的是该函数未被混淆) 通过 JNI_OnLoad 定位到实际加密函数 _Z10getSMValueP7_JNIEnvP8_jobjectP8_jstringS4_ 3.3 SM4加密分析 关键发现: 加密使用SM4算法,ECB模式(无IV) 密钥 byte_1FFDB9 是32位随机值,来自 byte_18703A 数组 密钥生成依据 byte_1FFDB8 值为0的情况,推测每次打开APP都会初始化新密钥 3.4 加密数据格式 请求体格式为 %s|%s|%s ,分析发现: 第一个 %s (v12):SM2加密的密钥值(非对称加密,需私钥解密) 第二个 %s (v13):SM4加密的密文 第三个 %s (v8):HMAC签名值(推测为SM3哈希) 0x4 绕过加密方案 4.1 固定密钥策略 由于服务端需要解密数据,但客户端每次生成随机密钥,解决方案: 修改SO文件,固定SM4加密密钥为已知值 将 byte_18703A 数组所有值改为大写'A'(0x41) 这样密钥将固定为32个'A',便于后续解密 4.2 SO文件修改步骤 使用IDA定位到 byte_18703A 数组 将所有数组值修改为0x41(大写'A'的ASCII码) 使用IDA的补丁功能保存修改: Edit → Patch program → Apply patches to input file... 4.3 替换SO文件 将修改后的SO文件替换到APK的库目录: 替换后重启应用程序,即可捕获使用固定密钥加密的流量。 0x5 总结 该方法通过以下步骤实现加密流量绕过: 提取被加固保护的DEX文件 分析加密逻辑,定位关键SO文件 逆向SO文件,理解加密算法和密钥生成机制 修改SO文件固定加密密钥 替换SO文件并重启应用 关键点: 识别SM4 ECB模式加密,无需IV 理解密钥生成机制并固定密钥 正确修改和替换SO文件 这种方法不仅适用于SM4加密,对其他类似加密机制的APP也有参考价值。