老柯修机铺

通讯行老师傅的手机软件笔记——每款 App 装过、用过,才敢写下来

加密的请求体看不到明文?用 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,里面的字段、值、结构一目了然。

ProxyPin 解密后的请求列表,明文 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 工具箱界面,集成了重写、脚本、AES 解密等多种工具

一个周末搞定的事

整个周末我用 ProxyPin 做了三件事:解密加密的 API 请求、用脚本改参数发回去、Hosts 映射把生产域名临时指向本地 mock 服务器做联调。以前这些动作要开三四个工具(Charles 解 HTTPS、Python 脚本手动加解密、改系统 hosts 文件切环境),现在一个 App 全搞定了。

当然它也有局限——毕竟跑在手机上,复杂的正则规则写起来不如桌面端方便,脚本调试也需要反复看 ProxyPin 内置的日志面板。但对于移动端抓包调试的日常需求,ProxyPin 已经足够好用。最关键的是它不依赖 root 权限,装上 APK 就能开始干活,这个门槛实在太低了。

本文为个人基于网络公开资料整理编写,非官方内容,仅供学习交流参考;软件版权归原作者所有,请支持正版;使用过程中遇到问题请查阅官方渠道,本文不承担任何责任。

同类文章

caustic 手機音樂製作速查:新手必問的 8 個問題

一篇問答式整理,覆蓋 caustic 是什麼、怎麼裝、合成器有多全、MIDI 能不能接、循環游標怎麼用等新手最常見的問題,幫你快速上手這款 Android 端的電子音樂製作工具。

Chatbox 用了半個月,踩過的五個坑都在這裡

Chatbox 支援多模型接入、有工作模式能自動跑任務,看似簡單好用,實際有幾個容易翻車的地方——模式鎖死、知識庫檢索失效、移動端功能閹割,踩過的人都懂。