Android APK反編譯及逆向工程

一. 分析已經打好的apk.

首先來簡單的說明下Apk文件本質上其實是一個zip包。我們直接進行解壓就能看到其中的目錄。


目錄

1. 目錄說明

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

上述的這些說明 簡單的說明了一個apk基本包含的東西,直接把apk解壓是沒有辦法進行閱讀的,在打包這個過程中經過了build-tools處理了。

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

xml文件都不能直接被識別了這是因為:xml文件都被aapt編譯成二進制的xml文件,將文本格式的xml轉為二進制格式的xml原因有以下兩點:二進制格式的XML文件占用空間更小;二進制格式的XML文件解析速度更快。

二. 反編譯工具

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

可以利用ApkTool,獲取AndroidManifest和res等資源文件:
功能:拆解Apk文件,反編譯其中的資源文件,將它們反編譯為可閱讀的AndroidManifest.xml文件和res文件。因為直接把Apk文件當做zip解壓,得到的xml資源文件,都是無法直接用文本編輯器打開閱讀的,因為它們在打包時經過了build-tools的處理變成了二進制的XML。

(1.) 安裝ApkTool

ApkTool 需要的環境是jdk 1.7以上

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

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


通過java -jar apktool.jar d xx.apk命令執行jar程序,可以從下圖看到反編譯出來的具體內容:

已經得到一個可以用文本編輯器打開的閱讀的AndroidManifest.xml文件、assets文件夾、res文件夾、smali文件夾等等。這樣,我們就可以查看到這個Apk文件的package包名、Activity組件、程序所需要的權限、xml布局、圖標等等信息。smali文件夾是反編譯出來的代碼,需要進行相應的學習才能看懂。

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

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

更多詳細用法參考官方文檔

2. 使用dex2jar反編譯dex文件,得到java源代碼

(1. )dex2jar的功能

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

(2. )dex2jar的安裝

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



把apk解壓下來就能獲得classes.dex文件,之后賦值到dex2jar目錄下 ,執行命令。

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

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

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

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

(1.)jadx介紹

jadx可以直接對Apk進行反編譯直接生成.java文件,相當于是apktool+dex2jar+jd-gui反編譯的組合。jadx具有以下兩個優點:

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

工具官方地址 :

(2.)jadx安裝使用

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

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

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

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

5. 使用ClassyShark對APK反編譯

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

打開apk文件java -jar ClassyShark.jar -open xx

三. Android 逆向工程.

總覽

1. 新建一個app在MainActivity中輸出一個toast,然后打包出來用于反編譯,。

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進行反編譯,修改文件,然后打包.

(1.) 下載apktool

ApkTool的github地址

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

image.png

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

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

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

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

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

image.png

四. APK加固脫殼.

眾所周知,Android應用開發完成后,除了使用Google官方的混淆外,還需要使用一些第三方的安全軟件的加殼處理,比較出名的有騰訊樂固、360加固和愛加密等。加固工具的出現,讓反編譯的難度更大。但是有了加固技術,就會有反加固技術。
經過加固后的apk,通過dex2jar反編譯:
騰訊樂固:


360加固:



從上面可以看出,經過加固后的apk,通過常規方法反編譯無法獲取到源碼。

所謂Apk加固,就是給目標Apk加一層保護程序,把重要數據信息隱藏起來。加殼程序可以有效 阻止對程序的反編譯和逆向分析。Apk加固本質的功能就是實現類加載器。系統先執行加固殼代碼,然后將加了密的dex進行解密操作,再加載到系統內存中運行。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容