某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 加密流程步骤

  1. 触发加密

    • 输入参数:明文str、业务标识str2
  2. 时间戳获取

    • 获取当前系统时间戳
  3. 时间窗计算

    • 计算公式:t = l / 500000
    • 其中l为时间戳相关参数
  4. DES密钥生成

    • 通过MD5算法生成DES加密密钥
  5. DES加密处理

    • 使用生成的密钥对明文进行DES加密
  6. 结果编码处理

    • 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 解密流程说明

  1. 时间窗计算:t = l / 500000
  2. 密钥生成:MD5(业务标识 + 时间窗)
  3. Base64解码加密数据
  4. DES ECB模式解密
  5. PKCS5反填充处理
  6. 返回解密结果

六、总结与防护建议

6.1 加密方案评估

  • 使用DES算法,安全性较低
  • ECB模式存在固有安全风险
  • 密钥生成依赖时间参数,可能存在时间同步问题
  • 整体加密强度不足

6.2 安全建议

  1. 算法升级

    • 建议使用AES-256替代DES
    • 采用CBC或GCM模式代替ECB模式
  2. 密钥管理

    • 使用更安全的密钥派生算法
    • 避免使用时间相关参数作为密钥因素
  3. 加固保护

    • 建议对APP进行加固处理
    • 关键算法使用白盒加密技术
  4. 通信安全

    • 建议使用完整的HTTPS通信
    • 实现证书绑定机制

6.3 逆向分析技巧总结

  • 关键词搜索是快速定位加密代码的有效方法
  • 静态分析与动态调试相结合提高分析效率
  • Frida等工具在移动安全测试中极为重要
  • 理解加密流程后需要验证解密算法的正确性

附录:常见加密算法特征

识别特征表

算法 密钥长度 常见模式 识别特征
DES 56位 ECB/CBC 8字节密钥,64位分组
AES 128/192/256位 ECB/CBC/GCM 16/24/32字节密钥
MD5 128位哈希 - 32字符十六进制串
Base64 - - 结尾常有=或==填充

本教学文档详细记录了从发现加密参数到完整逆向分析的全过程,为类似加密算法的分析提供了可复用的方法论和实践指南。

某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 加密函数调用链 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密钥生成 3.2.2 DES加密核心 四、动态调试验证 4.1 Frida Hook配置 使用命令: frida -U -f "包名" -l hook_script.js 成功Hook加密函数并验证加密结果 4.2 Frida脚本示例 4.3 验证结果 Hook获取的加密结果与抓包数据一致 确认逆向分析的正确性 五、解密算法实现 5.1 Python解密脚本 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 | - | - | 结尾常有=或==填充 | 本教学文档详细记录了从发现加密参数到完整逆向分析的全过程,为类似加密算法的分析提供了可复用的方法论和实践指南。