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

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

先上使用教学

1、打开对应tab页面,下面以今日头条App为例
什么?Sonic 云真机还能在线代理网络抓包?_第1张图片
2、首次使用需要安装证书,点击下载证书按钮,手机会自动跳转到下载页,下载证书后安装即可
什么?Sonic 云真机还能在线代理网络抓包?_第2张图片

3、点击开始代理,就可以使用啦~
什么?Sonic 云真机还能在线代理网络抓包?_第3张图片

4、点击对应接口可以看到详细信息
什么?Sonic 云真机还能在线代理网络抓包?_第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
    }
  3. go-mitmproxy默认的web页面上下滚动时,只是接口列表的表头吸顶,但是头部比较重要的筛选输入框没有做这个处理,于是乎我们的前端小伙也帮忙优化,最终做成了整个吸顶。我也对表宽度加上了自定义伸缩适配,适配较小分辨率的浏览器。

    .top-control {
      position: sticky;
      display: flex;
      align-items: center;
      background-color: #fff;
      top: 0;
      padding: 10px;
    }

最终提交pr如下:
image.png

image.png

当然也欢迎大家参与建设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目前还在不断前进,希望大家多多支持,不满意或者需要改进的点欢迎提出哦,你也是贡献者之一!哦对了这版本还有很多新功能,大家也可以去玩耍

你可能感兴趣的:(fiddlercharles)