vdex文件提取dex

Android8.0之后引入了全新的vdex文件,vdex文件将存储预先验证的DEX文件,这些文件在重新编译时不需要被重新提取和重新验证,例如,由于新的配置信息或系统更新后。 但是也为我们反编译带来了一定的技术困难.but方法还是有的,通过下面工具进行提取。 vdexExtractor在bin目录下生成一个vdexExtractor的可执行文件,执行即可:

./vdexExtractor -i input_vdex_file -o output_dex_file

帮助文档

$ 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           : 帮助信息

oat提取odex文件

SmaliEx Usage:

  • Deoptimize boot classes (The output will be in "odex" and "dex" folders): java -jar oat2dex.jar boot

  • Deoptimize application: java -jar oat2dex.jar

  • Get odex from oat: java -jar oat2dex.jar odex

  • Get odex smali (with optimized opcode) from oat/odex: java -jar oat2dex.jar smali

  • Deodex /system/framework/ from device (need to connect with adb): java -jar oat2dex.jar devfw

最新版odex提取dex

在smali仓库下载下面文件,并放到本地目录deodex(我下载的是2.2.5版本)

  • smali-xxx.jar
  • baksmali-xxx.jar

⚠️网上的教程命令都是基于2.1.3版本的,现在已经变了。比如 java -jar baksmali-2.1.3.jar -x SecurityCenter.odex -d framework/arm/ -c framework/arm/boot.oat java -jar smali-2.1.3.jar out -o classes.dex baksmali-xxx.jar 将 odex 转换为 smali 文件 smali-xxx.jar 将 smali 文件打包成 dex 文件

将需要反编译的odex文件也放到该deodex目录下面

执行以下命令: 反编译odex为smali:

java -jar baksmali-2.2.5.jar d SecurityCenter.odex

将smali文件组装成dex文件(其中a为指令assemble的意思,out为指定目录):

java -jar smali-2.2.1.jar a out

推荐采用最新的jadx0.8.0查看反编译之后的dex文件

参考

https://www.jianshu.com/p/fc692e5c04ab