博客 / 詳情

返回

什麼?Sonic 雲真機還能在線代理網絡抓包?

v1.3.2-beta已發佈啦~ 這次Sonic雲真機的版本有個很亮眼的功能,就是在線代理網絡抓包。

先上使用教學

1、打開對應tab頁面,下面以今日頭條App為例
image.png
2、首次使用需要安裝證書,點擊下載證書按鈕,手機會自動跳轉到下載頁,下載證書後安裝即可
image.png

3、點擊開始代理,就可以使用啦~
image.png

4、點擊對應接口可以看到詳細信息
image.png

背景

過去我們手機抓包本來就是不太方便,連接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目前還在不斷前進,希望大家多多支持,不滿意或者需要改進的點歡迎提出哦,你也是貢獻者之一!哦對了這版本還有很多新功能,大家也可以去玩耍

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.