AVD - Android 虚拟设备

Reading time: 13 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 允许你运行 Android 虚拟机以测试 APKs。要使用它们,你需要:

在 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

Prepare Virtual Machine

如果你已安装 Android Studio,你可以打开主项目视图并访问:Tools --> AVD Manager.

Then, click on Create Virtual Device

选择 你想使用的手机 并点击 Next.

warning

如果你需要安装了 Play Store 的手机,请选择带有 Play Store 图标的设备!

在当前视图中,你可以选择并下载手机将要运行的 Android 镜像

因此,选择它;如果它尚未下载,点击名称旁的 Download 图标(现在等到镜像下载完成)。
一旦镜像下载完成,选择 NextFinish.

虚拟机将被创建。现在 每次你访问 AVD manager 时它都会存在

Run Virtual Machine

运行它,只需按下 Start button

Command Line tool

warning

对于 macOS,你可以在 /Users/<username>/Library/Android/sdk/tools/bin/avdmanager 找到 avdmanager 工具,在 /Users/<username>/Library/Android/sdk/emulator/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

然后使用下面的命令下载你想使用的一个(或全部):

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"

在上一个命令中,我创建了一个名为 "AVD9" 的 VM,使用了 设备 "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 上,如果已安装,你可以在 /Users/<username>/Library/Android/sdk/tools/bin/avdmanager 找到 avdmanager 工具,并在 /Users/<username>/Library/Android/sdk/emulator/emulator 找到 emulator

我们已经看到如何列出已创建的虚拟机,但 你也可以使用以下命令列出它们

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

你可以简单地使用以下命令运行任何已创建的虚拟机

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

命令行选项

不过有很多不同的有用命令行选项可以用来启动虚拟机。下面列出一些有趣的选项,但可以在在这里查看完整列表

Boot

  • -snapshot name : 启动 VM 快照
  • -snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img : 列出记录的所有快照

Network

  • -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 : 设置用于控制台和 adb 的 TCP 端口号。
  • -ports 5556,5559 : 设置用于控制台和 adb 的 TCP 端口。
  • -tcpdump /path/dumpfile.cap : 将所有流量捕获到文件中

System

  • -selinux {disabled|permissive} : 将 Security-Enhanced Linux 安全模块设置为 disabled 或 permissive 模式(适用于 Linux 操作系统)。
  • -timezone Europe/Paris : 为虚拟设备设置时区
  • -screen {touch(default)|multi-touch|o-touch} : 设置模拟触摸屏模式。
  • -writable-system : 使用此选项可在仿真会话期间使 system 镜像可写。你还需要运行 adb root; adb remount。这对于在系统中安装新证书非常有用。

Linux CLI setup (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-to-x86 翻译的 Google APIs/Play 镜像,以快速运行许多仅 ARM 的应用。

来自 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+)

Google APIs 和 Play Store 镜像在 Android 11+ 上可以按进程翻译 ARM 应用二进制,同时保持系统其余部分为原生 x86/x86_64。这通常足够快,可在桌面上测试许多仅支持 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

使用 rootAVDMagisk,我成功将其 root(例如参照 this video or this one)。

Install Burp Certificate

Check the following page to learn how to install a custom CA cert:

Install Burp Certificate

Nice AVD Options

Take a Snapshot

You can use the GUI to take a snapshot of the VM at any time:

References

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