저는 평소 작업을 거의 WSL에 몰아놓고 씁니다. 프록시고 스크립트고 툴이고 전부 리눅스 쪽에 있거든요.
그런데 모바일 앱을 봐야 할 때가 문제입니다. 실기기가 없거나 루팅하기 애매할 때 보통 Nox 같은 에뮬레이터를 켜는데, WSL이랑 Nox는 동시에 안 됩니다. Nox가 아예 안 뜨거나, 떠도 기어갑니다.
매번 재부팅해가며 쓰기도 귀찮고 WSL을 포기할 수도 없어서 방법을 찾았습니다. 결론은 WSL 안에서 에뮬레이터를 직접 띄우고, 거기에 Burp 인증서까지 심어서 트래픽을 까는 것까지 됩니다. 나중에 또 까먹을 것 같아 한번 적어 봅니다.
왜 Nox랑 같이 안 되는가
CPU 안에는 가상 머신을 돌리는 스위치(AMD-V / VT-x)가 하나 있습니다. 이걸 누가 잡느냐의 싸움입니다.
- WSL2는 Hyper-V라는 관리인을 세워두고 그 관리인을 통해 스위치를 씁니다. 한 번 잡으면 독점입니다.
- Nox는 VirtualBox 기반이라 관리인을 안 거치고 자기가 직접 잡으려 합니다.
이미 관리인이 꽉 쥐고 있으니 Nox는 못 잡습니다. 그래서 소프트웨어 렌더링으로 떨어지고, 그래서 기어갑니다.
그래서 에뮬레이터를 고를 때는 관리인을 통해 쓰는(WHPX 지원) 놈으로 골라야 합니다.
| 에뮬레이터 | Hyper-V 공존 |
|---|---|
| Android Studio AVD (emulator) | 가능 (WHPX 지원) |
| BlueStacks 5 | 가능 (호환 빌드 제공) |
| Nox / LDPlayer / MEmu | 불가능 |
그리고 어차피 진단용이면 WSL 안에서 직접 띄우는 게 제일 깔끔합니다. adb도 프록시도 전부 리눅스 쪽에 있으니 인증서 밀어넣고 트래픽 까는 흐름이 한 화면에서 끝납니다.
뚝딱
시작 전에 이것부터 확인합니다. WSL 안에서 쳐봅니다.
ls -l /dev/kvm
파일이 보이면 중첩 가상화(nested virtualization)가 켜져 있는 것입니다. 관리인 밑에서 또 가상 머신을 돌릴 수 있다는 뜻이고, 이게 있어야 아래가 다 됩니다. 요즘 Windows 11이면 대체로 켜져 있습니다.
- 필요한 패키지 설치
qemu-kvm이 하드웨어 가속 담당이고, 나머지는 자바랑 소리·그래픽 라이브러리입니다. sudo apt update sudo apt install -y openjdk-17-jdk unzip qemu-kvm libpulse0 libgl1- 내 계정에 가속 쓸 권한 주기그리고 Windows PowerShell에서 한 번 껐다 켜야 그룹이 먹습니다.
wsl --shutdownsudo usermod -aG kvm $USER- 안드로이드 커맨드라인 툴 설치
mkdir -p ~/android/cmdline-tools && cd ~/android/cmdline-tools curl -O https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip unzip -q commandlinetools-linux-11076708_latest.zip && mv cmdline-tools latest- 환경 변수 등록그냥
export만 치면 터미널 끌 때 날아갑니다..bashrc에 넣어두면 터미널 켤 때마다 알아서 잡힙니다.>하나면 파일이 통째로 날아가니>>두 개인지 꼭 봅니다. cat >> ~/.bashrc << 'EOF' # Android SDK export ANDROID_HOME=$HOME/android export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/emulator:$ANDROID_HOME/platform-tools EOF source ~/.bashrc- 시스템 이미지 설치라이선스 동의 물어보면
y눌러줍니다. 여기서platform-tools안에 adb가 같이 딸려옵니다.
왜 34가 아니라 33(Android 13)인가? Android 14(API 34)부터 시스템 인증서 저장소가 APEX 모듈로 옮겨가서, 아래 나오는 "시스템 인증서 심기"가 매우 까다로워졌습니다. 진단 목적이면 API 33 이하가 압도적으로 편합니다. 굳이 14에서 봐야 할 이유가 없으면 33으로 갑니다.
sdkmanager "platform-tools" "emulator" "system-images;android-33;google_apis;x86_64"- 가상 기기 생성
avdmanager create avd -n pentest33 -k "system-images;android-33;google_apis;x86_64"- 실행 (이때 옵션이 중요합니다)
writable-system이 핵심입니다. 이걸 붙여서 켜야 나중에/system에 인증서를 심을 수 있습니다. 이 옵션 없이 켜면 뒤에서 아무리 remount 해도 다시 잠깁니다.
emulator -avd pentest33 -writable-system -gpu swiftshader_indirect
gpu옵션은 두 개만 알아두면 됩니다.
| 옵션 | 특징 |
|---|---|
swiftshader_indirect |
CPU로 그림. 느리지만 어디서든 뜸. 일단 이걸로 시작 |
host |
그래픽카드로 그림. 훨씬 부드러움. 안 뜨면 위로 되돌리기 |
adb 연결
에뮬레이터도 adb도 같은 리눅스 안에 있으니 연결 작업이 아예 없습니다.
adb devices
List of devices attached
emulator-5554 device
이렇게 나오면 끝입니다. adb install, adb logcat, adb shell 전부 바로 됩니다. 안 잡히면 서버 한 번 재시작합니다.
adb kill-server && adb start-server && adb devices
루트 권한
위에서 받은 google_apis 이미지는 루트가 열려 있어서 명령어 한 줄이면 됩니다.
adb root
restarting adbd as root가 뜨면 됐습니다. shell에 들어가서 맨 앞이 #이면 루트, $면 아직 아닙니다.
이미지 선택은 진단 관점에서 이렇게 갈립니다.
| 시스템 이미지 | 특징 |
|---|---|
google_apis |
adb root 됨. 인증서 심기 가능. 진단은 이걸로. |
google_apis_playstore |
실기기처럼 잠겨서 adb root 막힘. 인증서 못 심음 |
default |
구글 서비스 없는 순정. 루트는 됨 |
시스템 인증서 심기 (트래픽 까기)
앱 HTTPS를 Burp로 보려면, 앱이 신뢰하는 시스템 인증서 저장소에 내 Burp CA를 심어야 합니다. 사용자 저장소에만 넣으면 요즘 앱은 대부분 무시합니다.
- Burp에서 CA 인증서를 뽑습니다.
Proxy → Options → Import/Export CA certificate → Certificate in DER format으로cacert.der저장. - 안드로이드가 요구하는 형식과 이름으로 변환합니다. 파일명이 해시값.0 이어야 인식됩니다.
subject_hash_old를 쓰는 이유는 안드로이드가 옛날 OpenSSL 해시 방식을 쓰기 때문입니다. 그냥-subject_hash로 하면 이름이 안 맞아서 인식이 안 됩니다. openssl x509 -inform DER -in cacert.der -out cacert.pem HASH=$(openssl x509 -inform PEM -subject_hash_old -in cacert.pem | head -1) cp cacert.pem "$HASH.0"- 시스템 저장소에 밀어넣습니다.
adb root adb remount adb push "$HASH.0" /system/etc/security/cacerts/ adb shell chmod 644 /system/etc/security/cacerts/"$HASH.0" adb reboot
리부트 후 설정 → 보안 → 신뢰할 수 있는 자격 증명 → 시스템에 Burp가 보이면 성공입니다. 이제 Burp 프록시만 잡으면 앱 HTTPS가 열립니다.
한 가지 미리 짚어두면, 인증서 고정(SSL Pinning)이 걸린 앱은 이걸 해도 막힙니다. 그건 인증서 문제가 아니라 앱이 내 CA 자체를 거부하는 거라, objection이나 frida로 우회하는 별도 단계가 필요합니다. 이건 분량이 있어서 다음 글로 빼겠습니다.
마무리
정리하면 이렇습니다.
- 앱 진단용 → WSL 안에서 에뮬레이터 +
writable-system+ 시스템 인증서. Nox 켜자고 WSL 껐다 켤 일이 없어집니다. - Nox의 멀티 인스턴스나 특정 기능이 꼭 필요 → 이건 대체가 안 되니 Hyper-V 끈 부팅 항목을 따로 만들어야 합니다. 대신 그 부팅에선 WSL도 Docker도 안 돕니다.
저는 어차피 프록시 붙여놓고 트래픽 보는 게 주라 첫 번째로 정착했습니다. 목적 보고 알아서 고르면 될 듯 합니다.
'ETC' 카테고리의 다른 글
| 화이트햇 스쿨 1기가 2기를 위하여 (6) | 2024.01.11 |
|---|---|
| 화이트햇 스쿨 1기 합격 후기 (2) | 2024.01.11 |















