v1.3.2-beta 已发布啦~ 这次 Sonic 云真机的版本有个很亮眼的功能,就是在线代理网络抓包。
先上使用教学
1、打开对应 tab 页面,下面以今日头条 App 为例
2、首次使用需要安装证书,点击下载证书按钮,手机会自动跳转到下载页,下载证书后安装即可
3、点击开始代理,就可以使用啦~
4、点击对应接口可以看到详细信息
背景
过去我们手机抓包本来就是不太方便,连接 wifi、手动配置代理、信任证书、开启服务等等步骤比较麻烦。不少用户提出这个需求后决定动手做下这个事情,将 http 和 https 的抓包放到平台上,确实能解决不少用户的烦恼啊,话不多说,开干。
技术预研
- 常见的抓包工具是 fiddler、charles,桌面端的移植到 Web 端力气是比较大的。基本可以马上排除。
- js 有一个whistle,当时觉得就不错,npm 可以直接部署,并且功能强,附带 web 页面。可惜目前逐渐排除 npm 依赖,减少用户安装门槛,所以这个暂时作为保底方案。
- python 有个不错的工具叫 mitmproxy,直接 py 部署,有证书,有 web 页面,都齐全了。可惜 sonic 目前已经排除了 py 依赖,所以同上,暂时作为保底方案
- 哎?原来还有人做了 go 版的 mitmproxy,叫go-mitmproxy,使用起来不错,该有的都有了,而且 go 打包后的二进制文件可以直接运行,不需要额外依赖,行,就选你了。
改造 go-mitmproxy
接下来对 go-mitmproxy 进行了定制改造与优化,当然优化的点我也会提交 pr 给原作者,原作者也十分满意,后续也欢迎 sonic 一同建设。毕竟共同建设比自己二开成长会更快呀!
优化点:
- go-mitmproxy 默认证书生成在用户根目录.mitmproxy 文件夹下面,这个有一个不够好的地方是用户需要先找到证书才能 push 给手机安装,那么 sonic 作为平台化的东西,这个肯定是不够友好的。于是微调了代码,给原项目加上了自定义证书生成目录,这样的话 sonic 的 Agent 端也可以直接做一层文件转发。手机只需要去到 Agent 下载页即可下载。
- 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
}
- go-mitmproxy 默认的 web 页面上下滚动时,只是接口列表的表头吸顶,但是头部比较重要的筛选输入框没有做这个处理,于是乎我们的前端小伙也帮忙优化,最终做成了整个吸顶。我也对表宽度加上了自定义伸缩适配,适配较小分辨率的浏览器。
.top-control {
position: sticky;
display: flex;
align-items: center;
background-color: #fff;
top: 0;
padding: 10px;
}
最终提交 pr 如下:
当然也欢迎大家参与建设 go-mitmproxy~
定制部分:
- 主要是替换 react 默认 logo 与去除部分外链,打造更贴合 Sonic 业务的界面
- 减少 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 目前还在不断前进,希望大家多多支持,不满意或者需要改进的点欢迎提出哦,你也是贡献者之一!哦对了这版本还有很多新功能,大家也可以去玩耍