v1.3.2-beta已发布啦~ 这次Sonic云真机的版本有个很亮眼的功能,就是在线代理网络抓包。
先上使用教学
1、打开对应tab页面,下面以今日头条App为例
2、首次使用需要安装证书,点击下载证书按钮,手机会自动跳转到下载页,下载证书后安装即可
背景
过去我们手机抓包本来就是不太方便,连接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; }
当然也欢迎大家参与建设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目前还在不断前进,希望大家多多支持,不满意或者需要改进的点欢迎提出哦,你也是贡献者之一!哦对了这版本还有很多新功能,大家也可以去玩耍