Android 기반 App을 분석하는 기법이야 여러가지고, 그 중에서도 Unreal Engine 을 이용해 개발된 유형을 분석하는 기법도 여러가지 일 것이다. IDA 같은 고급 도구를 가지고 있다면 보다 효율적으로 분석할 수도 있겠지만, 일반 개인이나 해당 도구를 지원 받을 수 없는 기업 환경에서는 다른 대안이 필요할 수 있다.
이 글에서는 내가 Unreal Engine 기반의 Android App 을 분석하는 과정에서 습득한 방법이나 대안 등을 기술하고 업데이트 할 예정이다. 틀린 부분이 있을 수 있고, 시간의 흐름이나 상황에 따라 여러 인자들이 변동 될 수 있다는 것을 사전에 인지하자.
사용된 Unreal Engine Version 정보 확인하기
Unreal Engine 을 이용해 개발된 Android App 은 AndroidManifest.xml 이라는 파일 안에 개발에 사용된 Unreal Engine Version 정보 등을 명시하고 있다. 후에 서술하겠지만, 패키지 처리된 .pak 확장자 파일을 추출(Extract) 할 때에도 Version 정보를 알고 있어야 올바르게 추출을 시도할 수 있는 만큼 정보 수집은 모든 분석에 있어 기본이라 할 수 있고, 모든 Android App 분석의 기본은 바로 이 AndroidManifest.xml파일에서 시작된다.
APK 파일을 분석을 도와주는 도구들은 여러 사람들에 의해 다양하게 등장하고 변환해왔는데, 이 글에서는 간단하게 다음과 같은 3가지 방법에 대해 설명하고 넘어갈 예정이다.
APK Easy Tool 을 이용한 방법 - APK 의 Unpack/Repack Tool 활용법
MobSF 을 이용한 방법 - Mobile Security Framework 활용법
AXMLPrinter2를 이용한 방법 - 직접적인 AndroidManifest.xml 복호화 (Google Android4me 기록보관소 제공)
APK Easy Tool을 이용한 AndroidManifest.xml 확인 방법
APK Easy Tool 은 Android App 의 설치 패키지 파일인 APK를 GUI 기반으로 편하게 Decompile, Re-Compile 및 Sign 작업까지 진행해주는 도구이다. 업데이트 및 관리는 사실상 2022년에 중단된 도구이지만, 2025년 02월 현재 시점까지도 편리하게 사용할 수 있는 도구 중 하나 이다.
사용 방법은 java 만 설치되어 있다면 간단한데, java -jar AXMLPrinter2.jap AndroidManifest.xml > {변환할 파일명} 명령어를 이용하면 사람이 쉽게 읽어볼 수 있도록 변환이 완료된다.
AXMLPrinter2 를 이용해 AndroidManifest.xml 를 읽을 수 있는 AndroidManifest2.xml 로 변환한 모습
앞서 언급한 3가지 방법 이외에도 다양한 방법 등을 활용해 AndroidManifest.xml을 열람해 살펴보면 com.epicgames.unreal.GameActivity.EngineVersion 속성을 통해 버전 정보를 확인할 수 있는데, 이 정보를 알아야 향후 분석 과정에서 버전 정보가 필요할 때 대응이 가능해진다.
Unreal Engine 5 버전 대는 AndroidManifest에 위와 같은 Name Attribute 를 통해 확인할 수 있다.
libUnreal.so 파일 추출하기
Unreal Engine 에서 Build 옵션 중 Crypto 섹션을 이용한 암호화를 수행했을 경우 Encryption Key 는 libUnreal.so 파일에 포함되기 때문에 IDA 등 별도의 Debugger 를 이용해 추출하는 경우가 아니라면 가장 단순하게 Encryption Key 를 얻을 수 있는 방법은 libUnreal.so 파일과 Package 된 파일들을 이용하는 방법이다. 따라서 Encryption Key 를 얻기 전에 libUnreal.so 파일을 확보해야 할 필요가 있다.
가장 단순한 방법으로는 설치 APK 파일에서 .so 파일을 추출해 내는 방법이고, 설치 APK를 구할 수 없는 경우에는 Root 권한이 부여된 Device 안에서 .so 파일을 추출해내는 방법이 있다.
APK는 단일 파일 형태인 Legacy APK 일수도 있고 2018년 05월부터 등장한 App Bundle 이 적용된 복수의 APK 군집 형태 일수도 있다.
Legacy Type 인 경우 Single APK 파일로 해당 파일 안에서 libUnreal.so 파일을 추출해 낼 수 있을 것이고, App Bundle 이 적용되어 Split APKs 파일 형태를 갖는 APK 인 경우에는 base.apk 또는 config.{architecture}.apk 파일 에서 libUnreal.so 파일을 추출해 낼 수 있을 것이다.
— 현재 작성 중: 보여지지 않는 부분은 틈틈이 시간을 들여 작성 진행 중인 영역으로 아직 공개될 만큼 정리가 이루어지지 않은 부분입니다. 양해 부탁 드립니다. —
Root 권한이 부여된 Device 안에서 libUnreal.so 파일 추출하기
또 다른 방법은 Root 권한이 부여된 device 안에서 libUnreal.so 파일을 추출하는 방법이 있는데, Root 권한이 부여되었다는 전제 자체가 Rooting 이 되어 있는 환경이라는 점과, 굳이 이렇게 명령어를 사용하는 것보다는 설치된 App을 백업용 APK 파일로 만들어주는 앱 이용하는 편이 더 효율적이지만 이러한 방법이 있다는 기록 목적으로 서술하기로 한다.
우선 연결된 devices 목록을 확인하고 shell로 접속해준다.
Drive:\> adb devices
List of devices attached
emulator-5554 device
연결된 devices 확인
Drive:\> adb shell 또는 adb -s emulator-5554 shell
emulator-5554 기기의 shell 접속
su 명령어를 이용해 root 권한으로 전환한 뒤 Unreal engine 을 사용하고 있는 대상 App의 PID 값을 확인한다.
$ su
# ps -ef | grep -i 'com.*'
PID USER TIME COMMAND
...생략...
15087 10061 4h12 {main} com.companyname.appname
...생략...