안드로이드 디컴파일 하는 방법에 대해 정리
디컴파일 시도하면서 시행착오를 많이 겪어 정리를 해둔다.
준비사항
1. Java SDK
- 아래의 툴들을 실행하는데 필요한 JRE 및 JDK
- 다운로드 : http://www.oracle.com/technetwork/java/javase/downloads/index.html
2. Dex2Jar( Dex -> Jar)
- 설명 : (.Dex)파일을 Class압축파일(.Jar)로 변환
- 다운로드 : http://code.google.com/p/dex2jar/downloads/list
- 최신버젼 : dex2jar-0.0.7.8-SNAPSHOT.zip
- 필요환경 : JRE(Java Runtime Enviroment) 필요
3. Jad(Java Decompiler)
- Class 파일 -> 자바소스로 디컴파일
- 다운로드 : http://www.varaneckas.com/jad
- 최신버젼 : jad158g
디컴파일 과정 설명
1. 먼저 풀고자 하는 .apk파일을 압축을 해제
2. dex2jar툴을 사용하여 classes.dex파일을 class파일로 변환한다.

아래와 같이 classes.dex.dex2jar.jar 생성된 것을 확인할 수 있다.

해당 파일을 압축을 해제하면 하위 디렉토리가 생기면서 class 파일이 생긴것을 확인할 수 있다.

해당 폴더로 이동하여
jad -d source -sjava *.class 와 같이 입력을 하자.
옵션설명
-d 는 source 디렉토리에 생성
-s 는 디컴파일 되는 소스의 확장자를 java
*.class 대상으로

디컴파일이 진행이 되면 아래와 같이 소스 확인이 가능하다.

그런데 아까 디컴파일 도중에 난 에러는 무엇을 의미하는 것일까?

ZipIntMultShortHashMap.class 파일중 Get함수에서 완전히 디컴파일하지 못했다라고 오류메시지가 나온다.
소스를 한번 보자.

위 그림처럼 _L1, _L4와 같은 레이블은 정상적인 자바 프로그래밍이면 나오지 않아야 하는데, 변환과정에서 완전하게는 디컴파일 하지 못하여 저렇게 표시는 것으로 보인다.
로직상으로는 동일할 것 같다.
그리고 .dex파일을 .jar(class파일들)로 변경해주는 다른 방법이 있는데
dexdump.exe와 undx.jar라는 파일을 이용하여 변경해주는 방법이다.
java -DASDKLoc={dexdump.exe경로} -jar undx.jar classes.dex
많은 수의 안드로이드 APK파일을 디컴파일 해본것은 아니지만,
성능은 dex2jar > undx.jar보단 낳다고 생각된다.
< 장점 >
undx.jar 변경시 오류나는 것들을 dex2jar는 문제없이 디컴파일된다.
변경속도가 빠름
사용자가 보다 해석하기 쉽게 디컴파일 됨
암튼 dex2jar 툴을 모르고 undx.jar로 디컴파일 해보다 많은 시행착오를 겪었기에 정리를 해본다.
1) 오류화면 #1 [ Dexdump.exe가 정상적으로 실행되지 않아 생기는 문제 ]

dexdump.exe파일이 있는 위치를 지정을 해주는 것인데 DASDKLOC=c:\디렉토리명 으로 해도 제대로 인식이 되질 않는다.
그래서 dexdump.exe와 mgwz.dll를 set path=%path% 경로를 추가하던지, 동일디렉토리에 놓고
java -DASDKLoc= -jar c:\android\undx.jar classes.dex와 같이 수행하면 잘 된다.

그런데 undex.jar를 이용한 디컴파일은 되는 파일이 있고 되지 않는 파일이 있다.

이거 뭐 어떻게 할수도 없고...
그래서 dex2jar 툴을 추천한다.
댓글 없음:
댓글 쓰기