AVD - Android 가상 디바이스

Reading time: 9 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께 진심으로 감사드립니다.

AVD란

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.

그런 다음, _Create Virtual Device_를 클릭하세요

_select 사용하려는 휴대폰을 선택하고 Next. 를 클릭하세요

warning

Play Store가 설치된 폰이 필요하면 Play Store 아이콘이 있는 기기를 선택하세요!

현재 화면에서 폰이 실행할 Android image를 선택하고 다운로드할 수 있습니다:

해당 이미지를 선택하고, 다운로드되어 있지 않다면 이름 옆의 Download 심볼을 클릭하세요 (이미지가 다운로드될 때까지 기다리세요).
이미지가 다운로드되면, NextFinish 를 선택하세요.

가상 머신이 생성됩니다. 이제 AVD manager에 접근할 때마다 이 가상 머신이 표시됩니다.

가상 머신 실행

실행하려면 단순히 Start button 을 누르세요.

명령줄 도구

warning

For macOS you can find the avdmanager tool in /Users/<username>/Library/Android/sdk/tools/bin/avdmanager and the emulator in /Users/<username>/Library/Android/sdk/emulator/emulator if you have them installed.

먼저 어떤 폰을 사용할지 결정해야 합니다, 가능한 폰 목록을 보려면 다음을 실행하세요:

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" device "Nexus 5X"와 Android image "system-images;android-28;google_apis;x86_64"를 사용했습니다.\ 이제 생성한 virtual machines을 나열하려면:

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

다음을 사용하여 생성된 모든 가상 머신을 간단히 실행할 수 있습니다:

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

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 : 쉼표로 구분된 DNS 서버들을 VM에 지정할 수 있습니다.
  • -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} : Linux 운영체제에서 Security-Enhanced Linux 보안 모듈을 disabled 또는 permissive 모드로 설정합니다.
  • -timezone Europe/Paris : 가상 디바이스의 타임존을 설정합니다
  • -screen {touch(default)|multi-touch|o-touch} : 에뮬레이션된 터치 스크린 모드를 설정합니다.
  • -writable-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 이미지는 프로덕션 빌드로 루트 권한을 차단합니다.
  • x86_64 호스트에서는 API 28+부터 전체 시스템 ARM64 에뮬레이션이 지원되지 않습니다. Android 11+의 경우 많은 ARM 전용 앱을 빠르게 실행하기 위해 앱별 ARM-to-x86 변환을 포함하는 Google APIs/Play 이미지를 사용하세요.

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 images는 시스템의 나머지를 네이티브 x86/x86_64로 유지하면서 프로세스별로 ARM 앱 바이너리를 변환할 수 있습니다. 이는 데스크톱에서 많은 ARM-only 앱을 테스트하기에 충분히 빠른 경우가 많습니다.

팁: pentests 동안 Google APIs x86/x86_64 images를 선호하세요. Play images는 편리하지만 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 또는 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 지원하기