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