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 zlibLinux: 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文件的依賴項轉儲示例。
$ bin/vdexExtractor -i /tmp/BasicDreams.vdex -o /tmp --deps -f
[INFO] Processing 1 file(s) from /tmp/BasicDreams.vdex
------- Vdex Deps Info -------
dex file #0
extra strings: number_of_strings=2
0000: 'Ljava/lang/Thread;'
0001: 'Ljava/lang/Throwable;'
assignable type sets: number_of_sets=8
0000: 'Landroid/service/dreams/DreamService;' must be assignable to 'Landroid/content/Context;'
0001: 'Landroid/view/TextureView;' must be assignable to 'Landroid/view/View;'
0002: 'Ljava/nio/FloatBuffer;' must be assignable to 'Ljava/nio/Buffer;'
...
unassignable type sets: number_of_sets=0
class dependencies: number_of_classes=34
0000: 'Landroid/graphics/Color;' 'must' be resolved with access flags '1'
0001: 'Landroid/graphics/SurfaceTexture;' 'must' be resolved with access flags '1'
...
0024: 'Ljavax/microedition/khronos/egl/EGL10;' 'must' be resolved with access flags '513'
...
field dependencies: number_of_fields=4
0000: 'Ljavax/microedition/khronos/egl/EGL10;'->'EGL_DEFAULT_DISPLAY':'Ljava/lang/Object;' is expected to be in class 'Ljavax/microedition/khronos/egl/EGL10;' and have the access flags '9'
0001: 'Ljavax/microedition/khronos/egl/EGL10;'->'EGL_NO_CONTEXT':'Ljavax/microedition/khronos/egl/EGLContext;' is expected to be in class 'Ljavax/microedition/khronos/egl/EGL10;' and have the access flags '9'
0002: 'Ljavax/microedition/khronos/egl/EGL10;'->'EGL_NO_DISPLAY':'Ljavax/microedition/khronos/egl/EGLDisplay;' is expected to be in class 'Ljavax/microedition/khronos/egl/EGL10;' and have the access flags '9'
0003: 'Ljavax/microedition/khronos/egl/EGL10;'->'EGL_NO_SURFACE':'Ljavax/microedition/khronos/egl/EGLSurface;' is expected to be in class 'Ljavax/microedition/khronos/egl/EGL10;' and have the access flags '9'
|