Windows 11 22H2, WSA(MagiskOnWSA) 사용 후기, 프록시(HTTPS 스니핑) 설정

Windows 11 22H2, WSA(MagiskOnWSA) 사용 후기, 프록시(HTTPS 스니핑) 설정

9월 20일, 드디어 Windows 11 22H2가 일반 공개되었습니다. 22H2에서 주요하게 제가 봤던 변경점은 1. 작업관리자 UI 변경 2. WSA 입니
다. CLIPCHIMP 등 뭐 변한 건 여럿 있다고 들은 것 같은데 제 관심사는 아닙니다.

작업관리자

먼저 작업관리자 UI가 어떻게 변했는지 봅시다.
Pasted image 20220922174840.png

일단 UI가 변한 건 확실히 알겠고, 22H2 이전에 Windows Terminal을 사용해본 사람은 알겠지만 Windows Terminal의 UI와 비슷해졌습니다. MS에서 앞으로 이러한 디자인을 계속 사용하려나 봅니다.

기능상 차이점은 크게 없는 것 같습니다. 오른쪽 위 ... 누르니 리소스 모니터가 바로 나오는 정도?
Pasted image 20220922174924.png

복사 버튼을 누르면 아래와 같은 출력이 나옵니다. 특이사항은 없어 보입니다. CPU, 메모리, 디스크, GPU 등 탭에서 각각 현재 보고 있 는 장치에 대한 정보만이 복사됩니다.

CPU

        Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz

        기본 속도:      2.90GHz
        소켓:   1
        코어:   8
        논리 프로세서:  16
        가상화: 사용
        L1 캐시:        512KB
        L2 캐시:        2.0MB
        L3 캐시:        16.0MB

        이용률  13%
        속도    4.39GHz
        작동 시간       0:00:52:12
        프로세스        317
        스레드  5170
        핸들    139968
메모리

        32.0GB

        속도:   2933MHz
        사용된 슬롯:    2/4
        폼 팩터:        DIMM
        하드웨어 예약:  82.1MB

        사용 가능       11.7GB
        캐시됨  11.8GB
        커밋됨  24.0/43.4GB
        페이징 풀       977MB
        비페이징 풀     795MB
        사용 중(압축)   19.9GB (598MB)
디스크 1(C:)

        Samsung SSD 970 EVO 500GB

        용량:   466GB
        포맷:   466GB
        시스템 디스크:  예
        페이지 파일:    예
        종류:   SSD

        읽기 속도       16.5KB/s
        쓰기 속도       537KB/s
        활성 시간       0%
        평균 응답 시간  0.4ms
GPU 0

        NVIDIA GeForce RTX 3080

        드라이버 버전:  31.0.15.1694
        드라이버 날짜:  2022-07-21
        DirectX 버전:   12 (FL 12.1)
        실제 위치:      PCI 버스 1, 장치 0, 기능 0

        사용률  2%
        전용 GPU 메모리 2.5/10.0GB
        공유 GPU 메모리 0.1/16.0GB
        GPU 메모리      2.6/26.0GB

WSA

정식으로 지원하는 WSA는 구글 플레이 스토어가 설치되어 있지 않으며 아마존 스토어만 설치되어 있는 것으로 알고 있습니다. 저는 구글 플레이 스토어에 더해 루팅을 하기 위해 Magisk까지 설치된 커스터마이징된 WSA을 설치했습니다. 사용한 repository는 아래와 같습니다.

https://github.com/LSPosed/MagiskOnWSALocal

MagiskOnWSALocal 설치법

WSL2 내부에서 빌드했습니다. 짐작하기로 윈도우에서 빌드가 될 것 같진 않습니다.

  1. repository 복사 git clone https://github.com/LSPosed/MagiskOnWSALocal
  2. 필요한 라이브러리 설치 sudo apt install setools lzip wine patchelf e2fsprogs aria2 python3
  3. ./scripts/run.sh 실행
    주의: build.sh가 아닙니다! 저도 '보통 build 후 run 하지 않나?'하는 생각에 무심코 build.sh를 먼저 실행했었는데, run.sh에서 여러 설정을 입력받은 후 그것을 토대로 build.sh를 실행해주는 구조입니다.
    run.sh를 실행하면 x64/arm64 선택 등 여러가지 옵션을 제공하는데 잘 모르겠으면 default 값이 설정되도록 엔터만 계속 눌러도 됩니다.
  4. output/WSA-with-magisk-stable-MindTheGapps_2207.40000.8.0_x64_Release-Nightly을 윈도우에서 접근 가능한 곳에 옮기고 Run.bat을 실행합니다.
    폴더 명은 입력한 버전, repository 업데이트 등에 의해 달라질 수 있습니다.
  5. 이제 끝났습니다. Google 플레이스토어에 로그인해서 원하는 앱을 다운받아 사용하면 됩니다.

WSA 설정

일단 저는 개발자로서 WSA를 루팅된 안드로이드로 adb를 연결해서 사용할 것이기 때문에 Developer mode를 켜줬습니다. 윈도우에서 작업표시줄에 android 정도를 검색하면 세팅이 뜨는데, 여기 들어가서 설정해주면 됩니다.
Pasted image 20220922180625.png

Pasted image 20220922180632.png

(근데 다른 글자는 다 영어인데 왜 "끔"만 한글..?)

이걸 키면 어디로 연결해줄지 아이피:포트를 알려줍니다. 아래 사진에 나온 아이피:포트 따라서,adb connect 127.0.0.1:58526으로 연결해줍시다.
Pasted image 20220922180710.png

사용할 GPU도 바꿀 수 있나 봅니다. 매우 신기합니다.
그나저나 다른 앱플레이어처럼 할당할 CPU나 RAM을 변경할 수는 없는지 궁금합니다. (RAM은 개발자 옵션 들어가서 확인하면 6.3GB로 나 옵니다. 기본 6GB로 설정되는 것 같습니다.) 뭐 어딘가 설정하는 법이 있겠죠?
Pasted image 20220922174613.png

그리고 WSA를 D 드라이브로 옮기려고 보니.. 일단, 윈도우 설정>앱>WSA 클릭>'이동' 을 누르면 이미 WSA가 D 드라이브에 있다고 나옵니다.
Pasted image 20220922190417.png

그런데, %LocalAppData%\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache를 가면 분명히 설치된 WSA(,의 vhdx 파일)이 보이고, 경로는 C:\로 시작합니다. 하지만 WSA 내부에서 용량이 큰 앱을 다운받아보니 D 드라이브의 용량이 변하는 걸 확인할 수 있었습니다. LocalCache가 D 드라이브로 연결되는 것 같은데(symlink 비슷하게) 왜 explorer에서는 C:\ 경로로 나오는지..
Pasted image 20220922190316.png
Pasted image 20220922185759.png

실제 경로는 D:\WpSystem\S-1-5-21-1663506684-584117442-4044271244-1001\AppData\Local\Packages\MicrosoftCorporationII.WindowsSubsystemForAndroid_8wekyb3d8bbwe\LocalCache으로 보입니다. Everything을 통해 vhdx 파일을 검색하고서야 찾아낼 수 있었습니다. 아마 윈도우 익스플로러에서 유저에게 보여줄 때 링크 처리를 제대로 안해주나봐요..

Android '설정' 여는 법

에뮬레이터를 데스크탑에서 돌리는 것과 다른 UI를 사용하는데, 안드로이드의 '설정'을 어떻게 여는건지가 오리무중입니다. 할 수 없이 adb shell am start -n com.android.settings/.Settings로 설정을 열어줍시다.

Pasted image 20220922201651.png
딱 여기서 Files 아래에 Settings 달아주면 좋을 것 같은데, 흠..

리부트: adb shell reboot

WSA 사용 후기

설정을 adb 없이 기본 UI에서 열지 못하는 것도 그렇고 아쉬운 점이 몇 있지만, 그래도 안드로이드 앱을 데스크탑에서 빠르게 구동할 수 있다는 건 확실히 편리한 것 같습니다. 사설 앱 플레이어도 필요 없이요.

다만 기본적으로 Android 12가 설치되는데 제가 데스크탑에서 구동하려고 했던 게임이 Android 12는 호환이 제대로 되질 않아서... (일 해라 개발사..) 제대로 써보질 못해 아쉬움이 큽니다. 사실 WSA를 깔고도 스니핑하는 것 외에는 제대로 써보질 못했는데 언젠가 게임을 하든 하면 후기가 업데이트 될지도 모르겠습니다.


아래부터는 WSA에서 https 패킷을 스니핑하기 위해 설정하는 과정을 서술합니다. 필요 없으신 분은 그냥 넘어가시면 됩니다.

Fiddler 설정하는 법

Android 7.0부터 ssl pinning이 적용되어 기본적으로는 사용자 커스터마이징된 인증서로는 HTTPS 인증이 되지 않습니다. (인증서를 따로 설치했을 때, 웹 브라우저만 스니핑이 가능함) 브라우저 외의 앱을 스니핑하기 위해서는, 스니핑하려고 하는 앱을 리패키징하거나 frida를 이용하는 방법이 널리 알려져 있습니다. 제 경우 HTTPS 패킷을 잡을 수 있도록 frida-server을 사용할 생각입니다.

먼저 pip install objection frida-tools frida으로 환경 설정을 해줍니다.

  1. 프록시 설정을 해줍니다. adb shell settings put global http_proxy 192.168.219.100:8888

삭제는

adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port

adb를 이용해 세팅을 변경하는 것 대신, objection REPL에서 android proxy set 192.168.219.100 8888을 실행하는 방법도 있습니다. 이 방법은 하나의 앱에 대해 1회 프록시를 변경하기에 경우에 따라 더 편리할 수 있습니다.

  1. 구글 플레이스토어에서 WSA에 Brave Browser을 설치합니다. 다른 브라우저 아무거나 사용해도 무방합니다.
  2. WSA의 Brave Browser에서 Fiddler 아이피:포트로 접속하여 You can download the FiddlerRoot certificate 의 뒷부분을 클릭해 Fiddler의 CA 인증서를 다운로드합니다.
    Pasted image 20220922201828.png
  3. adb shell am start -n com.android.settings/.Settings로 설정을 열고, 보안>암호화 및 사용자 인증 정보>인증서 설치>CA 인증서 선택하여 방금 다운로드한 Fiddler의 CA 인증서(FiddlerRoot.cer.crt)을 설치합니다.
  4. WSA의 Brave Browser에서 https 연결되는 사이트 아무거나 접속해 Fiddler에 잡히는지 확인합니다.

참고로 인증서는 '내 파일' 등에서 설치할 수 없습니다. 설정에서 보안 관련 메뉴를 들어가야 설치 가능합니다. 아래 스크린샷처럼 '내 파일' 들어가서 클릭해도 설치 안 됩니다.
Pasted image 20220922202039.png

Android 7.0부터는 브라우저 외의 앱이 사설 SSL 인증서를 사용하지 않습니다. (SSL Pinning) 따라서 브라우저 이외의 앱에서 Fiddler을 통해 패킷 스니핑을 하기 위해서는 사설 인증서 설치뿐만 아니라 사설 인증서를 사용하도록 유도까지 해줘야 합니다. 이러한 android SSL pinning bypass는 frida를 이용해 하는 방법이 잘 알려져 있습니다.

  1. frida-server 다운로드 https://github.com/frida/frida/releases
  2. unzip, frida-server로 이름 변경
  3. 다운로드받은 frida-server 전송adb push .\frida-server /data/local/tmp
  4. mv /storage/emulated/0/Download/FiddlerRoot.cer.crt /data/local/tmp/cert-der.crt
  5. WSA에서 frida-server 실행
adb shell
# WSA shell 진입
su
cd /data/local/tmp
chmod 755 frida-server
chmod 777 cert-der.crt
# 필요하다면 chown root.root frida-server 로 소유자, 소유 그 변경
./frida-server & ps | grep frida
# 1회 설정한 이후에는, su 를 입력한 후, /data/local/tmp/frida-server & ps | grep frida 를 입력해 실행 가능합니다.

./frida-server 다음의 &는 frida-server을 백그라운드에서 돌리기 위해 필요합니다.

  1. frida-ps -U로 스니핑할 앱의 pid 확인
  2. 이제 SSL Pinnning을 무력화합니다. 원래는 frida를 이용해 아래 스크립트를 실행해 무력화하려고 했었습니다.
    frida -U --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida --no-pause -p (앱의 pid)
    근데 왜인지 실행이 안되서 그냥 objection 이라는 라이브러리를 사용했습니다.
objection --gadget "(앱의 패키지 명)" explore
android sslpinning disable

Pasted image 20220926233924.png
위와 같은 메시지가 출력되고, Fiddler에 HTTPS 패킷이 잡힌다면 성공입니다.

Reference

Frida를 소개합니다! 멀티 플랫폼 후킹을 위한 가장 강력한 도구 😎 (hahwul.com)
비루팅/비탈옥 단말에서 프리다 사용하기 (Frida Inject DL for no-jail, no-root)
💉 Frida's Gadget Injection on Android: No Root, 2 Methods (fadeevab.com)