前言
HttpCanary 是一款不錯的 Android 手機端抓包軟件,相比 Packet Capture 而言視圖更加友好,更加方便復制數據,窗口模式抓包,還可以 json 格式化、實現注入攔截等操作。如果無 root 則需要安裝平行空間來抓取 SSL/TLS 加密數據包。
目前 Android 11 收緊了 APP 安裝 CA 證書的權限,只能用戶手動安裝。而 HttpCanary 已經很長一段時間沒有更新了,導致 Android 11 上面無法正常安裝證書抓包。
本文通過簡單的逆向分析,解決了證書安裝問題,實現了 Android 11 下 HttpCanary 的正常使用。
- 2020-11,純手機端 MT 管理器分析的,並不難。
過程
我們需要看看 HttpCanary 是如何判斷證書是否安裝的。
剛開始,嘗試使用 android 內證書管理的相關關鍵字代碼搜索,沒有找到。繞了一圈,最后還是從經典的 UI 入手,查看 APP 安裝證書的時候是怎么操作的。
定位到安裝證書 activicty,反編譯查看,APP 混淆了,控制流平坦化,變量名也很惡心。
但是其實這里也不是十分復雜,經過計算,追蹤,最終發現了 HttpCanary 對證書的檢查邏輯。(下圖是經過我插樁修改顯示 toast 了,顯示出了這個文件的名稱 HttpCanary.jks
,不是原 smali 的轉化)
- 原來是通過檢測某個后綴名為“.jks”的文件的存在來判定是否已安裝證書的。
但是為了准確判斷是這個起作用,我們繼續查找關鍵詞“.jks”,查看這個文件在哪里被創建的。最后追溯到了證書安裝的 Activity 了。
原來安裝證書時,HttpCanary 重寫了 onActivityResult()
,通過自動安裝返回的 resultCode
判斷了證書是否安裝,如果安裝成功便會在 cache 目錄下寫入一個無內容的 .jks。安裝失敗就無操作。而這個文件就是它判斷是否安裝了證書(有點不妥哈,但是沒了解過,不太清楚有無更好的方法)。
因此,Android 11 上不能自動安裝證書,就沒有 .jks 文件,那么應用也就無法識別安裝了證書,即使你早已手動安裝。所以需要手動建立一個。
經過多次測試,確實如此。
解決方法
通過暴力修改 app,讓它無論證書安裝成功與否都生成 .jks 也是可行的,但是不是很好。前提都是你要手動安裝了證書。
下面就手動改吧,正版盜版都適合。
1. 獲取證書
較新的版本未安裝證書是無法導出證書的,所以需要在 /data/data/com.guoshi.httpcanary/cache/ 目錄下找到 HttpCanary.pem。
沒有上述文件的話,請到設置里嘗試安裝證書生成證書。有一些盜版的包名是不一樣的,目錄也就不同。
將 HttpCanary.pem 復制到內部儲存空間上,更名為 87bc3517.0,這便是證書文件了
【別人的證書,你不一定能用,試試看就知道了】
2. 安裝證書
應該沒人會安裝為用戶證書吧?
安裝為系統證書:將證書移到 /system/etc/security/cacerts/ 目錄下設置好權限,或者自己弄一個 Magisk 模塊替換。這個 Magisk 模塊不難,就是模板壓縮包里添加一個文件而已。
3. 修改數據
在 /data/data/com.guoshi.httpcanary/cache/ 目錄下新建一個 HttpCanary.jks 無內容的文件,改好權限 600,就是改得跟旁邊的文件一樣的權限就行了。
其他改法
說到底,就是安裝證書后需要創建 .jks 文件來使得 APP 識別為已安裝證書。至於安裝為系統證書都可以自行安裝。比如通過手機設置里的安裝證書安裝為用戶證書,再在 Magisk 庫里搜索安裝 Move Certificates 模塊將用戶證書遷移為系統證書也是可以的。
最后 HttpCanary 就可以在 Android 11 上愉快地抓包了。