Android odex文件反編譯

odex 是通過優化的dex文件,且獨立存在於apk文件。odex 多用於系統預製應用或服務。經過將apk中的dex文件進行 odex,能夠加載 apk 的啓動速度,同時減少空間的佔用。請參考ODEX關於 odex 的說明。java

在反編譯 odex 文件的過程當中,咱們須要使用到如下工具android

smali/baksmali是odex與dex文件格式互相轉換的兩個工具,dex2jar則是將dex文件轉爲java的jar文件,JD Compiler用於反編譯jar文件。也就是說,通過以上一系列的操做,咱們最終能夠從一個odex文件獲得一個可讀的java文件。(事實上,也不是徹底可讀,與源碼上仍是有差異,有時候部分代碼還沒法反編譯過來,只能以jdk虛擬機指令的方式存在了)。apache

首先,一個 odex 文件的生成過程是:java -> class -> dex -> odex,那麼反編譯的就是上面過程的逆操做了:odex -> dex -> class -> java。api

個人測試環境:sass

  • Android 4.1.2
  • Samsung Galaxy II

以Android系統中的 uiautomator.odex 文件爲例,目標是反編譯其源碼(其實它的源碼grepcode).bash

工具準備

建立一個臨時目錄test,將 smali/baksmali 相關的工具都放入其中。工具

反編譯 (odex -> dex)

首先,將目標 odex 文件拿出來。測試

1
2
cd test
adb pull /system/framework/uiautomator .odex

在合成 odex 文件過程當中,還須要用到不少依賴文件,它們一樣也是 odex 格式的。所以在合成時,咱們須要根據狀況反覆從手機中抽取相關的依賴包。優化

關於命令的使用,直接執行 java -jar baksmali-2.0.2.jar 能夠獲得相關的使用說明。這裏要用到的參數主要是:ui

  • [-a | --api-level]: Android API等級,Android 4.1.2是16
  • [-x | --deodex]: 操做,反編譯
  • [-d|--bootclasspath-dir]: 依賴包的目錄,咱們用當前目錄.

開始反編譯,執行如下命令:

1
2
3
4
5
6
7
8
D:\ test >java -jar baksmali-2.0.2.jar -a 16 -x uiautomator.odex -d .
 
Error occured while loading boot class path files. Aborting.
org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/core-junit .odex
         at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:217)
         at org.jf.dexlib2.analysis.ClassPath.fromClassPath(ClassPath.java:161)
         at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:59)
         at org.jf.baksmali.main.main(main.java:274)

以上的異常代表,反編譯的過程缺乏依賴包/system/framework/core-junit.odex,那就從系統中提取。

1
2
3
4
5
6
D:\ test >adb pull /system/framework/core-junit .odex
 
# 重複
D:\ test >java -jar baksmali-2.0.2.jar -a 16 -x uiautomator.odex -d .
 
# 若是還有缺失的依賴包,則反覆從手機上提取

反編譯 uiautomator.odex 總共須要使用到如下依賴包:

1
2
3
D:\ test > ls *.odex
android.policy.odex  bouncycastle.odex  core.odex  framework.odex   sec_edm.odex    services.odex
apache-xml.odex      core-junit.odex    ext.odex   framework2.odex  seccamera.odex  uiautomator.odex

baksmali 執行成功後,會產生一個 out 目錄,裏面放的是中間文件。這時,可使用這些中間文件來生成dex文件:

1
2
3
4
5
D:\ test >java -jar smali-2.0.2.jar -a 16 -o classes.dex out
 
## 解壓 dex2jar 到 test 目錄
D:\ test \dex2jar-0.0.9.15>d2j-dex2jar.bat ..\classes.dex
dex2jar classes.dex -> classes-dex2jar.jar

classes-dex2jar.jar 即是咱們要獲得java jar包。經過JD Compiler打開這個jar能夠看到反編譯後的java內容。

之因此反編譯 uiautomator,是由於Android SDK中給出的 uiautomator.jar 包中不少API都沒有包含其中,也沒有在其官方文檔中給予說明。經過閱讀 uiautomator 的源碼,發現它有不少能夠擴展的地方

相關文章
相關標籤/搜索