本文為霍格沃茲測試學院 @yuye 同學的接口測試實踐筆記。
在接口測試中,相信很多人都遇到過 Android 高版本(Android7.0 以上)系統無法抓包的問題。
由于在測試過程中對分析定位問題很不友善,是以就想找開發的同學幫忙,結果開發也說搞不定,那隻能自己解決了。

問題分析
問題原因分析如下:
- 問題:Android6.0 及以下系統可以抓包,而 Android7.0 及以上系統不能抓包;
- 原因:Android7.0+ 的版本新增了證書驗證,是以 App 内不再像原來一樣預設信任使用者的證書;
參考網上資料得到如下解決方案:
方案一
在 Android 工程目錄的 res 底下建立一個 xml 檔案夾,然後在内部建立一個名為 “network_security_config.xml”的檔案;
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" overridePins="true" />
<certificates src="user" overridePins="true" />
</trust-anchors>
</base-config>
</network-security-config>
在 AndroidManifest 裡的标簽中,添加代碼:
android:networkSecurityConfig="@xml/network_security_config"
然後重新編譯打包即可抓包,這對開發童鞋來說,也很友善。但是,因為測試的是企業微信小程式,想讓企業微信的開發人員幫我這麼幹,簡直是白日做夢,更不用說安全等問題...
方案二
找一個低于 6.0 或者等于 6.0 版本的 Android 裝置或者模拟器,即可解決。但是考慮到:治标不治本,公司本身就沒有這樣的裝置,再加上找了幾個模拟器,都是 Android7.0 版本的,是以此方案,直接選擇放棄。
然後隻好再去找開發,開發研究了半天,結果過來告訴我,我的 iOS 是可以抓包的啊,Android 的就不知道了,一瞬間我都有點想掀桌子了......
隻好再找測試開發同學咨詢解決方案:
- 使用方案一
- 換個工具抓,例如 Fidder,或者 BurpSuite 等(這個嘗試後發現還是不行)
- 直接去 NG那裡攔截,但是我需要抓取的有一部分是第三方的接口(前方已經高能,此路不通)
最後,還是有點不死心,自己繼續搜尋各種資料,終于黃天不負有心人,找到了滿足條件的最終解決方法。
最終解決方案
Charles + VirtualXposed + JustTrustMe
實作步驟
進入 Github 下載下傳如下兩個 Page
- VirtualXposed: https://github.com/android-hacker/VirtualXposed
- JustTrustMe: https://github.com/Fuzion24/JustTrustMe
第一步
使用如下 adb 指令分别安裝兩個 pages
adb -s R3J6R19B20004228 inatall VirtualXposed
adb -s R3J6R19B20004228 install JustTrustMe
第二步
安裝完成進入 VirtualXposed apk 應用,點選 6 個小點進入設定頁面
第三步
進入設定頁面,點選子產品管理,勾選 JustTrustMe(當然我并沒有找到它,可能是我這個版本不需要在手動選擇了,安裝之後自動識别到了)重新開機之後我們重新進去設定頁面,添加我們需要抓包的應用即可,我這裡選擇的企業微信做案例。
第四步
點選添加應用,選擇需要抓包的軟體安裝:
配置 Charles 抓包
設定 Charles 代理,此處不再說明,相信設定代理大家能自己解決,手機設定 wifi 裡面代理改成手動。輸入IP,端口:預設8888,注意手機和電腦在一個 wifi 下就 ok。
第六步
回到 VirtualXposed 上滑解鎖,打開我們之前安裝的企業微信,則發現 charles 已經成功抓取到安居客的 HTTPS 的資料包:
總結
測試工作中,遇到問題/bug 經常會讓人很煩很慌,不知所措。但是,作為一個合格的測試人員,遇到事情,還是要努力做到「泰山崩于前而色不改,麋鹿興于左而目不瞬」(秀文采~),連開發都放棄了,咱還能保持淡定,方顯測試英雄本色!🆒
技術進階沒有捷徑,唯有一步步積累,踏坑填坑堅持走下去。這次的問題雖幾經波折,但我最終搞定之後,開發看我的眼神都不一樣了,以後提 bug 也更加有說服力了。😄