使用工具:
CSDN上下載地址:
apktool (資源文件獲取) 下載
dex2jar(源碼文件獲取) 下載
jd-gui (源碼查看) 下載
Android反編譯整合工具包(最新) 下載
官方最新版本下載地址:
apktool(google code)
dex2jar(google code)
工具介紹:
apktool
作用:資源文件獲取,可以提取出圖片文件和布局文件進行使用查看
dex2jar
作用:將apk反編譯成java源碼(classes.dex轉化成jar文件)
jd-gui
作用:查看APK中classes.dex轉化成出的jar文件,即源碼文件
1. APK的內部結構
APK的全稱是AndroidPackage,它是Android安裝包。APK文件其實是zip格式,但后綴名被修改為apk,通過UnZip解 壓后,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執行程序,並非Java ME的字節碼而是Dalvik字節碼。
下面以HelloWorld為例講解Android應用程序的文件結構及打包過程。
1.1 Android應用程序文件結構
現在編寫一個HelloWorld應用程序已經變得非常簡單的,在eclipse集成開發環境中只需要點擊下一步基本就可以完成此應用程序。圖1.1即為由eclipse集成開發環境生成的HelloWorld應用程序的文件結構圖。
圖1.1 HelloWorld文件結構圖
其中,
Src java源文件目錄
Gen 自動生成的目錄,其中包括了著名的R.java
Android 2.3.3 該應用程序依賴的android SDK包。
Assets 存放原生文件,這個目錄保存的文件可以打包在程序里。和res的不同點是,android不為assets下的文件生成ID,如果使用assets下的文件,需要指定文件的路徑和文件名。
Bin Java編譯輸出的路徑
Res 存放程序所需要的資源文件,也就是非Java的文件。常見的目錄有,
(1)res/animator/ :XML文件,定義動畫屬性
(2)res/anim/ :XML文件,它們被編譯進逐幀動畫(frame by frame animation)或補間動畫(tweened animation)對象
(3)res/color/:XML文件,定義顏色狀態的列表
(4)res/layout/:存放被編譯為屏幕布局(或屏幕的一部分)的XML文件
(5)res/menu/:XML文件,用來定義應用的菜單
(6)res/drawable/:存放圖片文件,如.png, .jpg, .gif等。放在這里的圖像資源可能會被aapt(android assert packaging tool,android資源打包工具)自動地進行無損壓縮優化。如果你不想圖片被壓縮改變,請把圖像文件放在 res/raw/目錄下,這樣可以避免被自動優化。
(7)res/raw/:直接復制到設備中的任意文件,它們無需編譯
(8)res/values/:存放可以被編譯成很多種類型的資源文件, XML 格式的。常見的文件有:
array.xml :定義數組
colors.xml :定義color drawable和顏色的字符串值。
dimens.xml : 定義尺寸值(dimension value)。
strings.xml :定義字符串(string)值。
styles.xml:定義樣式(style)對象。
(9)res/xml/:任意的XML文件,在運行時可通過調用Resources.getXML()讀取。
AndroidManifest.xml
這個清單給Android系統提供了關於這個應用程序的基本信息,系統在運行任何程序代碼之前必須知些信息。AndroidManifest.xml主要包含以下功能:
(1)命名應用程序的 Java 包,這個包名用來唯一標識應用程序
(2)描述應用程序的組件:活動,服務,廣播接收者,以及組成應用程序的內容提供器;對實現每個組件和公布其能力(比如,能處理哪些意圖消息)的類進行命名。這些聲明使得 Android系統了解這些組件以及在什么條件下可以被啟動;
(3)決定應用程序組件運行在哪個進程里面
(4)聲明應用程序所必須具備的權限,用以訪問受保護的部分 API,以及和其它應用程序交互;
(5)聲明應用程序其他的必備權限,用以組件之間的交互;
(6)列舉測試設備Instrumentation類,用來提供應用程序運行時所需的環境配置和其他信息,這些聲明只是在開發和測試階段存在,發布前將被刪除
(7) 聲明應用程序所要求的Android API的最低版本級別;
(8)列舉application所需要鏈接的庫
Proguard-project.txt
Android代碼混淆器,用於加大反編譯的難度。詳細描述請見
http://developer.android.com/tools/help/proguard.html
Project.properties
定義一些項目的基本屬性。
1.2 打包過程
圖1.2為Android應用程序打包流程圖。從圖中我們可以看到,
a. Java源文件通過javac編譯成class, 然后class通過dx.bat生成虛擬機運行的二進制程序。
b. 資源文件通過appt打包。
c. 打包好的源文件及資源文件通過apkbuilder生成未簽名的APK。
d. 通過keytool生成key
e. Jarsigner為未簽名的APK生成簽名。
至此,整個APK打包過程已經完成。
2. APK的反匯編流程
想要探究APK內部結構,就不得不對其進行逆向工程了。圖2.1為Android應用程序逆向工程流程圖。正如本文開頭所述,APK文件其實是 zip格式,因此可以直接通過unzip工具進行解壓。解壓后主要包含資源文件及dex,注意這些資源文件都是壓縮過的,需要通過特殊工具解析才可使用。
從圖2.1我們可以看到,實際上可以通過apktool + dex2jar + xjad/JD-GUI實現對APK的逆向工程。下面我們就一一講解各項工具的使用方法, 解開APK的今生之謎。
圖2.1 Android應用程序逆向工程流程圖
2.1 APK的內部結構
APK文件其實是zip格式,但后綴名被修改為apk,通過UnZip解壓后,可以得到APK文件結構。
2.2 APK的逆向工程
下面我們就開始激動人心的APK逆向工程吧。
1.2.1 資源文件
如果直接解壓APK文件,那么對應的資源文件都是經過某種格式壓縮過的。因此我們需要一些工具來解析這些文件。Apktool是一個非常棒的解析資源文件的工具,實際上它還可以將dex文件轉換成smoli格式的文件。
Ø Apktool
官網: http://code.google.com/p/android-apktool/
在apktool官網上,有兩個包需要下載,如果在windows上反編譯,下載apktool-install-windows-xx.tar.bz2及apktoolxx.tar.bz2即可。如果在linux上反編譯,則下載apktool-install-linux-xx.tar.bz2及apktoolxx.tar.bz2。
apktool運行格式:
apktool d xxx.apk output 反編譯xxx.apl到文件夾output
apktool b output 從文件夾output重構apk,輸出到output/dist/out.apk
反編譯之后的文件如下所示。其中xml文件都已經成功反編譯,而dex文件被反編譯成smali格式。這種語法很難讀懂,我們可以通過其他工具來反編譯dex文件。在apktool的官網上,我們看到有如果通過smali來debug apk。看上去還有點意思。http://code.google.com/p/android-apktool/wiki/SmaliDebugging
1.2.2 可執行文件
經過unzip解壓之后的APK會生成一個class.dex文件。
Ø dex2jar
官網:https://code.google.com/p/dex2jar/
運行 dex2jar.bat classes.dex
生成 classes_dex2jar.jar
Ø JD-GUI
官網:http://java.decompiler.free.fr/?q=jdgui
用JD-GUI打開dex2jar生成的classes_dex2jar.jar后,就可以看到java源文件啦。如下圖所示。
Ø Apkdb
官網:http://code.google.com/p/android-apkdb/
《Android APK+Dex文件反編譯及回編譯工具》簡稱:APKDB。是一款,針對Android OS系統APK程序,直接反編譯修改的工具。APKDB集合了當今最強悍,最犀利的APK及Dex文件編譯工具;正常安裝后,它直接在【鼠標右鍵】創建快捷菜單;非常方便漢化工作者,對APK或Dex文件進行簡易的反編譯回編譯操作。
反編譯流程:
一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件
下載上述工具中的apktool,解壓得到3個文件:aapt.exe,apktool.bat,apktool.jar ,將需要反編譯的APK文件放到該目錄下,
打開命令行界面(運行-CMD) ,定位到apktool文件夾,輸入以下命令:apktool.bat d -f test.apk test
(命令中test.apk指的是要反編譯的APK文件全名,test為反編譯后資源文件存放的目錄名稱,即為:apktool.bat d -f [apk文件 ] [輸出文件夾])
說明獲取成功,之后發現在文件夾下多了個test文件,點擊便可以查看該應用的所有資源文件了。
如果你想將反編譯完的文件重新打包成apk,那你可以:輸入apktool.bat b test(你編譯出來文件夾)便可,效果如下:
之后在之前的test文件下便可以發現多了2個文件夾:
build
dist(里面存放着打包出來的APK文件)
Apk反編譯得到Java源代碼
下載上述工具中的dex2jar和jd-gui ,解壓
將要反編譯的APK后綴名改為.rar或則 .zip,並解壓,得到其中的額classes.dex文件(它就是java文件編譯再通過dx工具打包而成的),將獲取到的classes.dex放到之前解壓出來的工具dex2jar-0.0.9.15 文件夾內,
在命令行下定位到dex2jar.bat所在目錄,輸入dex2jar.bat classes.dex,效果如下:
在改目錄下會生成一個classes_dex2jar.jar的文件,然后打開工具jd-gui文件夾里的jd-gui.exe,之后用該工具打開之前生成的classes_dex2jar.jar文件,便可以看到源碼了,效果如下:
被混淆過的效果圖(類文件名稱以及里面的方法名稱都會以a,b,c....之類的樣式命名):
三、 圖形化反編譯apk(本人未使用過)
上述步驟一、二講述了命令行反編譯apk,現在提供一種圖形化反編譯工具:Androidfby
首先,下載上述反編譯工具包,打開Androidfby目錄,雙擊Android反編譯工具.exe,就可以瀏覽打開要反編譯的apk
通過反編譯,你可以獲知該應用用到了什么第3方的庫文件,它的代碼是如何編寫的等等。
然而,如果該APK進行了混淆處理,那么你看到的類文件名稱以及里面的方法名稱都會以a,b,c....之類的樣式命名,所以你可以想找到你所想得知的界面代碼可能會十分費勁,找到了代碼可能看起來也會很費勁,可是一個大體的思路會獲得,有了這個思路,你就可以自己去嘗試了。
本人曾經想寫一個類似唱吧的名人界面布局,可是當初第一次接觸不知道如何去寫,進進行了反編譯,即使他的那個代碼是混淆過的,我也看出來他是通過LISTVIEW的TYPE設定不同的ITEM布局實現了。可能好多引用都是采用重寫VIEW來實現效果,你可以得到他的大體思路對你的開發有益無害。
反編譯失敗報錯:
1 Exception in thread main brut.androlib.androlibexception multiple resources
解決辦法:下載最新的apktool,在google官網上。測試,如果未成功采取第二種方法
2 Exception in thread main org.jf.dexlib.util.exceptionwithcontext index
在cmd命令行,反編譯的命令改為apktool.bat d -s即可。其他相同,-s代表只反編譯xml文件。