2012년 2월 27일 월요일

안드로이드 apk 디컴파일 (dex2jar)

출처: http://blog.naver.com/hks9999?Redirect=Log&logNo=30103399449

안드로이드 디컴파일 하는 방법에 대해 정리

디컴파일 시도하면서 시행착오를 많이 겪어 정리를 해둔다.

준비사항

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 툴을 추천한다.

댓글 없음:

댓글 쓰기