什么?Sonic 云真机还能在线代理网络抓包?

v1.3.2-beta 已发布啦~ 这次 Sonic 云真机的版本有个很亮眼的功能,就是在线代理网络抓包。

先上使用教学

1、打开对应 tab 页面,下面以今日头条 App 为例

2、首次使用需要安装证书,点击下载证书按钮,手机会自动跳转到下载页,下载证书后安装即可


3、点击开始代理,就可以使用啦~

4、点击对应接口可以看到详细信息

背景

过去我们手机抓包本来就是不太方便,连接 wifi、手动配置代理、信任证书、开启服务等等步骤比较麻烦。不少用户提出这个需求后决定动手做下这个事情,将 http 和 https 的抓包放到平台上,确实能解决不少用户的烦恼啊,话不多说,开干。

技术预研

  1. 常见的抓包工具是 fiddler、charles,桌面端的移植到 Web 端力气是比较大的。基本可以马上排除。
  2. js 有一个whistle,当时觉得就不错,npm 可以直接部署,并且功能强,附带 web 页面。可惜目前逐渐排除 npm 依赖,减少用户安装门槛,所以这个暂时作为保底方案。
  3. python 有个不错的工具叫 mitmproxy,直接 py 部署,有证书,有 web 页面,都齐全了。可惜 sonic 目前已经排除了 py 依赖,所以同上,暂时作为保底方案
  4. 哎?原来还有人做了 go 版的 mitmproxy,叫go-mitmproxy,使用起来不错,该有的都有了,而且 go 打包后的二进制文件可以直接运行,不需要额外依赖,行,就选你了。

改造 go-mitmproxy

接下来对 go-mitmproxy 进行了定制改造与优化,当然优化的点我也会提交 pr 给原作者,原作者也十分满意,后续也欢迎 sonic 一同建设。毕竟共同建设比自己二开成长会更快呀!
优化点:

  1. go-mitmproxy 默认证书生成在用户根目录.mitmproxy 文件夹下面,这个有一个不够好的地方是用户需要先找到证书才能 push 给手机安装,那么 sonic 作为平台化的东西,这个肯定是不够友好的。于是微调了代码,给原项目加上了自定义证书生成目录,这样的话 sonic 的 Agent 端也可以直接做一层文件转发。手机只需要去到 Agent 下载页即可下载。
  2. go-mitmproxy 默认没有生成 cer 证书,只有 pem 证书。然而有的安卓机器不识别 pem 证书,于是我也加以优化,加上了 cer 证书的生成。
func (ca *CA) saveCert() error {
file, err := os.Create(ca.caCertFile())
if err != nil {
    return err
}
defer file.Close()
err = ca.saveCertTo(file)
if err != nil {
    return err
}

return ca.saveCertTo(file)
cerFile, err := os.Create(ca.caCertCerFile())
if err != nil {
    return err
}
defer cerFile.Close()
err = ca.saveCertTo(cerFile)
if err != nil {
    return err
}
return err
}
  1. go-mitmproxy 默认的 web 页面上下滚动时,只是接口列表的表头吸顶,但是头部比较重要的筛选输入框没有做这个处理,于是乎我们的前端小伙也帮忙优化,最终做成了整个吸顶。我也对表宽度加上了自定义伸缩适配,适配较小分辨率的浏览器。
.top-control {
position: sticky;
display: flex;
align-items: center;
background-color: #fff;
top: 0;
padding: 10px;
}

最终提交 pr 如下:

当然也欢迎大家参与建设 go-mitmproxy~

定制部分:

  1. 主要是替换 react 默认 logo 与去除部分外链,打造更贴合 Sonic 业务的界面
  2. 减少 arm 平台的依赖

定制部分主要针对 sonic,所以这部分就没有提交 pr 了。定制结果就是 Sonic 第二个周边生态sonic-go-mitmproxy

接入 Sonic

定制与优化部分完毕了,接下来就是接入到 Sonic 里面去。

一般我们使用代理第一步是连接 Wifi,目前 wifi 列表和连接 Wifi 的功能我们还在打磨,目前实现的效果不够精细化,所以目前需要用户自己手动连接 Wifi。

第二步是配置代理,配置代理有看过一些开源项目:https://github.com/steinwurf/adb-join-wifi,基本大部分的项目写法跟这个差不多,确实很方便,一条指令连接 wifi 加上配置代理。可惜大部分 API 都已经过期了,安卓 10 开始大部分 API 用不了,那这种情况怎么办呢?
Sonic 目前只能选用全局代理,然后用户退出的时候取消全局代理来实现。那么这时候又有人问了,全局代理取消之后不是要重启手机吗?
其实是可以做到不用重启手机的,只不过目前百度的话 99% 的帖子都找不到这个正确答案(可能太多人复制粘贴了):

adb shell settings put global http_proxy ip:port

adb shell settings put global http_proxy :0

这样,就可以完成开启 go-mitmproxy、利用 Agent 做证书下载服务、连接代理、开启 Web 页面一系列操作了。而用户只需要简单操作,就能体验到完整的功能。

结语

Sonic 目前还在不断前进,希望大家多多支持,不满意或者需要改进的点欢迎提出哦,你也是贡献者之一!哦对了这版本还有很多新功能,大家也可以去玩耍

666 :+1:

:smile:感谢