본문 바로가기

해킹/IOS 앱 취약점 진단

안드로이드 앱 디컴파일 그리고 빌드하기

안녕하세요 오늘은 안드로이드 앱을 디컴파일하고 수정 후 다시 빌드 하는 과정을 소개해드리려고 합니다.

먼저 앱(APK)파일을 소스코드로 돌리려면 Java와 Apktool 이라는 프로그램이 필요합니다.

 

https://www.oracle.com/java/technologies/javase-downloads.html

위의 사이트에서 JDK를 다운로드할 수 있습니다. 

그리고 java --version 명령어를 사용하여 설치된 것을 확인할 수 있습니다. 

만약 명령어를 찾을 수 없다는 메시지가 나온다면 JDK가 설치된 경로를 시스템 경로에 등록해주어야 합니다. 

unknownui-MacBook-Pro:apktools unknown1$ java --version
java 14.0.1 2020-04-14
Java(TM) SE Runtime Environment (build 14.0.1+7)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
unknownui-MacBook-Pro:apktools unknown1$ 

 

https://ibotpeaches.github.io/Apktool/install/

 

Apktool - How to Install

Install Instructions Quick Check Is at least Java 1.8 installed? Does executing java -version on command line / command prompt return 1.8 or greater? If not, please install Java 8+ and make it the default. (Java 7 will also work at this time) Windows: Down

ibotpeaches.github.io

Apktool은 위의 사이트에서 다운로드할 수 있습니다. 각 운영체제에 맞게 다운로드하시면 됩니다.

unknownui-MacBook-Pro:apktools unknown1$ ls
apktool.jar		base.apk		jd-gui-osx-1.6.6
apktool.sh		dex2jar-2.0		pom_new.xml

 

다운로드가 되었다면 경로에 apktool.sh(리눅스, 맥) 또는 apktool.bat(윈도우)가 있을 겁니다. 

이 파일을 실행시키면 되는데요 base.apk 앱을 디컴파일 할 경우는 아래와 같이 할 수 있습니다. 

unknownui-MacBook-Pro:apktools unknown1$ ./apktool.sh d ./base.apk 
I: Using Apktool 2.4.1 on base.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/unknown1/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Baksmaling classes2.dex...
I: Baksmaling classes3.dex...
I: Baksmaling classes4.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
I: Copying META-INF/services directory

 

또는 dex2jar를 사용하여 압축을 풀고 jd-gui로 볼 수도 있습니다. 

https://github.com/pxb1988/dex2jar

 

pxb1988/dex2jar

Tools to work with android .dex and java .class files - pxb1988/dex2jar

github.com

unknownui-MacBook-Pro:apktools unknown1$ dex2jar base.apk
dex2jar base.apk -> ./base-dex2jar.jar
Detail Error Information in File ./base-error.zip
Please report this file to http://code.google.com/p/dex2jar/issues/entry if possible.

 

 

그러면 경로에 앱의 이름과 동일한 디렉토리가 생기며 디컴파일된 파일들이 저장되어 있습니다.

디컴파일된 파일이 포함된 디렉토리(decompiled)를 다시 빌드하고 싶다면 아래와 같이할 수 있습니다. 

unknownui-MacBook-Pro:apktools unknown1$ ./apktool.sh b ./decompiled/ -o app.apk
I: Using Apktool 2.4.1
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether sources has changed...
I: Smaling smali_classes3 folder into classes3.dex...
I: Checking whether sources has changed...
I: Smaling smali_classes4 folder into classes4.dex...
I: Checking whether sources has changed...
I: Smaling smali_classes2 folder into classes2.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Copying libs... (/kotlin)
I: Copying libs... (/META-INF/services)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

 

위의 명령어가 끝나면 해당 경로에 app.apk가 생길겁니다. 그러나 여기서 한가지 더 해주어야 하는데요

바로 앱에 서명을 해주어야 핸드폰에 설치를 할 수 있게 됩니다. 

 

현재 몇몇 오픈소스를 이용하여 테스트해보았지만 검증 오류가 나네요. 

zipalign과 apksigner를 이용하여 서명하라고 하는데요. 두개의 사용법을 설명하려면 길어져 여기까지 작성합니다. 

 

아래 사이트를 참고하시면 될 것 같습니다.

https://developer.android.com/studio/publish/app-signing.html#signing-manually

 

앱 서명  |  Android 개발자  |  Android Developers

앱 서명 및 보안과 관련된 중요한 개념을 알아보고, Android 스튜디오를 사용하여 Google Play에 출시하기 위해 앱에 서명하는 방법과 Google Play 앱 서명을 선택하는 방법을 알아보세요.

developer.android.com

 

https://docs.microsoft.com/ko-kr/xamarin/android/deploy-test/signing/manually-signing-the-apk

 

수동으로 APK 서명 - Xamarin

수동으로 APK 서명Manually Signing the APK 이 문서의 내용 --> 애플리케이션이 릴리스용으로 빌드된 후 배포 전에 APK에 서명해야 Android 디바이스에서 실행할 수 있습니다.After the application has been built for

docs.microsoft.com