AVD - Android仮想デバイス

Reading time: 14 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

このコンテンツの作成に協力してくれた @offsecjay に深く感謝します。

概要

Android Studioでは、APKをテストするために使用できるAndroidの仮想マシンを実行できます。それらを使用するには次が必要です:

Windows(私の場合)では、Android Studioをインストールした後SDK Toolsは次の場所にインストールされました: C:\Users\<UserName>\AppData\Local\Android\Sdk\tools

macでは、SDK toolsをダウンロードしてPATHに入れることができます。実行:

bash
brew tap homebrew/cask
brew install --cask android-sdk

または Android Studio GUI から(https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a に示されているように)インストールすることもでき、これにより ~/Library/Android/sdk/cmdline-tools/latest/bin/~/Library/Android/sdk/platform-tools/~/Library/Android/sdk/emulator/ にインストールされます。

Javaの問題については:

java
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home

GUI

仮想マシンを準備する

If you installed Android Studio, you can just open the main project view and access: Tools --> AVD Manager.

Then, click on Create Virtual Device

使用する電話を選択 して、Next. をクリックします。

warning

Play Store がインストールされた端末が必要な場合は、Play Store アイコンが付いたものを選んでください!

In the current view you are going to be able to select and download the Android image that the phone is going to run:

選択して、まだダウンロードされていない場合は名前の横にある Download アイコンをクリックしてください(イメージのダウンロードが完了するまで待ちます)。
イメージがダウンロードされたら、NextFinish を選択します。

仮想マシンが作成されます。以後、AVD manager にアクセスするたびに その仮想マシンが表示されます

仮想マシンを起動する

起動するには、Start button を押すだけです。

コマンドラインツール

warning

macOS では、avdmanager ツールは /Users/<username>/Library/Android/sdk/tools/bin/avdmanager に、emulator/Users/<username>/Library/Android/sdk/emulator/emulator にあります(インストールされている場合)。

まず どの端末を使うかを決める 必要があります。利用可能な端末の一覧を表示するには、次を実行してください:

C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device

d: 0 or "automotive_1024p_landscape"
Name: Automotive (1024p landscape)
OEM : Google
Tag : android-automotive-playstore
---------
id: 1 or "Galaxy Nexus"
Name: Galaxy Nexus
OEM : Google
---------
id: 2 or "desktop_large"
Name: Large Desktop
OEM : Google
Tag : android-desktop
---------
id: 3 or "desktop_medium"
Name: Medium Desktop
OEM : Google
Tag : android-desktop
---------
id: 4 or "Nexus 10"
Name: Nexus 10
OEM : Google
[...]

使用するデバイスの名前を決めたら、そのデバイスで実行する Android イメージを決める必要があります。
すべてのオプションは sdkmanager を使って一覧表示できます:

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list

そして、使用したいもの(またはすべて)を次のコマンドで download してください:

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"

使用したい Android イメージをダウンロードしたら、次のようにしてダウンロードしたすべての Android イメージを一覧表示できます:

C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
----------
id: 1 or "android-28"
Name: Android API 28
Type: Platform
API level: 28
Revision: 6
----------
id: 2 or "android-29"
Name: Android API 29
Type: Platform
API level: 29
Revision: 4

この時点で使用するデバイスを決め、Androidイメージをダウンロードしているので、仮想マシンを作成するには以下を使用できます

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"

直前のコマンドで 名前を付けたVMを作成しました "AVD9"、デバイス "Nexus 5X" と Androidイメージ "system-images;android-28;google_apis;x86_64" を使用しました。
これで、作成した仮想マシンを一覧表示できます:

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd

Name: AVD9
Device: Nexus 5X (Google)
Path: C:\Users\cpolo\.android\avd\AVD9.avd
Target: Google APIs (Google Inc.)
Based on: Android API 28 Tag/ABI: google_apis/x86_64

The following Android Virtual Devices could not be loaded:
Name: Pixel_2_API_27
Path: C:\Users\cpolo\.android\avd\Pixel_2_API_27_1.avd
Error: Google pixel_2 no longer exists as a device

仮想マシンの起動

warning

macOSでは、avdmanager ツールは /Users/<username>/Library/Android/sdk/tools/bin/avdmanager に、emulator/Users/<username>/Library/Android/sdk/emulator/emulator にあります(インストールしている場合)。

作成した仮想マシンを一覧表示する方法はすでに見ましたが、次の方法でも一覧表示できます

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9
Pixel_2_API_27

次のコマンドを使って、作成した任意のvirtual machineを簡単に起動できます:

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"

または、より高度なオプションを使用して、次のような仮想マシンを実行できます:

bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system

コマンドラインオプション

ただし、仮想マシンを起動する際に使える 多くの有用なコマンドラインオプション が存在します。以下はいくつかの興味深いオプションですが、find a complete list here

起動

  • -snapshot name : VM スナップショットを開始する
  • -snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img : 記録されたすべてのスナップショットを一覧表示する

ネットワーク

  • -dns-server 192.0.2.0, 192.0.2.255 : VM にカンマ区切りで DNS サーバを指定する
  • -http-proxy 192.168.1.12:8080 : 使用する HTTP プロキシを指定する(Burp を使ってトラフィックをキャプチャする際に非常に便利)
  • プロキシ設定が何らかの理由で動作しない場合は、内部で設定するか "Super Proxy" や "ProxyDroid" のようなアプリケーションを使って構成してみてください。
  • -netdelay 200 : ネットワーク遅延のエミュレーションをミリ秒単位で設定する
  • -port 5556 : console と adb に使用される TCP ポート番号を設定する
  • -ports 5556,5559 : console と adb に使用される TCP ポートを設定する
  • -tcpdump /path/dumpfile.cap : すべてのトラフィックをファイルにキャプチャする

システム

  • -selinux {disabled|permissive} : Linux オペレーティングシステム上で Security-Enhanced Linux セキュリティモジュールを disabled または permissive モードに設定する
  • -timezone Europe/Paris : 仮想デバイスのタイムゾーンを設定する
  • -screen {touch(default)|multi-touch|o-touch} : エミュレートされたタッチスクリーンのモードを設定する
  • -writable-system : エミュレーションセッション中にシステムイメージを writable にするオプションです。adb root; adb remount の実行も必要になります。システムに新しい証明書をインストールするのに非常に便利です。

Linux CLI セットアップ (SDK/AVD quickstart)

公式の CLI ツールを使えば、Android Studio を使わずに高速でデバッグ可能なエミュレータを簡単に作成できます。

bash
# Directory layout
mkdir -p ~/Android/cmdline-tools/latest

# Download commandline tools (Linux)
wget https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip -O /tmp/cmdline-tools.zip
unzip /tmp/cmdline-tools.zip -d ~/Android/cmdline-tools/latest
rm /tmp/cmdline-tools.zip

# Env vars (add to ~/.bashrc or ~/.zshrc)
export ANDROID_HOME=$HOME/Android
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/emulator:$PATH

# Install core SDK components
sdkmanager --install "platform-tools" "emulator"

# Install a debuggable x86_64 system image (Android 11 / API 30)
sdkmanager --install "system-images;android-30;google_apis;x86_64"

# Create an AVD and run it with a writable /system & snapshot name
avdmanager create avd -n PixelRootX86 -k "system-images;android-30;google_apis;x86_64" -d "pixel"
emulator -avd PixelRootX86 -writable-system -snapshot PixelRootX86_snap

# Verify root (debuggable images allow `adb root`)
adb root
adb shell whoami  # expect: root

メモ

  • システムイメージのフレーバー: google_apis (デバッグ可能、adb root を許可), google_apis_playstore (root化不可), aosp/default (軽量).
  • ビルドタイプ: userdebug はデバッグ対応のイメージで adb root を許可することが多い。Play Store イメージはプロダクションビルドで root をブロックする。
  • x86_64 ホストでは、API 28+ 以降でフルシステムの ARM64 エミュレーションはサポートされない。Android 11+ では、多くの ARM 専用アプリを高速に実行するために、アプリ単位の ARM→x86 翻訳を含む Google APIs/Play images を使用する。

CLI からのスナップショット

bash
# Save a clean snapshot from the running emulator
adb -s emulator-5554 emu avd snapshot save my_clean_setup

# Boot from a named snapshot (if it exists)
emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup

ARM→x86 バイナリ翻訳 (Android 11+)

Android 11+ の Google APIs と Play Store イメージは、システムの残りをネイティブな x86/x86_64 のままに保ちながら、プロセスごとに ARM アプリのバイナリを翻訳できます。これは、多くの ARM 専用アプリをデスクトップでテストするのに十分高速であることがよくあります。

ヒント: Pentests 中は Google APIs x86/x86_64 イメージを優先してください。Play イメージは便利ですが adb root をブロックします; Play services がどうしても必要で root がないことを受け入れる場合のみ使用してください。

Play Store デバイスを root する

Play Store を搭載したデバイスをダウンロードした場合、直接 root を取得することはできず、次のエラーメッセージが表示されます。

$ adb root
adbd cannot run as root in production builds

Using rootAVD with Magisk を使用して root化できました (follow for example this video or this one).

Burp 証明書のインストール

カスタム CA 証明書のインストール方法については、以下のページを確認してください:

Install Burp Certificate

便利な AVD オプション

スナップショットを取得

VM のスナップショットはいつでも GUI を使って 取得できます:

参考資料

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする