记一次安卓渗透流量被加密的解决思路
字数 1391 2025-08-22 12:23:00
安卓渗透中流量加密的绕过方法:修改SO文件实现SM4加密绕过
0x1 背景概述
在对银行APP进行渗透测试时,遇到了两个主要防护措施:
- APP被加壳保护
- 网络流量被加密传输
本文详细记录了如何通过修改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文件步骤:
- 首先搜索
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的库目录:
/data/app/~~xxxxxxxxx==/lib/arm/
替换后重启应用程序,即可捕获使用固定密钥加密的流量。
0x5 总结
该方法通过以下步骤实现加密流量绕过:
- 提取被加固保护的DEX文件
- 分析加密逻辑,定位关键SO文件
- 逆向SO文件,理解加密算法和密钥生成机制
- 修改SO文件固定加密密钥
- 替换SO文件并重启应用
关键点:
- 识别SM4 ECB模式加密,无需IV
- 理解密钥生成机制并固定密钥
- 正确修改和替换SO文件
这种方法不仅适用于SM4加密,对其他类似加密机制的APP也有参考价值。