[HACKING] Android UnPacker - APK 난독화 풀기(APK Deobfuscation)

예전에 Defcon22 에서 발표된 Android Unpacker입니다.

Install Android Unpacker
Git을 통해서 쉽게 설치가 가능합니다.
# git clone https://github.com/strazzere/android-unpacker.git

strazzere가 배포하는 Android Unpacker 에는 기본적으로 Defcon22 에서 발표된 Unpacker를 포함한
Dohoser, KissKiss Unpacker 를 포함하고 있습니다.

 - AHPL0 - Android Hacker Protection Level 0 + some blackphone stuff slides
 - gdb-scripts/ - Bash script for unpacking bangcle/secshell; requires gdb/adb
 - native-unpacker/ - Unpacker for APKProtect/Bangcle/LIAPP/Qihoo Packer that runs natively, no dependency on gdb
 - hide-qemu/ - Small hacks for hiding the qemu/debuggers, specifically from APKProtect

# cd android-unpacker 
# cd native-unpacker
# make 
# make install (Enble phone)

Show Error Message
Makefile:4: *** ANDROID_NDK_ROOT is undefined - ensure Android NDK is properly configured.  멈춤.

위 에러를 해결하기 위해선 Android NDK 설치 후 ANDROID_NDK_ROOT 환경 변수를 설정해주시면 됩니다.

Android NDK 설치 관련 사항은 아래글을 참고해주세요.

[ANDROID] Android NDK 설치하기(Install Android NDK)


android-unpacker


이 android-unpacker 는 크게 3가지 기능으로 나눌 수 있습니다.

gdb-scripts/ - Bash script for unpacking bangcle/secshell; requires gdb/adb
bash script 로 구성된 secshell unpacker 입니다.

native-unpacker/ - Unpacker for APKProtect/Bangcle/LIAPP/Qihoo Packer that runs natively, no dependency on gdb
보편적으로 많이 쓰이는 APKProtect, Qihoo 등 여러 난독화 도구에 대한 Unpacker 입니다.

hide-qemu/ - Small hacks for hiding the qemu/debuggers, specifically from APKProtect
APKProtect 중 특이한 경우에 사용하는 UnPacker 입니다.

native-unpackecodeblack.netr

APKProtect, Qihoo 등 여러 난독화 도구를 풀 때 사용하는 Unpacker 입니다. 대부분 악성앱도 Qihoo나 APKProtect 를 적용하여 나타나고 있어 분석이 불편하기에, Unpacker 를 이용하여 좀 더 쉬운 형태로 분석을 진행할 수 있습니다.

일단 설치과정은 native-unpacker 로 이동하여 make 를 통해 설치해줍니다.

# cd native-unpaker
# make

이 중 NDK, NDK_ROOT 관련 에러가 나는데 이건 환경변수에 설정이 되어있지 않아 발생하는 문제입니다.
NDK 디렉토리를 에러에서 나타나는 환경변수명에 넣어주세요.

make 가 끝나면 lib 하단에 kisskiss 라는 파일이 생성됩니다. 이 파일은 ELF 헤더로 실행 파일이며 리눅스상에서는 실행할 수 업고, Android Device에 넣은 후 android shell 로 실행하여야 동작합니다.

adb shell 진입 후 파일을 넣어줍니다.
# adb connect ***.***.***.*** 
# adb pull kisskiss /system/xbin/

여기서 read-only file system으로 안넣어질 수 있는데 이부분은 remount로 해결 가능합니다.
아래 블로그 참조해주세요.
(http://aroundck.tistory.com/43)

이후 adb shell 에서 kisskiss 명령과 pid 를 적어주면 unpacking 이 시작됩니다.

# kisskiss 444

gdb-script


# ./playdead.sh com.package.name.to.unpack
# ./playnice.sh com.packeage.name.to.unpack

Unpack 과정은 간단합니다. dead, nice로 구성된 스크립트를 실행하여 Unpacking 이 가능합니다.
단 몇가지 조건이 있는데, root 권한과 APK 설치 및 구동 중에만 가능합니다.

구동되는 APK를 ps 명령을 통해 pid 를 확인한 후 해당 pid를 기입하여 Unpacking 합니다.

{Android}# ps | grep target.APK.name
..snip..
~~ 1089(target pid)

# ./playdead.sh 1089
Attempting to find memory address for 1089 inside 1089

써볼만한 좋은 샘플은 안보이네요.. :(

**Usage:**

1. Ensure you have the gdb binary pushed to /data/local/tmp/ and the baksmali/smali and frameworks set up like the scripts references (or change the script).
Also ensure you only have one device connected and accessable to adb.
The application you wish to unpack should be installed and running.
<pre>
$ ./playdead.sh com.package.name.to.unpack
</pre>

2. Reverse!

This isn't really a good script, or the best way. Though I wanted to ensure people might have a decent example of getting this type of scripting/unpacking type working.


Playnice - Secshell unpacking script
--------
Works almost identically to playdead with similar assumptions,
but scans for a DEX header instead of ODEX, and uses gdb find instead of examine.

**Usage:**

<pre>
$ ./playnice.sh com.package.name.to.unpack
</pre>


Reference

https://github.com/strazzere/android-unpacker