본문 바로가기

Linux/Android

Android APK,ODEX Reverse Engineering(DE-ODEX)

출처 : http://leehacks.blogspot.com/search/label/Android

Android apk file을 reverse해서 Resource나 Src를 수정하는 방법이 있다.
http://code.google.com/p/android-apktool/ 에 open source project가 진행중이며, apk를 풀고 다시 빌드하는 것이 가능하다.

1. 해당 사이트에서 apktool을 다운로드하고 기재된 install방법으로 설치한다.
2. apk 디코딩
>apktool d -d name.apk out
3. out 폴더에 있는 source file(dalvik bytecode)과 resource file을 수정한다.
4. apk 빌드
>apktool b -d out
5. 위까지 수행하게 되면 out/dist/out.apk 가 생성되며 이 out.apk를 sign해주면 완료.

Sign방법은 http://developer.android.com/guide/publishing/app-signing.html 를 참고하면 된다.

참고:
1. leehack이 사용한 Sign관련 command.
C:\Sun\SDK\jdk\bin\jarsigner -verbose -keystore E:\Works\Android\Android_2.1_Library\debug.keystore out.apk androiddebugkey
password: android

2. Dalvik Byte 코드에 관련된 문서.
Dalvik opcode list: http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html
Dalvik bytecode?: http://pallergabor.uw.hu/common/understandingdalvikbytecode.pdf





우선 ODEX라는 것이 무엇일까?
http://mylifewithandroid.blogspot.com/2009/02/optimized-dex-files.html
위 블로그에 보면 아주 내용이 잘 정리 되어있다. Optimized dex 로써 성능향상을 위해 Hardware에 최적화되어 만들어진 dex file이다. HTC의 단말기들에 있는 app들을 까보면 apk파일과 odex 파일 두개로 이루어져있다.
(그리고 apk file을 압축을 풀어 확인해보면 classes.dex 파일이 존재 하지 않는다.)

ODEX를 classes.dex로 바꿔보자!
1. http://code.google.com/p/smali/downloads/list 사이트에서 smali.jar와 baksmali.jar를 다운로드한다.
1. Android Phone을 Android SDK가 깔려있는 PC에 연결
2. adb pull system system
3. java -jar baksmali.jar -d system/framework -x temp.odex(odex파일 경로)
(참조: http://code.google.com/p/smali/wiki/DeodexInstructions)
이렇게 하면 out이라는 폴더 안에 smali format으로 odex가 풀려있게 된다.
4. java -jar smali.jar -o classes.dex out
이렇게 해서 우리가 원하는 classes.dex 파일이 생성되었다.

APK파일로...
classes.dex가 없는 apk 파일에 추가하여 다시 압축 한 후 http://leehacks.blogspot.com/2010/05/android-apk-reverse-engineering.html 포스팅에서 언급한 apktool로 다시한번 풀어줬다가 apk로 묶어주면 된다.
물론 위 포스팅에서 언급한대로 sign도 해줘야 install이 가능하다.

이렇게 해서 odexed된 app을 deodexing하여 원하는 Android Phone에 Install 할 수 있게 되었다.




===== Added =====
deodex 하는 도중 아래와 같은 에러가 발생할 때가 있다.

Error occured while loading boot class path files. Aborting.
org.jf.dexlib.Code.Analysis.ClassPath$ClassNotFoundException: Could not find sup
erclass Lcom/sec/android/touchwiz/widget/TwTabActivity;
        at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.loadSuperclass(ClassPa
th.java:784)
        at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.<init>(ClassPath.java:
668)
        at org.jf.dexlib.Code.Analysis.ClassPath.loadClassDef(ClassPath.java:280
)
        at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:16
3)
        at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPath(ClassPath.j
ava:131)
        at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:105)
        at org.jf.baksmali.main.main(main.java:278)
Error while loading class Lcom/sec/android/app/clockpackage/ClockPackage; from f
ile ClockPackage.odex
Error while loading ClassPath class Lcom/sec/android/app/clockpackage/ClockPacka
ge;

이 때는 system/framework 폴더내에서 com/sec/android/touchwiz/widget/TwTabActivity 가 포함된 jar를 찾고 -c option(bootclasspath. default값은 core.jar:ext.jar:framework.jar:android.policy.jar:services.jar 임)으로 이 jar를 추가해 주면 된다.

Z:\test\ss>java -jar baksmali-1.2.5.jar -c core.jar:ext.jar:framework.jar:android.policy.jar:services.jar:twframework.jar  -d system/framework -x ClockPackage.o