Android APK反編譯詳解


使用工具:

     CSDN上下載地址:

       apktool (資源文件獲取  下載  

       dex2jar(源碼文件獲取) 下載

       jd-gui  (源碼查看) 下載

 

       Android反編譯整合工具包(最新) 下載

 

     官方最新版本下載地址:

       apktool(google code)

  dex2jar(google code)  

   jd-gui(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.bz2apktoolxx.tar.bz2即可。如果在linux上反編譯,則下載apktool-install-linux-xx.tar.bz2apktoolxx.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集合了當今最強悍,最犀利的APKDex文件編譯工具;正常安裝后,它直接在【鼠標右鍵】創建快捷菜單;非常方便漢化工作者,對APKDex文件進行簡易的反編譯回編譯操作。

 

反編譯流程:

一、apk反編譯得到程序的源代碼、圖片、XML配置、語言資源等文件

下載上述工具中的apktool,解壓得到3個文件:aapt.exeapktool.batapktool.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文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM