Vdex Extractor:從Vdex文件反編譯和提取Android Dex位元組碼
Vdex Extractor
一款命令行工具,用於從Vdex文件反編譯和提取Android Dex位元組碼的工具。
編譯
克隆此存儲庫
如果要為Android設備進行交叉編譯,請安裝Android NDK
make.sh使用所需的構建目標調用bash腳本$ ./make.sh
- 如果CC未從env定義,則默認使用gcc$ ./make.sh gcc
- 用gcc編譯$ ./make.sh clang
- 用clang編譯$ ./make.sh cross-android
- 使用NDK交叉編譯(armeabi-v7a,arm64-v8a,x86和x86_64)可執行文件複製到bin目錄下,對於調試版本使用$ DEBUG=true ./make.sh
依賴關係
主機系統中應安裝以下外部庫:
zlib
macos:brew install zlib-devel
帶macports的macOS: port install zlib
Linux: apt install libz-dev
其他Linux / Unix系統:檢查可用的包管理器或從源代碼編譯使用cygwin的Windows:zlib-devel從cygwin安裝程序安裝
用法
$ bin/vdexExtractor -h
vdexExtractor ver. 0.5.2
Anestis Bechtsoudis
Copyright 2017 - 2018 by CENSUS S.A. All Rights Reserved.
-i, --input= : 輸入目錄(遞歸搜索)或單個文件
-o, --output= : 輸出路徑(默認與輸入相同)
-f, --file-override : 如果文件已經存在允許覆蓋(默認:false)
--no-unquicken : 禁用unquicken位元組碼反編譯器 (don"t de-odex)
--deps : 轉儲經過驗證的依賴信息
--dis : 啟用位元組碼反彙編器
--ignore-crc-error : 反編譯Dex 忽略CRC錯誤
--new-crc= : 提取Apk或Dex文件位置校驗和文本文件
--get-api : 基於Vdex版本獲取Android API級別
-v, --debug=LEVEL : 日誌級別 默認: "3" (INFO)
-l, --log-file=: 保存反彙編器或驗證依賴項輸出到日誌文件
-h, --help : 幫助信息
位元組碼Unquickening解碼器
Vdex文件包含所有quick_info數據(舊vtable),用於恢複位元組碼優化過程中應用的dexto -dex轉換。這裡是創建一個能夠快速恢復優化位元組碼的獨立工具,不需要從AOSP構建整個libart。Vdex完全unquicken功能也作為AOSP oatdump libart工具的一部分實現。可在此處獲得。如果你想在Oreo版本中使用oatdump,你可以在這裡使用相應的補丁,或者在oatdump ++工具的fork和build(內部和AOSP_SRC_ROOT工作空間)中使用oreo-release分支。谷歌已經發布了提供的補丁以及ART運行時的Android Pie版本。
驗證迭代器的依賴關係
當第一次編譯(優化)Dex位元組碼文件時,dex2oat將執行驗證依賴項收集器,作為方法學驗證者的一部分。驗證依賴項收集器類用於記錄解析結果和類路徑中定義的類/方法/欄位的類型可賦值測試。編譯驅動程序初始化類並註冊正在編譯的所有Dex文件。在這個集合之外的Dex文件中定義的類(或者沒有關聯的Dex文件的合成類)被認為在類路徑中。所有記錄的依賴關係都存儲在生成的Vdex文件中,以及來自OatWriter類的相應Oat文件。vdexExtractor工具集成了一個Vdex依賴項walker函數,該函數能夠迭代所有依賴項信息並以人類可讀的格式轉儲它們。以下代碼段演示了示例Vdex文件的依賴項轉儲示例。
集成反彙編程序
為了調試反編譯器並協助Dex位元組碼調查任務,實現了一個輕型反彙編程序。反彙編輸出非常類似於platform/art項目的AOSP dexdump2實用程序提供的輸出。反彙編程序可以獨立於unquickening反編譯器使用。以下代碼段中說明了示例輸出。前綴的行[new]說明了位於該偏移量中的反編譯指令(前一行)的輸出。請注意,所有加速的偏移和vtable引用都已恢復為原始簽名和原型。
Dex轉換器
Android 9(Pie)版本推出了一種新型的Dex文件,即Compact Dex(Cdex)。Cdex是一種ART內部文件格式,它壓縮各種Dex數據結構(例如方法頭)並對多索引文件中的常見數據blob(例如字元串)進行重複數據刪除。來自輸入應用程序的Dex文件的重複數據刪除數據存儲在Vdex容器的共享部分中。
現在由於Vdex容器存儲的是Cdex文件而不是標準的Dex,因此vdexExtractor後端(從版本019開始)已經更新並支持它們。但是,由於該工具未實現Dex IR,因此無法在不使用外部工具的情況下將Cdex文件轉換回標準Dex。為此,編寫了「compact_dex_converter」
工具,該工具使用來自AOSP art repo的libdexlayout(Dex IR)。該工具的源代碼可在此處獲得。編譯工具需要分配必要的AOSP回購併構建為AOSP模塊。為方便起見,vdexExtractor正在實現一個幫助工具(請參閱下一節中的「tools / deodex」),該工具下載一組預編譯的二進位文件並包裝所需的自動化。此外,可以從以下鏈接下載「compact_dex_converter」二進位文件:
Linux x86-64
使用共享庫:https://1drv.ms/u/s !ArDC4mvMyPrRhEsiuPjOF_ssIfOe
使用共享庫調試:https://1drv.ms/u/s!ArDC4mvMyPrRhE3Z2jdBXJIhazjc
靜態編譯:https://1drv.ms/u/s !ArDC4mvMyPrRhEq96XX-LsCACF2s
靜態編譯調試:https://1drv.ms/u/s!ArDC4mvMyPrRhEwmwM8—zdhoCB2
Linux x86-64舊CPU(沒有SSE4.2和沒有POPCNT #29)
使用共享庫:https://1drv.ms/u/s!ArDC4mvMyPrRhFP46IyBqOtihS9s
使用共享庫調試:https://1drv.ms/u/s!ArrDC4mvMyPrRhFXEGW9vrlMlTKDJ
靜態編譯:https://1drv.ms/u/s!ArDC4mvMyPrRhFIFZCF9TtEHVooc
靜態編譯的調試:https://1drv.ms/u/s!ArDC4mvMyPrRhFSMELB_H3w5Cdfe
ARM64(aarch64)
使用共享庫:https://1drv.ms/u/s!ArDC4mvMyPrRhEindMOf3aWCbQRr
使用共享庫調試:https://1drv.ms/u/s!ArDC4mvMyPrRhEnU9Ei_3MeQipGr
靜態編譯:不支持
蘋果系統
使用共享庫:https://1drv.ms/u/s!ArDC4mvMyPrRhE45gEUNolEiZ50u
使用共享庫調試:https://1drv.ms/u/s!ArDC4mvMyPrRhFG5WH_zNz0jNarZ
靜態編譯:不支持
二進位名稱中的"s"
後綴代表「靜態編譯」,而「d」
代表「debug」
構建。它們也可以組合在一起(例如"ds"
- 靜態編譯的調試版本)。
實用腳本
extract-apps-from-device.sh
從連接的Android設備中提取安裝包(用戶和系統)的ART編譯器輸出資源(oat、ART、vdex)。還支持提取APK檔案的安裝包。由於應用了DAC許可權,一些系統應用程序數據在沒有根訪問的情況下可能無法提取。
update-vdex-location-checksums.sh 使用從輸入Apk存檔文件中提取的CRCs更新Vdex文件位置校驗。有關如何使用該特性欺騙ART和繞過SafetyNet應用程序完整性檢查的更多信息,請參閱
原文
。
tools/deodex/run.sh幫助工具,以批量方式將(deodex) Vdex資源反編譯回標準Dex文件。該工具自動處理CompactDex文件(如Android Pie中介紹的),並使用compact_dex_converter工具轉換回StandardDex。由於轉換器是作為AOSP源代碼的一部分進行編譯的,為了方便起見,開發人員維護了一組用於Linux和maacOS的二進位文件。
*參考來源:
github,由周大濤編譯,轉載請註明來自FreeBuf.COM
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※如何通過惡意宏劫持桌面快捷方式提供後門
※還記得BlueBorne嗎?一年過去了,仍有20億藍牙設備的漏洞沒有修復
TAG:FreeBuf |