디컴파일
하드코드란 프로그램 소스 코드 내에 데이터를 직접 입력해서 저장한 경우를 뜻한다. 개발 편의를 위해 중요한 정보(관리자 계정, 암호화 키 등)가 소스 코드 내 주석 등으로 노출할 경우 안드로이드 앱은 디컴파일이 가능하여 쉽게 확인할 수 있다.
안드로이드 APK 파일 디컴파일 과정은 아래와 같다.
APK 파일 -> DEX+리소스파일+권한 -> SMALI -> CLASS -> JAVA 파일
APK 파일
APK 파일은 안드로이드 앱을 설치하는 데 사용되는 파일이다. ZIP 파일 형식으로 압축되어 있으며, 압축을 해제하면 다음과 같은 파일들을 확인할 수 있다.
- AndroidManifest.xml: 앱의 기본 정보, 권한, 리소스, 구성 요소 등을 정의하는 파일
- 리소스 파일: 앱의 UI, 레이아웃, 이미지, 애니메이션 등을 저장하는 파일
- dex파일: 앱의 코드가 저장된 파일
classes.dex 파일이 존재하는데 이 파일은 Java 코드를 컴파일하여 DVM에서 실행될 수 있도록 컴파일 한 바이트 코드이다. AndroidManifest.xml 파일은 앱을 동작시키기 위한 거의 모든 정보들이 들어가 있다. 이 파일을 노트패드에서 확인할 경우 대부분의 내용이 깨져있는데, 이는 안드로이드 자체에서 최적화를 위해 인코딩 되어 있기 때문이다.
SMALI 코드
dex 파일을 smali 파일로 디코딩하는 방법은 apktool을 사용하는 방법이 있다. 아래와 같이 apktool을 사용하면 dex파일이 smali 코드로 디코딩된다.
apktool로 디코딩하면 이름에 맞게 폴더가 하나 생기게 된다. 먼저 xml 파일을 확인해 보면 이전과는 다르게 안에 내용이 디코딩되어 있다. 안드로이드 앱을 진단할 때 이 파일을 통해 이 파일을 통해서 불필요한 권한과 개발 과정에서 생긴 액티비티 정보들을 확인할 수 있다.
그 외에도 smali 폴더에 들어가 보면 smali코드들을 확인할 수 있다. smali 코드란 안드로이드 앱의 코드를 표현하고, DVM에서 실행되는 바이트 코드를 사람이 읽고 이해하기 쉬운 형태로 변환한 코드이다.
어떠한 앱을 진단하다 보면 앱을 변조해서 보호 기법을 우회한 새로운 APK 파일이 필요하다. 이때 Java 파일로 디컴파일 해서 수정할 경우 100% 오류 없이 완벽하게 진행하는 것은 불가능하므로 smali 코드를 변조하고 다시 컴파일하는 방법을 사용하게 된다. 또한 일부 앱들은 보안 솔루션으로 보호가 되어 있어 Java 파일로 완벽하게 디컴파일 할 수 없는 경우가 있다. 이럴 경우 smali 코드를 분석해서 중요한 정보들이 노출되는지 확인하게 된다.
CLASS 파일
dex2jar 프로그램을 사용하면 APK 파일을 Class 파일로 변환할 수 있다. 아래와 같이 사용할 수 있으며, jar 파일이 하나 생성된다. 이 파일도 압축 파일이므로 압축을 해제하면 안에 클래스 파일을 확인할 수 있다.
JAVA 파일
APK 파일을 Java 파일로 디컴파일 하기 위해선 주로 jadx-gui와 Bytecode_viewer를 사용한다. 각자 장단점이 존재하므로 상황에 맞게 적절한 프로그램을 선택하여 사용하면 된다.
jadx-gui
jadx-gui는 APK 파일을 Java 파일로 디컴파일 해주는 도구이다. Bytecode_viewer 보다 속도가 빠르고 문자열 검색 기능이 편리하다는 장점이 있다. 하지만 jadx-gui로 분석할 때 부분적으로 디컴파일이 안되어 글자가 깨지는 부분이 있을 수 있다. 해당 문제는 Bytecode_viewer를 사용하여 해결할 수 있다.
Bytecode_viewer
Bytecode_viewer 역시 APK 파일을 Java 파일로 디컴파일 해주는 도구이다. jadx-gui에 비해 분석하는 시간은 더 오래 걸리지만 더 정확하고 자세히 분석해 준다. 따라서 jadx-gui에서 디컴파일이 실패하였다면 Bytecode_viewer를 사용해 볼 수 있다. 하지만 Bytecode_viewer에서도 분석이 실패하면 smali 코드를 분석해야 한다.
Bytecode_viewer의 장점으로는 분석이 더 정확하고 Java 코드와 smali 코드를 같이 보여줘서 분석에 더 편리하다. 또한 악성코드 앱을 분석할 수 있는 플러그인이 제공되어 유용하게 사용할 수 있다.