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密钥
准备工作
- 下载CE工具:Cheat Engine官网
- 安装时注意不要勾选额外组件
修改流程
- 打开目标小程序
- 在CE中选择小程序进程(进程名通常是小程序名称)
- 在内存中搜索关键字符串,定位密钥生成位置
- 修改算法使每次返回固定值(如32个字母"A")
- 右键将修改的内存添加到列表,设置为16进制30(0)并激活
- 重启小程序使修改生效(可能需要多次尝试)
注意事项
- 小程序重启:修改后需重启小程序,CE无需重新选择进程
- 成功判断:
- 观察列表中的值是"??"还是设置的值
- 右键浏览内存区域确认是否符合预期
- 修改失败处理:
- 多次重启仍无效时,重启CE工具
- 按原流程重新操作
Galaxy自动化加解密
环境准备
插件配置
- 安装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)
- 四个关键处理方向:
示例脚本解析
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
验证与使用
- Burp中观察:
- Proxy history中:
- 原始请求:origin request
- 解密请求:edited request
- 加密响应:edited response
- 解密响应:origin response
- Proxy history中:
- Repeater测试:
- 发送请求后自动加解密
- 响应显示为明文
高级应用
- 与扫描器联动:
- 在Setting中配置xray监听地址
- 勾选"Auto Scan Decrypted Request"实现自动化扫描
- SQL注入测试:
- 配置sqlmap路径
- 右键请求选择通过Galaxy发送到sqlmap
- 对加密流量进行SQL注入测试
常见问题解决
- CE修改不生效:
- 确认内存值是否正确修改
- 尝试重启CE和小程序多次
- 插件不工作:
- 确认使用AWS JDK
- 检查脚本是否正常运行
- 验证端口是否冲突
- 数据类型错误:
- 确保正确处理bytes和str类型转换
- 在关键位置添加类型检查
总结
通过CE固定内存中的动态密钥,结合Galaxy插件实现自动化加解密,可以有效解决小程序动态密钥场景下的安全测试难题。关键在于:
- 准确找到并修改内存中的密钥生成逻辑
- 正确编写加解密脚本处理四个方向的流量
- 确保环境配置正确,特别是JDK选择和端口设置
这种方法避免了重新打包小程序的复杂性,也绕过了无法获取RSA私钥的限制,为加密流量的安全测试提供了有效解决方案。