加密的请求体看不到明文?用 ProxyPin 一键解密搞定
| 项目 | 内容 |
|---|---|
| 软件 | ProxyPin |
| 版本 | 1.3.0 |
| 平台 | Android APK |
| 体积 | 35.69M |
| 分类 | 系统工具 |
| 包名 | com.network.proxy |
| 官网 | ProxyPin 官网 |
| 下载一 | ProxyPin 下载,ProxyPin 下载 |
| 下载二 | ProxyPin 下载,ProxyPin 下载 |
| 文档 | ProxyPin 文档 |
| 介绍 | 手机端抓包调试时遇到 HTTPS 和 AES 加密怎么办?这篇讲我在实际项目里用 ProxyPin 解密加密 API 请求、改写请求参数的完整经历。 |
ProxyPin 是一款 Android 平台的网络抓包代理工具,核心能力就是拦截 App 的 HTTP/HTTPS 请求和响应,让我们看到原本藏在传输层里的真实数据。相比传统的桌面端抓包工具(比如 Charles、Fiddler),它最大的优势是直接跑在手机上,免去了配置电脑代理、在同一局域网折腾证书信任的麻烦——装上 APK 就能用。
我为什么需要它
说个真实的事吧。
上周我在帮朋友测一个购物类 App 的接口逻辑。这个 App 做了两层防护:所有请求走 HTTPS 加密传输,请求体本身再用 AES-CBC 加密一次,最终以 base64 字符串发出去。我用传统方式(设置手机代理到电脑上的 Charles)抓包,只能看到一串 base64 密文,完全不知道里面的 JSON 结构是什么样。
要解密得拿到 AES 的密钥和 IV——这俩东西藏在 App 代码里。我用 jadx 反编译了 APK,在网络请求的工具类里找到了硬编码的密钥字符串,又搜了一圈确定了加密模式是 AES/CBC/PKCS7Padding,IV 是固定的十六进制值。但就算拿到了这些参数,手动每次抓完包去写个 Python 脚本解密也太麻烦了——我还要改请求参数发回去验证,总不能每改一次都手动加密再 base64 编码吧?
同事说你试试 ProxyPin,它有自动解密功能。
装上就能用的 HTTPS 解密
ProxyPin 的 APK 只有 35M 左右,Android 5.0 以上都能装。安装完打开就是一个很简洁的界面——底部四个标签:抓包、重写、脚本、我的。
第一个要做的事是启用 HTTPS 代理。在「我的」页面点「HTTPS 代理」,它会引导你安装根证书到手机的用户证书存储。这一步和 Charles 的流程一样,但 ProxyPin 做得更顺滑——它会弹出一个二维码让你用浏览器访问下载页面,安装完系统会自动提示你给证书命名,点确认就行。
启用 HTTPS 代理之后,回到抓包标签,看到的请求就不再是 CONNECT tunneling 了,而是完整的 HTTP 请求和响应,包括请求头、请求体、响应状态码、响应体。这一步其实就已经解决了大部分人的抓包需求——不用再写脚本处理 TLS 解密。
配置 AES 自动解密
但我的问题还没解决——请求体本身是密文,就算 HTTPS 解了,Body 里还是 base64。
在「我的」页面往下滑,找到「AES 请求解密」入口。点进去就是配置界面,字段很清晰:
- 匹配域名:用正则指定哪些请求需要解密。我填了
secure\.api\..*\.com,只匹配那个 App 的安全接口,其他请求不碰 - 算法:从下拉框选
AES/CBC/PKCS7Padding,和 App 里用的一致 - Key:粘贴刚才从 jadx 里拿到的密钥,ProxyPin 支持十六进制或 base64 两种格式,我选了 base64
- IV:同样粘贴从代码里找到的 IV 值
- Base64 解码:打开开关,因为密文本身是 base64 编码的
- 作用对象:只选「请求体」,响应体 App 自己会处理,我不关心
配完点保存,重新开一次 App,刷新抓包列表——原来那串 base64 密文不见了,直接显示成了格式化的 JSON,里面的字段、值、结构一目了然。

配合脚本引擎改请求
光是看明文还不够,测试时我需要临时改请求参数。比如某个分页接口,我想把 page 参数从 1 改成 5,看看返回的数据结构有没有变化。
ProxyPin 内置了 JavaScript 脚本引擎,支持 onRequest 和 onResponse 两个钩子。我写了个简单的脚本:
function onRequest(context, request) {
if (request.method === 'GET' && request.url.includes('/goods/list')) {
let url = new URL(request.url);
url.searchParams.set('page', '5');
context.log('改了 page 参数到 5');
request.url = url.toString();
}
return request;
}
脚本保存后自动生效。下次 App 请求商品列表接口时,ProxyPin 会在发出去之前把 page 参数改成 5,App 本身毫无察觉。而且因为 AES 解密规则先于脚本执行,我在脚本里拿到的 request body 已经是明文了,修改后 ProxyPin 会自动重新加密再发出去——整个流程完全自动化。

一个周末搞定的事
整个周末我用 ProxyPin 做了三件事:解密加密的 API 请求、用脚本改参数发回去、Hosts 映射把生产域名临时指向本地 mock 服务器做联调。以前这些动作要开三四个工具(Charles 解 HTTPS、Python 脚本手动加解密、改系统 hosts 文件切环境),现在一个 App 全搞定了。
当然它也有局限——毕竟跑在手机上,复杂的正则规则写起来不如桌面端方便,脚本调试也需要反复看 ProxyPin 内置的日志面板。但对于移动端抓包调试的日常需求,ProxyPin 已经足够好用。最关键的是它不依赖 root 权限,装上 APK 就能开始干活,这个门槛实在太低了。
本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

