反編譯與回編譯android的framework.jar(其他jar文件也可參考)

Android odex文件反編譯

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

在反編譯 odex 文件的過程中,我們需要使用到以下工具

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

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

我的測試環境:

  • Android 4.1.2
  • Samsung Galaxy II

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

工具準備

創建一個臨時目錄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 可以得到相關的使用說明。這裏要用到的參數主要是:

  • [-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 的源碼,發現它有很多可以擴展的地方





注: 關於smali語法,可以參考官方 
http://code.google.com/p/smali/w/list
或 http://blog.csdn.net/uiop78uiop78/article/details/7186638


最近對android 2.3.3的framework.jar進行了一些反編譯和回編譯的操作,寫下來備忘。

一、framework.jar反編譯爲smali文件

1、下載smali-1.2.6.jarbaksmali-1.2.6.jar這兩個工具(下載地址:http://code.google.com/p/smali/downloads/list

2、將framework.jar中的classes.dex解壓出來(好像不解壓,直接用framework.jar也行)

3、使用baksmali.jar對classes.dex進行反編譯(前提是安裝了jdk,並且設置好了環境變量),執行命令:

java -jar baksmali-1.2.6.jar classes.dex-oout/

其中classes.dex是要反編譯的文件,out/是要把反編譯後的文件存放到的文件夾,如果不是在當前目錄下,那麼baksmali-1.2.6.jar還要加上路徑

這樣就OK了,在out文件夾中可以看到一堆擴展名爲.smali的文件,用記事本就可以打開它們,從中可以窺到一些信息。但是與.java文件還是有一些不同,我也不太清楚這是什麼結構。

二、smali文件回編譯爲classes.dex

1、一條命令就OK了:java -jar smali-1.2.6.jarout/-o classes.dex

2、再把編譯好的classes.dex放回到framework.jar中就行了(可以使用winrar、winzip之類的工具作爲輔助)。

三、framework.jar反編譯爲.class和.java文件

1、下載以下工具:

(1)dex2jar(http://code.google.com/p/dex2jar/

(2)xjad(http://www.skycn.com/soft/41898.html)或jd-gui(http://java.decompiler.free.fr/?q=jdgui

2、使用dex2jar對framework.jar進行轉換,執行命令:dex2jar.bat framework.jar  將會生成一個framework.jar.dex2jar.jar

3、直接對該jar文件解壓,可以看到裏面都是.class文件了

4、如果還需要轉換成.java文件,可以使用xjad或jd-gui,均可將class文件變爲java文件。

注:dex2jar工具也可以處理.dex文件,因此也可以不直接處理framework.jar。而是先將framework.jar解壓,生成classes.dex後再處理也行。

四、framework.odex反編譯爲.class和.java文件

1. 下載一下工具:

(1.)odex2jar/baksmali-2.0.3.jar 和odex2jar/smali-2.0.3.jar

執行 java -jar baksmali-2.0.2.jar -x -a 18 -d <framework_dir> framework.odex 生成out目錄的 smail文件

再執行java -jar odex2jar/smali-2.0.3.jar out/ -o classes.dex

在執行 上面步驟三 ,把dex 轉 jar




1:apk反編譯


2:odex轉dex

操作環境:ubuntu
A:apk反編譯
.到code.google上下載apktool.jar以及相關文件:http://code.google.com/p/android-apktool/downloads/list
點擊下載apktool-1.0.0.tar.bz2 和apktool-install-linux-2.1_r01-1.zip

Apktool 命令
./apktool d geek.apk test    反編譯 geek.apk到文件夾test
B:odex轉dex
http://code.google.com/p/smali/downloads/list
下載下面4個文件。
現在我們要對CardManager.odex進行反編譯,以CardManager.odex爲例。
1:java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex    
//注意:這裏要有core.jar:ext.jar:framework.jar:android.policy.jar:services.jar文件支持。這個 apk 所在的 rom 裏面的一些 jar 文件,都在 /system/framework 裏面: core.jar, ext. jar, framework. jar, android.policy. jar, services.jar和對應的.odex文件,把這些文件放在CardManager.odex同一級目錄。
運行java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex   ,會生成一個out文件夾,裏面的文件以.smali結尾,
2:生成 classes.dex文件
運行 java -jar smali-1.3.2.jar out/ -o classes.dex
3:下載 dex2jar : dex2jar-0.0.9.8.zip
http://code.google.com/p/dex2jar/downloads/list
解壓 tar -xzvf dex2jar-0.0.9.8.tar.gz
生成classes_dex2jar.jar文件
dex2jar-0.0.9.8$ ./dex2jar.sh ../Test_HW_ODEX/classes.dex
wanqi@wanqi-System-Product-Name:~/Downloads/dex2jar-0.0.9.8$ ./dex2jar.sh ../Test_HW_ODEX/classes.dex 
dex2jar version: translator-0.0.9.8
dex2jar ../Test_HW_ODEX/classes.dex -> ../Test_HW_ODEX/classes_dex2jar.jar
4:運行jd-gui-0.3.2.linux.i686,打開classes_dex2jar.jar。就ok了。
反編譯framework.odex 
java -Xmx512m -jar baksmali-1.3.2.jar --api-level 12 -c:core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -d framework/ -x framework.odex 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章