一、dex和odex
dex是安卓dalvik虛擬機的可執行文件,可以在導出的apk文件里用解壓縮軟件直接打開。odex是經過優化過的dex。odex一種是從apk程序中提取出來的,與apk文件存放在同一目錄,文件后綴為odex,這類odex文件多是Android ROM的系統程序;另一種緩存文件,這類odex仍以dex為后綴,存放在cache/dalvik-cache目錄下。存放文件名格式為“apk路徑@apk名@class.dex”,例如“system@app@Calculator@class.dex”,表示/system/app目錄下的Calculator.apk程序的odex文件。
二、dex轉換為odex
使用dexopt-wrapper可以將dex轉換為odex。dexopt-wrapper在安卓2.3以前的源碼中可以找到。將dex-wrapper編譯后放到手機中。
adb push dexopt-wrapper /data/localadb shell chmod 777 /data/local/dexopt-wrapper
隨意從apk文件中提取一個dex文件,將其改名為classex.dex,zip將其壓縮后改名為HelloDex.zip
adb push HelloDex.zip /data/local adb shell cd /data/local ./dexopt-wrapper HelloDex.zip HelloDex.odex如果執行無錯誤會有如下輸出
./dexopt-wrapper HelloDex.zip HelloDex.odex --- BEGIN 'HelloDex.zip' (bootstrap=0) --- --- waiting for verify+opt, pid=721 --- would reduce privs here --- END 'HelloDex.zip' (success) ---當前目錄會有HelloDex.odex文件。現在將其導出方便以后操作。
adb pull /data/local/HelloDex.odex d:\
三、odex轉換為dex
odex轉換為dex的原理就是先將odex轉為smali文件,然后將smali文件轉為dex文件。需要下載smali.jar和baksmali.jar。
java -jar baksmali.jar -x HelloDex.odex
將手機中的/system/framework文件夾導出。放入odex目錄下的framework文件夾內。
執行命令
java -jar baksmali.jar -x HelloDex.odex -d framework //-d 表示指定framework目錄
如果無錯誤會無任何輸出,工作目錄最終如下,out目錄為導出的smali保存目錄。
接下來將smali轉換為dex
執行命令
java -jar smali.jar out -o OutHelloDex.dex //將out目錄轉換為OutHelloDex.dex文件
如果無錯誤無任何輸出。當前目錄下會生成OutHelloDex.dex文件。


