리패키징 방지 솔루션은 APK 파일 안에 존재하는 Dex 파일에 문자열 암호화, 소스코드 난독화, 디컴파일 방지 등 여러 가지 기능들을 추가하여 APK 파일의 분석을 방해하는 목적으로 개발된 솔루션이다.

여러 가지 방지 기능을 제거하지 않고, APK 파일을 디컴파일을 시도하게 되면 에러 메시지가 나타나게 되면서 디컴파일이 되지 않은 상황이 발생한다.

오픈소스 리패키징 방지 솔루션으로 APK Protect가 존재한다. 해당 솔루션은 APK 파일 내의 임의의 파일을 삽입하여 dex2jar 도구로 자바 바이트 코드로 변환 시 에러를 유발하게 만들어 변환이 되지 못하도록 방해한다.


최종적으로 자바 바이트 코드를 변환하지 못해 자바 소스코드를 확인할 수 없다. 하지만, 단순히 임의의 파일만 삽입한 상태이므로 쉽게 우회가 가능하여 디컴파일이 가능하다.


APK Protect 프로그램을 실행해서 BROWSE 탭에 리패키징 방지를 적용할 APK 파일의 경로를 지정한다. APK 파일을 선택하면 하단의 APK 파일의 이름이 apkcrypt로 변경된다.


ADD APK PROTECT 버튼을 클릭하면 리패키징 방지 코드를 삽입하는 과정이 진행되고, 몇 초 뒤에 apk crypt success 메시지 창이 나타나면 지정한 경로에 새로운 APK 파일이 생성된다.


원본 파일 : insecurebank.apk

변환 파일 (리패키징 방지) : insecurebank_apkcrypt.apk



dex2jar 도구로 변환된 APK 파일을 인자로 지정하여 디컴파일을 시도하면 에러가 발생한다.


dex2jar 도구는 APK 파일에 존재하는 dex 파일을 얻어 smali 파일로 변환하고, 변환된 smali 파일을 자바 바이트 코드로 변환하는 과정에서 임의의 파일이 smali 파일에 삽입되었으므로 에러가 발생한다.


명령어를 실행한 경로로 이동하면 jar 파일이 생성되었지만 파일의 크기가 1KB 이므로 jd-gui 도구로 jar 파일을 로드해도 자바 코드가 보이지 않는다.


D:\tmp_download\APKProtect>dex2jar insecurebank_apkcrypt.apk
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar insecurebank_apkcrypt.apk -> insecurebank_apkcrypt_dex2jar.jar

/* 에러 발생 */
com.googlecode.dex2jar.DexException: while accept method:[Landroid/a;.a()Ljava/lang/String;]
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:694)
at com.googlecode.dex2jar.reader.DexFileReader.acceptClass(DexFileReader.java:441)
at com.googlecode.dex2jar.reader.DexFileReader.accept(DexFileReader.java:323)
at com.googlecode.dex2jar.v3.Dex2jar.doTranslate(Dex2jar.java:85)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:261)
at com.googlecode.dex2jar.v3.Dex2jar.to(Dex2jar.java:252)
at com.googlecode.dex2jar.v3.Main.doData(Main.java:43)
at com.googlecode.dex2jar.v3.Main.doData(Main.java:35)
at com.googlecode.dex2jar.v3.Main.doFile(Main.java:63)
at com.googlecode.dex2jar.v3.Main.main(Main.java:86)
Caused by: com.googlecode.dex2jar.DexException: while accept code in method:[Landroid/a;.a()Ljava/lang/String;]
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:684)
... 9 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 162
at com.googlecode.dex2jar.v3.V3CodeAdapter.visitConstStmt(V3CodeAdapter.java:328)
at com.googlecode.dex2jar.reader.DexOpcodeAdapter.x1h(DexOpcodeAdapter.java:222)
at com.googlecode.dex2jar.reader.DexCodeReader.acceptInsn(DexCodeReader.java:440)
at com.googlecode.dex2jar.reader.DexCodeReader.accept(DexCodeReader.java:337)
at com.googlecode.dex2jar.reader.DexFileReader.acceptMethod(DexFileReader.java:682)
... 9 more
Done.



apktool 도구로 변환된 APK 파일을 디컴파일을 하고, 텍스트/파일 검색 프로그램을 이용해 a.smali 파일을 검색한다.


보통 APK 파일을 디컴파일을 하면 a.smali 파일이 없는데, APK Protect가 적용된 APK 파일을 디컴파일을 하면 a.smali 파일이 생성된다. 수많은 a.smali 파일이 존재하므로 디컴파일이 실패한 것이므로 해당 파일들을 삭제한다.


D:\tmp_download\APKProtect>apktool d insecurebank_apkcrypt.apk
I: Using Apktool 2.4.0 on insecurebank_apkcrypt.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...

Error occurred while disassembling class Landroid.support.a; - skipping class
Error occurred while disassembling class Landroid.a; - skipping class
Error occurred while disassembling class Landroid.support.v4.a; - skipping class

Error while processing method Lcom/google/android/gms/wearable/internal/a;->a()Ljava/lang/String;

... ...

I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...



a.smali 파일을 삭제했으면 apktool 도구로 리패키징을 한다. 리패키징이 완료되면 dist 디렉토리에 리패키징을 한 APK 파일이 존재하는데, dex2jar 도구로 APK 파일을 디컴파일을 시도하면 에러 없이 정상적으로 자바 바이트 코드가 생성된다.


D:\tmp_download\APKProtect>apktool b insecurebank_apkcrypt
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Building resources...
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...

D:\tmp_download\APKProtect>cd insecurebank_apkcrypt\dist

D:\tmp_download\APKProtect\insecurebank_apkcrypt\dist>dex2jar insecurebank_apkcrypt.apk
this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.15
dex2jar insecurebank_apkcrypt.apk -> insecurebank_apkcrypt_dex2jar.jar
Done.


jd-gui 도구를 실행하여 jar 파일을 로드하면 정상적으로 자바 코드를 확인할 수 있다.



▶ 안드로이드 난독화 (코드 보호 기법)

▶ 안드로이드 디컴파일 방법 및 jadx 사용법

  • 카카오톡-공유
  • 네이버-블로그-공유
  • 네이버-밴드-공유
  • 페이스북-공유
  • 트위터-공유
  • 카카오스토리-공유