最近、apk のテスト中に、通常の手法である Burp 証明書のエクスポート、証明書のインストール、Wi-Fi のプロキシ設定を使用しても、https のトラフィックをキャプチャできないことがわかりました(proxifier を使用して Android エミュレータを Burp プロキシ経由で動作させることもできますが、それは避けたいです)。検索エンジンで調べた結果、Android 7.0 以降では、システムはデフォルトでシステム証明書のみを信頼し、ユーザーがインストールした証明書を信頼しなくなったことがわかりました。そのため、さまざまなエミュレータを使用して apk の https パケットをキャプチャする試みが何度か失敗した後、結局 Android Studio を選択しました。証明書をシステム証明書にインストールします。
Burp 証明書の準備#
- Burp 証明書のエクスポート
- openssl を使用して証明書の形式を変更し、まず Burp 証明書の der 形式を pem 形式に変換し、次に証明書のハッシュを取得します。
openssl x509 -inform DER -in burp.der -out burp.pem
openssl x509 -inform PEM -subject_hash_old -in burp.pem
ファイル名を取得したハッシュに変更します。
mv burp.pem 9a5ba575.0
エミュレータの準備#
- Android Studio を開き、新しいエミュレータを作成します。詳細は図を参照してください。
システムイメージは必要に応じて選択できます。
エミュレータの名前を入力し、エミュレータのストレージサイズを設定し、複数のポイントを与えてインストールスペースが不足しないようにします。
- emulator コマンドを使用してエミュレータを起動します。コマンドのデフォルトの場所は / Users/{{ユーザー名}}/Library/Android/sdk/emulator で、-no-snapshot-load パラメータを追加してエミュレータの状態を保存します。そうしないと、エミュレータを再起動するたびに adb root、remount コマンドを再実行して証明書の権限を変更する必要があります。
すべてのエミュレータを表示する emulator -list-avds
エミュレータを起動する emulator @Resizable_API_33 -writable-system -no-snapshot-load
証明書のアップロード#
- adb コマンドを使用してパーティションを再マウントし、system を読み書き可能にします。
adb root root権限に入る
adb disable-verity パーティションチェック機能を無効にする
adb reboot デバイスを再起動する
adb remount パーティションを再マウントし、systemパーティションを読み書き可能にする
- 証明書のアップロード
adb push 9a5ba575.0 /sdcard 証明書を/sdcardディレクトリにアップロードする
adb shell システムに入り、whoamiコマンドを使用してrootユーザーかどうかを確認できます
cp /sdcard/9a5ba575.0 /system/etc/security/cacerts/ システムに入った後、証明書をシステムの証明書ディレクトリにコピーする
chmod 644 /system/etc/security/cacerts/9a5ba575.0 証明書の権限を変更する
- 証明書のインストールが成功したかどうかを確認する
エミュレータの画面で操作し、設定(setting)に移動し、セキュリティ(security)を選択し、その他のセキュリティ設定(more security settings)を選択し、暗号化と資格情報(encryption & credentials)を選択し、信頼された資格情報(trusted credentials)を選択します。
Wi-Fi プロキシの設定#
キャプチャ成功
参考記事#
https://www.freebuf.com/articles/system/347725.html
https://developer.android.com/studio/run/emulator-commandline?hl=zh-cn#startup-options
https://developer.android.com/studio/command-line/adb?hl=zh-cn
https://juejin.cn/post/6844903645289398280
https://android.stackexchange.com/questions/232234/why-adb-remount-retruns-remount-failed-on-android-emulator