某app加密算法逆向分析
字数 1548 2025-10-01 14:05:44
某APP加密算法逆向分析教学文档
概述
本教学文档基于对某APP加密算法的逆向分析,详细解析其加密流程、实现原理及解密方法。
一、环境准备与抓包分析
1.1 初始发现
- 在SRC漏洞挖掘过程中发现目标资产
- 通过抓包分析发现关键参数
phoneNum被加密 - 传统测试方法无法直接分析加密数据内容
1.2 工具准备
- 抓包工具:Burp Suite/Charles
- 逆向工具:JADX反编译工具
- 动态调试:Frida框架
- 开发环境:Python 3.x
二、静态代码分析
2.1 应用加固情况
- 目标APP未加固,可直接使用JADX进行反编译分析
2.2 关键代码定位
- 搜索关键词:
aes,encrypt,decrypt - 定位到加密类:
SecretHelper - 核心加密函数:
encode - 密钥生成函数:
getSecretKey
2.3 加密流程分析
2.3.1 加密函数调用链
encode() → getSecretKey() → c0.a()
2.3.2 密钥生成机制
c0.a()函数实现MD5哈希算法- 用于生成DES加密所需的密钥
三、加密算法详细解析
3.1 加密流程步骤
-
触发加密
- 输入参数:明文
str、业务标识str2
- 输入参数:明文
-
时间戳获取
- 获取当前系统时间戳
-
时间窗计算
- 计算公式:
t = l / 500000 - 其中
l为时间戳相关参数
- 计算公式:
-
DES密钥生成
- 通过MD5算法生成DES加密密钥
-
DES加密处理
- 使用生成的密钥对明文进行DES加密
-
结果编码处理
- Base64编码 → UTF-8编码 → 返回最终结果
3.2 关键算法实现
3.2.1 MD5密钥生成
// c0.a() 函数示例
public static String a(String str) {
try {
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(str.getBytes());
byte[] digest = instance.digest();
StringBuilder sb = new StringBuilder();
for (byte b : digest) {
String hexString = Integer.toHexString(b & 255);
if (hexString.length() == 1) {
sb.append('0');
}
sb.append(hexString);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
3.2.2 DES加密核心
// encode函数核心逻辑
public static String encode(String str, String str2) {
long currentTimeMillis = System.currentTimeMillis();
long j = currentTimeMillis / 500000; // 时间窗计算
String secretKey = getSecretKey(str2, j); // 生成密钥
// DES加密实现...
byte[] encrypt = desEncrypt(str.getBytes(), secretKey.getBytes());
return new String(Base64.encode(encrypt, 0), "UTF-8");
}
四、动态调试验证
4.1 Frida Hook配置
- 使用命令:
frida -U -f "包名" -l hook_script.js - 成功Hook加密函数并验证加密结果
4.2 Frida脚本示例
// 1.js - Frida Hook脚本
Java.perform(function() {
var SecretHelper = Java.use("com.example.SecretHelper");
SecretHelper.encode.implementation = function(str, str2) {
console.log("加密输入: ", str);
console.log("业务标识: ", str2);
var result = this.encode(str, str2);
console.log("加密结果: ", result);
return result;
}
});
4.3 验证结果
- Hook获取的加密结果与抓包数据一致
- 确认逆向分析的正确性
五、解密算法实现
5.1 Python解密脚本
import base64
from Crypto.Cipher import DES
import hashlib
def decrypt(encrypted_data, str2, l):
"""
解密函数
:param encrypted_data: 加密数据
:param str2: 业务标识
:param l: 时间戳参数
"""
# 计算时间窗
t = l / 500000
# 生成MD5密钥
key_str = str2 + str(t)
md5 = hashlib.md5()
md5.update(key_str.encode('utf-8'))
des_key = md5.hexdigest()[:8].encode('utf-8') # 取前8位作为DES密钥
# Base64解码
encrypted_bytes = base64.b64decode(encrypted_data)
# DES解密
cipher = DES.new(des_key, DES.MODE_ECB)
decrypted_bytes = cipher.decrypt(encrypted_bytes)
# PKCS5Unpadding
padding_len = decrypted_bytes[-1]
decrypted_bytes = decrypted_bytes[:-padding_len]
return decrypted_bytes.decode('utf-8')
# 使用示例
encrypted_phone = "Base64加密后的手机号"
business_flag = "业务标识字符串"
timestamp_param = 时间戳参数
decrypted_result = decrypt(encrypted_phone, business_flag, timestamp_param)
print("解密结果:", decrypted_result)
5.2 解密流程说明
- 时间窗计算:
t = l / 500000 - 密钥生成:MD5(业务标识 + 时间窗)
- Base64解码加密数据
- DES ECB模式解密
- PKCS5反填充处理
- 返回解密结果
六、总结与防护建议
6.1 加密方案评估
- 使用DES算法,安全性较低
- ECB模式存在固有安全风险
- 密钥生成依赖时间参数,可能存在时间同步问题
- 整体加密强度不足
6.2 安全建议
-
算法升级
- 建议使用AES-256替代DES
- 采用CBC或GCM模式代替ECB模式
-
密钥管理
- 使用更安全的密钥派生算法
- 避免使用时间相关参数作为密钥因素
-
加固保护
- 建议对APP进行加固处理
- 关键算法使用白盒加密技术
-
通信安全
- 建议使用完整的HTTPS通信
- 实现证书绑定机制
6.3 逆向分析技巧总结
- 关键词搜索是快速定位加密代码的有效方法
- 静态分析与动态调试相结合提高分析效率
- Frida等工具在移动安全测试中极为重要
- 理解加密流程后需要验证解密算法的正确性
附录:常见加密算法特征
识别特征表
| 算法 | 密钥长度 | 常见模式 | 识别特征 |
|---|---|---|---|
| DES | 56位 | ECB/CBC | 8字节密钥,64位分组 |
| AES | 128/192/256位 | ECB/CBC/GCM | 16/24/32字节密钥 |
| MD5 | 128位哈希 | - | 32字符十六进制串 |
| Base64 | - | - | 结尾常有=或==填充 |
本教学文档详细记录了从发现加密参数到完整逆向分析的全过程,为类似加密算法的分析提供了可复用的方法论和实践指南。