专栏首页FreeBufVdex Extractor:从Vdex文件反编译和提取Android Dex字节码

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 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文件的依赖项转储示例。

集成反汇编程序

为了调试反编译器并协助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(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-10-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • DNSlivery:通过DNS发送文件和payload的工具

    它可以轻松地将文件或payload传送到受损目标,不需要使用传统的Web传输,无需专用客户端软件。这适用于禁止传出Web流量的受限环境。

    FB客服
  • WannaCry勒索病毒详细解读

    2017年5月12日,WannaCry蠕虫通过MS17-010漏洞在全球范围大爆发,感染了大量的计算机,该蠕虫感染计算机后会向计算机中植入敲诈者病毒,导致电脑大...

    FB客服
  • 警惕GLOBEIMPOSTER勒索软件

    一、概述 安天安全研究与应急处理中心(Antiy CERT)的工程师在近日接到用户反馈,其服务器被勒索软件加密。经过分析判定认为该加密服务器的勒索软件是Glob...

    FB客服
  • python winrm 连接windo

    最近遇到项目需要使用windows 服务器,之前分开部署,先需求linux连接windows,使用winrm即可

    py3study
  • 设计的商业价值

    我们都知道产品和服务设计不好的例子,例如 USB插头(在第三次尝试时总是很幸运)。在许多机场匆忙进行联系飞行的经历就像星球大战中死星上的排气口。

    半吊子全栈工匠
  • Spring Cloud微服务在花椒直播的实践

    微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好...

    用户5927304
  • 设计师,坚持哪些小事将来会受益匪浅?

    1、永远保持旺盛的好奇心和学习意识首先要明白自己的知识水平和认识水平还有审美能力,找到优势和不足,进行有意识的训练和补充。

    宇相
  • 3 Python文件操作

    py3study
  • C语言编译过程

    预编译结果解释 # linenum filename flags 分别对应行号、文件、标识。 flag对应的含义

    用户2929716
  • 『互联网架构』软件架构-软件系统设计(一)

    满足用户需求,达成商业的目的。而不是开发人员自己歪歪,高水平的设计人员就是设计出来刚刚满足用户需要的软件,而不是不惜一切代码设计出来一个最先进的软件,没...

    IT故事会

扫码关注云+社区

领取腾讯云代金券