Android APK反編譯及逆向工程

一. 分析已經(jīng)打好的apk.

首先來(lái)簡(jiǎn)單的說(shuō)明下Apk文件本質(zhì)上其實(shí)是一個(gè)zip包。我們直接進(jìn)行解壓就能看到其中的目錄。


目錄

1. 目錄說(shuō)明

  • AndroidManifest.xml:應(yīng)用的全局配置文件
  • classes.dex:源代碼編譯成class后,轉(zhuǎn)成jar,再壓縮成dex文件,dex是可以直接在Android虛擬機(jī)上運(yùn)行的文件。
  • lib文件夾:引用的第三方sdk的so文件。
  • META-INF文件夾:Apk簽名文件。
  • res文件夾:資源文件,包括了布局、圖片等等。
  • resources.arsc:記錄資源文件和資源id的映射關(guān)系。
  • 其中還有一個(gè)沒(méi)有顯示就是→assets文件夾:原始資源文件夾,對(duì)應(yīng)著Android工程的assets文件夾,一般用于存放原始的網(wǎng)頁(yè)、音頻等等。

上述的這些說(shuō)明 簡(jiǎn)單的說(shuō)明了一個(gè)apk基本包含的東西,直接把a(bǔ)pk解壓是沒(méi)有辦法進(jìn)行閱讀的,在打包這個(gè)過(guò)程中經(jīng)過(guò)了build-tools處理了。

其實(shí)反編譯Apk的目的就是Apk拆成我們可以閱讀的文件。通過(guò)反編譯,我們一般想要得到里面的AndroidManifest.xml文件、res文件和java代碼。

xml文件都不能直接被識(shí)別了這是因?yàn)?xml文件都被aapt編譯成二進(jìn)制的xml文件,將文本格式的xml轉(zhuǎn)為二進(jìn)制格式的xml原因有以下兩點(diǎn):二進(jìn)制格式的XML文件占用空間更小;二進(jìn)制格式的XML文件解析速度更快。

二. 反編譯工具

1.使用ApkTool 反編譯APK獲取清單文件及布局文件

可以利用ApkTool,獲取AndroidManifest和res等資源文件:
功能:拆解Apk文件,反編譯其中的資源文件,將它們反編譯為可閱讀的AndroidManifest.xml文件和res文件。因?yàn)橹苯影袮pk文件當(dāng)做zip解壓,得到的xml資源文件,都是無(wú)法直接用文本編輯器打開(kāi)閱讀的,因?yàn)樗鼈冊(cè)诖虬鼤r(shí)經(jīng)過(guò)了build-tools的處理變成了二進(jìn)制的XML。

(1.) 安裝ApkTool

ApkTool 需要的環(huán)境是jdk 1.7以上

  • 下載apktool-2(最新)。
  • 將下載的jar重命名為 apktool.jar。
  • 將這兩個(gè)文件(apktool.jar&apktool.bat)移動(dòng)到您的Windows目錄(通常C://Windows)。
  • 如果沒(méi)有訪問(wèn)權(quán)限C://Windows,可以將這兩個(gè)文件放在任何位置,然后將該目錄添加到您的環(huán)境變量系統(tǒng)PATH變量。
  • 嘗試apktool通過(guò)命令提示符運(yùn)行。
(2.) 使用ApkTool

完成安裝的步驟以后,上述說(shuō)到如果你把文件移動(dòng)到其他的位置,就需要配置環(huán)境變量。首先進(jìn)入到你想要 反編譯的apk 目錄下,這里就放置到一起了。


通過(guò)java -jar apktool.jar d xx.apk命令執(zhí)行jar程序,可以從下圖看到反編譯出來(lái)的具體內(nèi)容:

已經(jīng)得到一個(gè)可以用文本編輯器打開(kāi)的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。這樣,我們就可以查看到這個(gè)Apk文件的package包名、Activity組件、程序所需要的權(quán)限、xml布局、圖標(biāo)等等信息。smali文件夾是反編譯出來(lái)的代碼,需要進(jìn)行相應(yīng)的學(xué)習(xí)才能看懂。

java -jar apktool.jar d xx.apk
  • -f 如果目標(biāo)文件夾已存在,強(qiáng)制刪除現(xiàn)有文件夾
  • -o 指定反編譯的目標(biāo)文件夾的名稱(默認(rèn)會(huì)將文件輸出到以Apk文件名命名的文件夾中)
  • -s 保留classes.dex文件(默認(rèn)會(huì)將dex文件解碼成smali文件)
  • -r 保留resources.arsc文件(默認(rèn)會(huì)將resources.arsc解碼成具體的資源文件)

注意apktool.jar是剛才下載后的jar的名稱,d參數(shù)表示decode,在這個(gè)命令后面還可以添加像-o -s之類的參數(shù),例如java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s。

更多詳細(xì)用法參考官方文檔

2. 使用dex2jar反編譯dex文件,得到j(luò)ava源代碼

(1. )dex2jar的功能

上文通過(guò)apkTool反編譯獲得apk 等資源文件,獲得的smali需要進(jìn)行系統(tǒng)的學(xué)習(xí)才能看懂。如果想獲取能看懂的源代碼,這時(shí)候就需要dex2jar登場(chǎng)了。
dex2jar的作用就是將dex格式的文件,轉(zhuǎn)換成jar文件。dex文件是Android虛擬機(jī)上面可以執(zhí)行的文件,jar文件大家都是知道,其實(shí)就是java的class文件。在官網(wǎng)有詳細(xì)介紹。
工具地址: dex2jar

(2. )dex2jar的安裝

打開(kāi)下載的文件進(jìn)行解壓后進(jìn)入/dex2jar目錄下,里面有腳本,進(jìn)入終端后,輸入命令就可以使用。
利用終端進(jìn)入到你的dex2jar目錄下,輸入命令進(jìn)行獲取



把a(bǔ)pk解壓下來(lái)就能獲得classes.dex文件,之后賦值到dex2jar目錄下 ,執(zhí)行命令。

這個(gè)時(shí)候又有人問(wèn)我了(怎么這么多人問(wèn)我),我怎么看生成的這個(gè)jar包呀。這個(gè)時(shí)候就需要 jd-gui了

3. 使用jd-gui查看jar里面的java源代碼

jd-gui用法: 下載完成后直接打開(kāi),把生成的classes-dex2jar.jar 文件直接拖到里面就可以查看了

4.使用jadx反編譯Apk,得到可以閱讀的.java源代碼

(1.)jadx介紹

jadx可以直接對(duì)Apk進(jìn)行反編譯直接生成.java文件,相當(dāng)于是apktool+dex2jar+jd-gui反編譯的組合。jadx具有以下兩個(gè)優(yōu)點(diǎn):

  • 可以直接反編譯出.java文件。
  • 查看源碼時(shí)直接顯示資源名稱,而不是像jd-gui里顯示的資源ID。

工具官方地址 :

(2.)jadx安裝使用

下載完成后進(jìn)行解壓,進(jìn)入bin目錄下執(zhí)行jadx-gui.bat,jadx也有GUI,進(jìn)入后選中然將要反編譯的apk即可,運(yùn)行效果如下:

如果要保存源碼,選擇File->Save ALL即可保存文件,然后就可以導(dǎo)入Android Studio等IDE中。我們也可以直接使用命令行反編譯apk文件:

  • jadx -d out classes.dex #直接輸出.java文件到out目錄
  • jadx-gui classes.dex #使用gui打開(kāi)

使用jadx大大簡(jiǎn)化了反編譯流程,不過(guò)獲取資源等文件還是建議使用ApkTool。

5. 使用ClassyShark對(duì)APK反編譯

ClassyShark是Google發(fā)布的一款可以查看Android可執(zhí)行文件的瀏覽工具,支持.dex, .aar, .so, .apk, .jar, .class, .xml 等文件格式,分析里面的內(nèi)容包括classes.dex文件,包、方法數(shù)量、類、字符串、使用的NativeLibrary等。

打開(kāi)apk文件java -jar ClassyShark.jar -open xx

三. Android 逆向工程.

總覽

1. 新建一個(gè)app在MainActivity中輸出一個(gè)toast,然后打包出來(lái)用于反編譯,。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toast.makeText(this, "未修改之前!", Toast.LENGTH_SHORT).show();
    }
}

2. ApkTool進(jìn)行反編譯,修改文件,然后打包.

(1.) 下載apktool

ApkTool的github地址

(2.) 將apktool.jar和需要反編譯的apk放到同一個(gè)文件夾下面,shift+鼠標(biāo)右鍵,選擇在此處打開(kāi)命令提示符。
java -jar apktool.jar d test.apk

image.png

d參數(shù)表示decode
在這個(gè)命令后面還可以添加像-o -s之類的參數(shù),例如// java -jar apktool.jar d yourApkFile.apk -o

  • -o 指定反編譯的目標(biāo)文件夾的名稱(默認(rèn)會(huì)將文件輸出到以Apk文件名命名的文件夾中)
  • -s 保留classes.dex文件(默認(rèn)會(huì)將dex文件解碼成smali文件)
  • -r 保留resources.arsc文件(默認(rèn)會(huì)將resources.arsc解碼成具體的資源文件)
    image.png
(3. )我們可以從下圖看到反編譯出來(lái)的具體內(nèi)容:
Android反編譯工具總結(jié)

我們已經(jīng)得到一個(gè)可以用文本編輯器打開(kāi)的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。original文件夾是原始的AndroidManifest.xml文件,res文件夾是反編譯出來(lái)的所有資源,smali文件夾是反編譯出來(lái)的代碼。
這時(shí),我們已經(jīng)可以文本編輯器打開(kāi)AndroidManifest.xml文件和res下面的layout文件了。這樣,我們就可以查看到這個(gè)Apk文件的package包名、Activity組件、程序所需要的權(quán)限、xml布局、圖標(biāo)等等信息。

(4. )修改smail文件.找到MainActivity.smail文件里吐司輸出的內(nèi)容,進(jìn)行替換
image.png

image.png
(5. )使用打包命令對(duì)源碼進(jìn)行打包.**
apktool b app -o other.apk(app 指需要打包的文件夾,-o other.apk 表示生產(chǎn)新文件)
(6. )對(duì)apk進(jìn)行簽名.然后安裝。**
image.png

image.png

四. APK加固脫殼.

眾所周知,Android應(yīng)用開(kāi)發(fā)完成后,除了使用Google官方的混淆外,還需要使用一些第三方的安全軟件的加殼處理,比較出名的有騰訊樂(lè)固、360加固和愛(ài)加密等。加固工具的出現(xiàn),讓反編譯的難度更大。但是有了加固技術(shù),就會(huì)有反加固技術(shù)。
經(jīng)過(guò)加固后的apk,通過(guò)dex2jar反編譯:
騰訊樂(lè)固:


360加固:



從上面可以看出,經(jīng)過(guò)加固后的apk,通過(guò)常規(guī)方法反編譯無(wú)法獲取到源碼。

所謂Apk加固,就是給目標(biāo)Apk加一層保護(hù)程序,把重要數(shù)據(jù)信息隱藏起來(lái)。加殼程序可以有效 阻止對(duì)程序的反編譯和逆向分析。Apk加固本質(zhì)的功能就是實(shí)現(xiàn)類加載器。系統(tǒng)先執(zhí)行加固殼代碼,然后將加了密的dex進(jìn)行解密操作,再加載到系統(tǒng)內(nèi)存中運(yùn)行。

由于加固方式會(huì)不斷的升級(jí),因此加固脫殼技術(shù)也是有時(shí)效性的,必須要要與時(shí)俱進(jìn)才能完成反編譯,因此本文暫不對(duì)加固脫殼方法進(jìn)行著墨。有興趣可以去如下論壇找尋相關(guān)資料進(jìn)行閱讀:
看雪論壇
吾愛(ài)破解
Android APK脫殼--騰訊樂(lè)固、360加固一鍵脫殼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容