ProxyPin AES 请求体解密 自动还原加密数据
为什么请求体需要加密
App 厂商对 API 通信做加密的常见原因:
- 防止中间人抓包直接看到敏感数据
- 防止接口被恶意爬取和滥用
- 满足监管安全要求
常见的加密方式:
| 算法 | 模式 |
|---|---|
| AES-128 | CBC / ECB / GCM |
| AES-256 | CBC / GCM |
| DES | CBC(老项目) |
| RSA | 通常只加密密钥 |
AES 是最常用的对称加密。
ProxyPin 的自动解密能力
ProxyPin 内置了 AES 请求体自动解密功能。配置好加密参数后:
- App 发出加密的请求(Body 是密文,通常 base64 编码)
- ProxyPin 拦截 → base64 解码 → AES 解密
- 请求列表中直接显示解密后的明文
- 修改明文后,ProxyPin 自动重新加密再发出
配置解密规则
进入「我的」→「请求解密」(或工具箱 → AES 解密):
配置项说明
| 参数 | 说明 | 示例 |
|---|---|---|
| 匹配域名 | 正则,哪些请求需要解密 | secure\.api\.example\.com |
| 算法 | AES 模式 | AES/CBC/PKCS7Padding |
| Key | 加密密钥(十六进制或 base64) | 0123456789abcdef... |
| IV | 初始向量(CBC 模式必须) | abcdef0123456789 |
| Base64 | 请求体是否需要先 base64 解码 | 是 |
| 作用对象 | 解密请求体 / 响应体 / 两者 | 请求体 |
配置示例
假设目标 App 用 AES/CBC/PKCS7Padding,密钥 32字节AES256Key!,IV 1234567890123456:
匹配域名:api.myapp.com
算法:AES/CBC/PKCS7Padding
Key:bXktc3VwZXItc2VjcmV0LTMyLWNoYXJhY3Rlci1rZXkh
IV:MTIzNDU2Nzg5MDEyMzQ1Ng==(或直接十六进制)
Base64 解码:是
作用对象:请求体
如何找到加密参数
ProxyPin 解密需要 Key 和 IV,但 App 一般不会在明文里暴露这些值。获取方式:
方式一:逆向 App
用 jadx / apktool 反编译 APK,搜索加密相关的类(AES、Cipher、SecretKeySpec 等),找到密钥硬编码位置。
方式二:Hook 运行时
用 Frida / Xposed Hook App 的加密函数,在运行时 dump 出 Key 和 IV:
// Frida Hook AES 加密
Java.perform(function() {
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload('[B').implementation = function(input) {
console.log('AES Input:', input);
var result = this.doFinal(input);
console.log('AES Output:', result);
return result;
};
});
方式三:从 App 内置配置提取
有些 App 会把密钥放在 assets 目录下的配置文件里,直接解压 APK 就能看到。
实战流程
- 用 ProxyPin 抓包,找到加密的请求(Body 看起来是 base64 密文)
- 逆向或 Hook 得到 Key 和 IV
- 在 ProxyPin 中配置解密规则
- 刷新 App,再次抓包 → 明文显示
安全研究场景
AES 解密功能在以下场景特别有用:
- API 安全测试:先解密看清楚数据结构,再构造恶意请求体
- 流量分析:明文比密文容易做统计和模式分析
- 复现 Bug:看清请求/响应的真实内容,定位问题更快