CE固定小程序动态密钥后自动化加解密
字数 1698 2025-08-29 22:41:01

小程序动态密钥自动化加解密实战指南

前言

本教程详细讲解如何通过CE(Cheat Engine)固定小程序动态生成的AES密钥,并使用Burp插件Galaxy实现自动化加解密。适用于处理采用动态AES密钥加密的小程序通信场景。

加解密分析

加密机制

  • 加密算法:AES ECB Pkcs7
  • 密钥生成:每次请求随机生成AES密钥
  • 密钥传输:AES密钥通过RSA加密后放在HTTP请求头"token"中传输
  • 服务器处理:服务器用RSA私钥解密token获取AES密钥,再用AES密钥解密请求包和加密响应包

挑战

  • 小程序有完整性检测,重新打包修改密钥会导致自动恢复原始包
  • 无法获取RSA私钥,不能直接解密传输的AES密钥

CE修改内存固定AES密钥

准备工作

  1. 下载CE工具:Cheat Engine官网
  2. 安装时注意不要勾选额外组件

修改流程

  1. 打开目标小程序
  2. 在CE中选择小程序进程(进程名通常是小程序名称)
  3. 在内存中搜索关键字符串,定位密钥生成位置
  4. 修改算法使每次返回固定值(如32个字母"A")
  5. 右键将修改的内存添加到列表,设置为16进制30(0)并激活
  6. 重启小程序使修改生效(可能需要多次尝试)

注意事项

  1. 小程序重启:修改后需重启小程序,CE无需重新选择进程
  2. 成功判断
    • 观察列表中的值是"??"还是设置的值
    • 右键浏览内存区域确认是否符合预期
  3. 修改失败处理
    • 多次重启仍无效时,重启CE工具
    • 按原流程重新操作

Galaxy自动化加解密

环境准备

  1. 下载Galaxy插件:GitHub仓库
  2. 安装AWS JDK:下载地址
    • 必须使用AWS JDK启动Burp,常规Oracle JDK可能不兼容

插件配置

  1. 安装Galaxy插件到Burp
  2. 配置项:
    • 设置目标host地址
    • 设置HTTP监听地址(默认5000,冲突时可改为如9000)
    • 点击"Start"启动
    • 可选勾选"Auto Scan Decrypted Request"实现与xray等扫描器的联动

加解密脚本开发

基础模板

使用提供的demo脚本:GalaxyHttpHooker
安装依赖:pip install -r requirements.txt

核心要点

  1. 密钥设置:修改脚本中的KEY值为CE固定的值
  2. 数据处理
    • 四个关键处理方向:
      • 客户端→Burp:请求解密
      • Burp→服务器:请求加密
      • 服务器→Burp:响应解密
      • Burp→客户端:响应加密
    • 注意数据类型转换(bytes与str)

示例脚本解析

import json
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

# 固定密钥(32个"A")
KEY = b"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"

def decrypt(content: bytes) -> bytes:
    cipher = AES.new(KEY, AES.MODE_ECB)
    return unpad(cipher.decrypt(content), AES.block_size)

def encrypt(content: bytes) -> bytes:
    cipher = AES.new(KEY, AES.MODE_ECB)
    return cipher.encrypt(pad(content, AES.block_size))

# 四个核心处理函数
async def hook_request_to_burp(request):
    """客户端→Burp:请求解密"""
    # 去除双引号并base64解码
    request_body = request.content.decode().replace('"', '')
    encrypted_data = base64.b64decode(request_body)
    # 解密
    request.content = decrypt(encrypted_data)
    return request

async def hook_request_to_server(request):
    """Burp→服务器:请求加密"""
    # 加密并base64编码,加回双引号
    encrypted_data = encrypt(request.content)
    request.content = b'"' + base64.b64encode(encrypted_data) + b'"'
    return request

async def hook_response_to_burp(response):
    """服务器→Burp:响应解密"""
    # base64解码后解密
    encrypted_data = base64.b64decode(response.content)
    response.content = decrypt(encrypted_data)
    return response

async def hook_response_to_client(response):
    """Burp→客户端:响应加密"""
    # 加密并base64编码
    response.content = base64.b64encode(encrypt(response.content))
    return response

脚本运行

uvicorn 脚本名:app --host 0.0.0.0 --port 端口号 --workers 4

示例:uvicorn modify_aes_ecb:app --host 0.0.0.0 --port 9000 --workers 4

验证与使用

  1. Burp中观察
    • Proxy history中:
      • 原始请求:origin request
      • 解密请求:edited request
      • 加密响应:edited response
      • 解密响应:origin response
  2. Repeater测试
    • 发送请求后自动加解密
    • 响应显示为明文

高级应用

  1. 与扫描器联动
    • 在Setting中配置xray监听地址
    • 勾选"Auto Scan Decrypted Request"实现自动化扫描
  2. SQL注入测试
    • 配置sqlmap路径
    • 右键请求选择通过Galaxy发送到sqlmap
    • 对加密流量进行SQL注入测试

常见问题解决

  1. CE修改不生效
    • 确认内存值是否正确修改
    • 尝试重启CE和小程序多次
  2. 插件不工作
    • 确认使用AWS JDK
    • 检查脚本是否正常运行
    • 验证端口是否冲突
  3. 数据类型错误
    • 确保正确处理bytes和str类型转换
    • 在关键位置添加类型检查

总结

通过CE固定内存中的动态密钥,结合Galaxy插件实现自动化加解密,可以有效解决小程序动态密钥场景下的安全测试难题。关键在于:

  1. 准确找到并修改内存中的密钥生成逻辑
  2. 正确编写加解密脚本处理四个方向的流量
  3. 确保环境配置正确,特别是JDK选择和端口设置

这种方法避免了重新打包小程序的复杂性,也绕过了无法获取RSA私钥的限制,为加密流量的安全测试提供了有效解决方案。

小程序动态密钥自动化加解密实战指南 前言 本教程详细讲解如何通过CE(Cheat Engine)固定小程序动态生成的AES密钥,并使用Burp插件Galaxy实现自动化加解密。适用于处理采用动态AES密钥加密的小程序通信场景。 加解密分析 加密机制 加密算法:AES ECB Pkcs7 密钥生成:每次请求随机生成AES密钥 密钥传输:AES密钥通过RSA加密后放在HTTP请求头"token"中传输 服务器处理:服务器用RSA私钥解密token获取AES密钥,再用AES密钥解密请求包和加密响应包 挑战 小程序有完整性检测,重新打包修改密钥会导致自动恢复原始包 无法获取RSA私钥,不能直接解密传输的AES密钥 CE修改内存固定AES密钥 准备工作 下载CE工具: Cheat Engine官网 安装时注意不要勾选额外组件 修改流程 打开目标小程序 在CE中选择小程序进程(进程名通常是小程序名称) 在内存中搜索关键字符串,定位密钥生成位置 修改算法使每次返回固定值(如32个字母"A") 右键将修改的内存添加到列表,设置为16进制30(0)并激活 重启小程序使修改生效(可能需要多次尝试) 注意事项 小程序重启 :修改后需重启小程序,CE无需重新选择进程 成功判断 : 观察列表中的值是"??"还是设置的值 右键浏览内存区域确认是否符合预期 修改失败处理 : 多次重启仍无效时,重启CE工具 按原流程重新操作 Galaxy自动化加解密 环境准备 下载Galaxy插件: GitHub仓库 安装AWS JDK: 下载地址 必须使用AWS JDK启动Burp,常规Oracle JDK可能不兼容 插件配置 安装Galaxy插件到Burp 配置项: 设置目标host地址 设置HTTP监听地址(默认5000,冲突时可改为如9000) 点击"Start"启动 可选勾选"Auto Scan Decrypted Request"实现与xray等扫描器的联动 加解密脚本开发 基础模板 使用提供的demo脚本: GalaxyHttpHooker 安装依赖: pip install -r requirements.txt 核心要点 密钥设置 :修改脚本中的KEY值为CE固定的值 数据处理 : 四个关键处理方向: 客户端→Burp:请求解密 Burp→服务器:请求加密 服务器→Burp:响应解密 Burp→客户端:响应加密 注意数据类型转换(bytes与str) 示例脚本解析 脚本运行 示例: uvicorn modify_aes_ecb:app --host 0.0.0.0 --port 9000 --workers 4 验证与使用 Burp中观察 : Proxy history中: 原始请求:origin request 解密请求:edited request 加密响应:edited response 解密响应:origin response Repeater测试 : 发送请求后自动加解密 响应显示为明文 高级应用 与扫描器联动 : 在Setting中配置xray监听地址 勾选"Auto Scan Decrypted Request"实现自动化扫描 SQL注入测试 : 配置sqlmap路径 右键请求选择通过Galaxy发送到sqlmap 对加密流量进行SQL注入测试 常见问题解决 CE修改不生效 : 确认内存值是否正确修改 尝试重启CE和小程序多次 插件不工作 : 确认使用AWS JDK 检查脚本是否正常运行 验证端口是否冲突 数据类型错误 : 确保正确处理bytes和str类型转换 在关键位置添加类型检查 总结 通过CE固定内存中的动态密钥,结合Galaxy插件实现自动化加解密,可以有效解决小程序动态密钥场景下的安全测试难题。关键在于: 准确找到并修改内存中的密钥生成逻辑 正确编写加解密脚本处理四个方向的流量 确保环境配置正确,特别是JDK选择和端口设置 这种方法避免了重新打包小程序的复杂性,也绕过了无法获取RSA私钥的限制,为加密流量的安全测试提供了有效解决方案。