Reverse Engineering 관련 포스팅 목록
2020/07/10 - [Reverse Engineering] - Linux Apktool 설치(Apktool Install)
목차
디컴파일(Decompile)
안녕하세요. 오늘은 원래 형태를 다시 분해하는 작업인 리버스엔지니어링에 대하여 알아보겠습니다. 리버스란 "역" 즉 반대를 의미합니다. 또한 엔지니어링은 우리말로 공학을 의미합니다. 따라서 반대로 분해 조립 등의 과정을 거쳐 학습을 진행하고 습득한다는 의미입니다.
본래 컴파일이란 단어는 고급언어로 작성되어 우리가 해석할 수 있는 코드를 컴퓨터가 이해할 수 있는 언어로 변형하는 작업을 말합니다. 따라서 컴퓨터 언어를 우리가 이해하기엔 다소 버겁죠. 그렇다면 디컴파일은 이런 작업을 반대로 하는 것을 의마합니다.
이전 포스팅에서 ApkTool을 설치하는 방법에 대하여 알아봤습니다. 오늘은 이 도구를 사용하여 실제 디컴파일을 수행해 보도록 하겠습니다.
만약 ApkTool이 설치되어있지 않다면 아래 링크를 확인하여 설치후 진행해주세요.
2020/07/10 - [Reverse Engineering] - Linux Apktool 설치(Apktool Install)
중요한 것은 점점 구글에서 APK의 구조를 많이 변경하고 있습니다. AAR이라는 안드로이드 번들 형식도 출시되었으며 몇몇 APK들은 ApkTool로 디컴파
일이 안되는 현상도 발생하고 있습니다.
그에 반해 ApkTool의 최신 업데이트는 느리거나 되지않고 있기 때문에 에로사항이 발생합니다. 하지만 아직까지도 많은 APK들이 역공학이 가능한
부분이기 때문에 오늘 예제에서는 Apk 미러 사이트에서 예제 파일을 다운로드 받아 테스트 하도록 하겠습니다.
APK 미러사이트는 외국 개발자가 최신 앱들이 업데이트 될 때마다 APK를 추출하여 업로드한 사이트입니다. 이 사이트를 통해 굳이 앱을 추출하지 않아도
다운로드 받아 테스트를 할 수 있습니다.
우선 앱을 다운로드 하겠습니다.
예제 앱 다운로드
$ cd /tmp
$ mkdir apktool_decompile_example; cd apktool_decompile_example
$ wget https://github.com/markushi/android-ui/raw/master/example.apk
$ ls -al ./
위와 같이 "example.apk" 파일이 보인다면 정상적으로 다운로드 된 것입니다.
예제 목표
이번 예제의 목표는 APK 파일을 디컴파일 하는 다양한 방식을 이해하는 것입니다. 소스코드만 디컴파일하거나 리소스(이미지)와 같은 파일만 디컴파일 할 수 있습니다.
어떤 경우는 전체 디컴파일을 하였을 때 에러가 발생하지만 소스만 디컴파일 할 때는 에러가 안나는 경우도 있습니다. 따라서 때에 따라 여러 옵션을 맞게 사용하면 됩니다.
그러면 ApkTool의 디컴파일 옵션에 대하여 알아보겠습니다.
디컴파일 옵션
$ apktool -h
디컴파일옵션은 "apktool d [options] [file_apk]" 와 같은 형식으로 이루어져있습니다. 디컴파일 행위를 가리키는 "d" 옵션과 뒤쪽으로 여러가지 옵션들을 전달해주면 됩니다.
일반적인 APK 디컴파일
$ cd /tmp/apktool_decompile_example
$ apktool d example.apk
$ ls -al .
위와 같이 APK 파일명과 동일한 폴더가 생성된 것을 알 수있습니다. 그러면 실제 디컴파일된 코드는 같은 경로의 "example/smali/at/markushi/ui/ActionView smali" 파일을 텍스트 에디터로 열어보면 우리가 알아볼 수 있는 중간 언어 형태가 나타납니다.
따라서 원래의 앱의 흐름을 분석할 수 있게됩니다. 또한 "example/res" 하위 파일들을 보면 앱 개발에 사용된 이미지 파일들이 디컴파일 된 것을 알 수 있습니다.
소스코드만 디컴파일
$ cd /tmp/apktool_decompile_example
$ rm -rf ./example
$ apktool d -r example.apk
만약 리소스(이미지) 파일들은 디컴파일에서 제외하고 싶다면 위와 같이 명령어를 실행합니다. 이런 경우 samli 코드만 디컴파일 됩니다.
리소스만 디컴파일
$ cd /tmp/apktool_decompile_example
$ rm -rf ./example
$ apktool d -s example.apk
$ ls -al ./example/
만약 소스코드는 디컴파일에서 제외하고 싶다면 위와 같이 명령어를 실행합니다. 이런 경우 리소스(이미지) 파일들만 디컴파일 됩니다.
마무리
오늘은 ApkTool을 사용하여 APK 파일을 디컴파일 하는 방법에 대하여 알아보았습니다. 다음 포스팅에서는 디컴파일된 코드를 가지고 다시 컴파일 하는 방법에 대하여 알아보겠습니다.