天天看點

想用Charles抓包,某些app不讓抓怎麼辦

基本操作

熟悉抓包的同學一定都知道Charles,功能強大、跨平台,而且還能實作很多基于配置的抓取政策,非常好用。如果你想抓取https協定的調用,必須在用戶端(手機端或者其它pc端,總之就是真正通路接口的裝置)上進行一些操作。基本步驟是:

  1. 配置用戶端網絡連接配接的http代理,具體代理位址以及端口取決于運作Charles的機器配置;
  2. 用戶端安裝Charles的CA憑證(不同Charles主機的CA憑證不一樣);
  3. Charles主機端同意用戶端使用該代理;
  4. 啟動用戶端開始抓包。

經過上述步驟,目前絕大多數應用就可以實作SSL抓包了。

有些例外

但是有些app在運作時,一旦設定了Charles代理,一些接口就無法通路,主要是在SSL握手時停留在了域名握手後,連接配接建立,但無法正常通信。

以Android系統為例,我們都知道,作業系統内将證書分為兩個存儲區:系統和使用者.。在7.0之後,系統安全性有很大的提升,其中一項就是針對app開發者提供了網絡安全配置選項(networkSecurityConfig),根據此選項指向的特定資源,可以選擇隻信任系統證書(當然也可以選擇連系統的都不信任,隻信任自己的。但證書是有失效期的,使用自己的證書代價就是一定要在失效前打包新的證書并確定全量更新,否則未更新使用者就一樣無法使用了。是以這種用法不是很常見)。

上述基本操作中,Charles的證書是安裝在“使用者”這個存儲區的。是以遇到特殊配置了networkSecurityConfig的app就無法成功抓包。

知道了原理,有沒有辦法把自己的Charles證書僞裝成系統級别的呢?答案是:有。不過,前提需要Root權限。

Charles證書安裝

上面提到了,先決條件是已擷取Root權限。因為品牌和方法衆多,這裡不再贅述,直接說如何安裝證書。

儲存證書并重命名

在Charles的菜單中找到Help -> SSL Proxying -> Save Charles Root Certificate…

儲存到本地時選擇存儲格式為pem,這種格式是Android直接可以使用的。

雖然pem格式的證書可以在Android中直接使用,但Android系統對證書的檔案名有嚴格的規範——利用檔案名校驗檔案哈希(hash),利用字尾判斷級别。Android系統級别的證書字尾名是“0”。

[hash].[level]      

是以想要該證書被正确載入,需要将得到該證書的哈希值。這裡用到了openssl指令。

openssl x509 -inform PEM -subject_hash_old -in ***.pem | head -1      

如果你使用的是Windows系統,沒有head指令也無妨,去掉pem後面的指令,直接檢視輸出的第一行,即該證書的哈希值。

将證書重命名:

mv ***.pem [hash].0      

例如

mv charles.pem 5c9c9fa4.0      

傳輸Charles證書至Android裝置

由于參考文獻中的指令未能成功執行,本人也并非專業Android開發,是以我使用了替代方案。

這裡需要一個adb工具。用來調試Android應用的工具,在很多地方都可以下載下傳到,這裡不再贅述。

首先将證書拷貝至/sdcard目錄,該目錄不需要root權限。

adb push [hash].0 /sdcard      

這裡就是把上一步生成的證書推送到Android裝置的/sdcard目錄,但此時檔案的使用者和使用者組還不正确,需要後面修正。

然後使用root權限移動證書到正确的目錄,并且修改成正确的通路權限

adb shell
OnePlus5T:/ $ su
OnePlus5T:/ # mv /sdcard/[hash].0 /system/etc/security/cacerts
OnePlus5T:/ # cd /system/etc/security/cacerts
OnePlus5T:/system/etc/security/cacerts # chown root:root [hash].0
OnePlus5T:/system/etc/security/cacerts # chmod 644 [hash].0      

上述代碼完成了如下内容:

  1. 進入adb腳本的互動模式
  2. 切換至root使用者
  3. 将之前儲存至/sdcard的證書檔案移動到系統證書存儲位置
  4. 切換工作目錄至系統證書存儲位置
  5. 修正證書檔案所有者
  6. 修正證書檔案通路權限

繼續閱讀