dex2jar源码解析之总体介绍(一)
dex2jar这个源码包,听名字是用来将dex文件转换为java文件,在githup上面的地址是https://github.com/pxb1988/dex2jar
本地使用源码:http://download.csdn.net/detail/new_abc/9718937
但我们分析这个源码可以看到,里面的功能不只是将dex转换为jar包,也可以转换dex为smail文件等,这个后面在分析
dex2jar就是将dex文件转换为class文件,然后class文件打成jar包
dex转换为class文件过程中会先转换为一种IR的中间指令格式
大概的转换流程是上面这样子的
中间主要 调用的函数接口如下
上面的是相应的Visitor访问者,具体的处理都是调用里面的visitor相关的函数进行处理
然后看看主要的类图
DexFileReader开始从dex文件中读取内容,并调用里面的相应的函数处理读取到的数据,如acceptClass会解析一个类等
这里的话主要是一个Visitor相关的类关系图
Dalvik指令格式
一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式标识来决定。位描述约定如下
Dalvik指令对语法做了一些说明,它约定如下:
● 每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开。
● 每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的参数,也可以是两个4位的参数,还可以为空,如果指令超过16位,则后面部分一次作为参数
● 如果参数采用 “vX” 的方式表示,表示它是一个寄存器,如v0、v1等。这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器名字产生冲突,如ARM架构寄存器命名采用r开头。
● 如果参数采用 “#+X” 的方式表示,表明它是一个常量数字。
● 如果参数采用 “+X” 的方式表示,表明它是一个相对指令的地址偏移。
● 如果参数采用 “kind@X” 的方式表示,表明它是一个常量池的索引值。其中kind表示常量池类型,它可以是 “string” 字符串常量池索引)、“type”(类型常量池索引)、“field”(字段常量池索引)或者 “meth”(方法常量池索引)。● 每16位的字采用空格分隔开来。
● 每个字母表示4位,每个字母按顺序从高字节开始,排列到低字节。每4位之间可能使用竖线 “|” 来表示不同的内容。
● 顺序采用 A ~ Z 的单个大写字幕作为一个4位的操作码,op表示一个8位的操作码。
● “Φ” 来表示这字段所有位为0值。
以指令格式 “A|G|op BBBB F|E|D|C” 为例
指令中间有两个空格,每个分开的部分大小为16位,所以这条指令由三个16位的字组成。
第一个16位是 “A|G|op”,高8位由A与G组成,低字节由操作码op组成。
第二个16位由 BBBB 组成,它表示一个16位的偏移值。
第三个16位分别由F、E、D、C 共4个4字节组成,在这里他们表示寄存器参数。
单独使用位表示还无法确定一条指令,必须通过指令格式标识来指定格式的格式编码。它的约定如下:
● 指令格式标识大多由三个字符组成,前两个是数字,最后一个是字母。
● 第一个数字是表示指令有多少个16位的字组成。
● 第二个数字是表示指令最多使用寄存器的个数。特殊标记 “r” 标识使用一定范围内的寄存器。
● 第三个字母为类型码,表示指令用到的额外数据的类型。取值见如下表。
助记符 位大小 说 明
b 8 8位有符号立即数
c 16,32 常量池索引
f 16 接口常量(仅对静态链接格式有效)
h 16 有符号立即数(32位或64位数的高值位,低值位为0)
i 32 立即数,有符号整数或32位浮点数
l 64 立即数,有符号整数或64位双精度浮点数
m 16 方法常量(仅对静态链接格式有效)
n 4 4位的立即数
s 16 短整型立即数
t 8, 16, 32 跳转,分支
x 0 无额外数据
以指令格式标识22x 为例:
第一个数字2表示有2个16位字组成,第二个数字2表示指令使用到2个寄存器,第三个字母x表示没有使用到额外的数据。
这里是dex转ir用到的相关的一个类
这是转换的指令,解析dex文件中的相应指令 转换为这里的一个中间指令
这里是中间指令 转为jvm中的指令,里面都有accept方法
这里用来把解析的dex转换,用到Asm
这里是dex文件解析之后转换为中间指令IR文件用到的visitor,前面的visitor是访问dex文件的。
大概的类就上面这么多,画这个图主要是了解各个类之间的关系,要不然后面会有点糊涂。
作者:new_abc 来源:CSDN 原文:https://blog.csdn.net/new_abc/article/details/53736240
http://www.taodudu.cc/news/show-2015147.html
相关文章:
- dex2jar和jd-GUI的下载安装与使用
- java实现dex转jar_dex转jar工具
- Android反编译apktool,dex2jar和jd-gui的使用和一键反编译查看apk
- dex2jar的使用
- Andorid中的dex文件使用dex2jar工具反编译
- dex2jar工具及问题
- dex2jar 和 jd-gui
- android 反编译 dex2jar,Android反编译教程:apktool,dex2jar的使用
- dex2java_dex2jar 使用方法 | 学步园
- dex2jar java 1.8_dex2jar最新版下载-dex2jar下载 2.0官方版--pc6下载站
- dex2jar java 1.8_利用 dex2jar 反编译 dex文件
- dex2jar java 1.8_dex2jar v2.1 最新版本打包
- dex2jar android,dex2jar
- android逆向工程dex2jar使用
- Android逆向分析之dex2jar异常处理的几种情况
- dex2jar 和 jd-gui 的安装与使用
- android安卓字体下载,安卓Android简中综艺手机字体
- WPF自定义字体
- 原生android字体,不用Root,国产安卓手机如何把字体切换成安卓原生字体
- java获取系统所有字体_java获取本机所有可用字体
- kindle字体设置
- 思源黑体(魅族)、方正兰亭(小米)、冬青黑体(锤子)比较
- windows自带黑体_window自带字体
- PPT的字体
- 字体的基础知识:中文字体区分练习
- linux艺术字体,Linux字体美化实战(Fontconfig配置)
- 兰亭字体linux版本,两种方法,让最新版 Windows 10 的字体更「养眼」
- php barcode设置黑条宽度,打印机字体的安装问题 BarCode Pro 6.0修改线条宽度 BarCode pro打EAN13条形码...
- 小米兰亭pro ttf_小米10Pro使用体验(三)
- 小米兰亭字体_下载
dex2jar源码解析之总体介绍(一)相关推荐
- jsoncpp库常用源码解析及使用介绍(二)
上一节介绍了jsoncpp库的下载及编译方式,中Value类中最基础的一部分功能的源码,包括Value的构造形式.重载"=".">"."< ...
- dex2jar源码解析----解析dex文件一
Dex2jar命令在Dex2jarCmd.java文件中 public static void main(String... args) {new Dex2jarCmd().doMain(args); ...
- Spring源码拜读之总体介绍
核心模块 spring-core:依赖注入IOC与DI的最基本实现 spring-beans:Bean工厂于Bean的装配 spring-context:IOC容器 spring-aop:面向切面编程 ...
- dex2jar源码解析----dex转smail
我们以BaksmaliTest为例,查看一下Dex转smail的流程 public class BaksmaliTest {@Testpublic void t() throws Exception ...
- 【移动开发】Checkout开源库源码解析
Checkout开源库的源码解析 1.功能介绍 1.1Checkout是什么 Checkout是Android In-App Billing API(v3 +)的一个封装库.In-App Billin ...
- 每天一个Lodash源码解析
每天一个Lodash源码解析 chunk() 方法介绍 自我实现 源码分析 代码对比 知识点补充 浮点数转化为浮点数 数组创建方法区别 js中切割数组方法 slice() 方法介绍 自我实现 源码分析 ...
- Tomcat8源码解析
Tomcat8源码解析 Tomcat总体架构 Connector:开启Socket并监听客户端请求,返回响应数据: Container:负责具体的请求处理: 一个Service负责维护多个Connec ...
- [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构
[源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 文章目录 [源码解析] 机器学习参数服务器 Paracel (1)-----总体架构 0x00 摘要 0x01使用 1.1 ...
- Tomcat源码解析系列二:Tomcat总体架构
Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载serv ...
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
转载自 Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 第1部分 ArrayList介绍 ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组.与 ...
最新文章
- 2021年大数据Spark(四十九):Structured Streaming 整合 Kafka
- 可租赁、可定制的虚拟人居然还能这么玩?9月25日来百度大脑人像特效专场一探究竟!...
- 单摄像头+深度学习实现伪激光雷达,代码已开源
- List for game to play latter
- NLP深度学习:基于TensorFlow实现Skip-Gram模型
- 应用系统怎么开启审计功能_win10系统开启分屏功能的设置方法
- 基于Blink构建亲听项目以及全链路debug项目实时响应能力
- (62)Verilog HDL模块例化system Verilog模块
- php 二维数组根据键值合并二维数组_3分钟短文 | PHP 根据值移除数组元素,哪个方法最简单?...
- typescript + react 项目开发体验之起手式
- 三种图象处理的效率比较,用指针法最快
- linux读用户密码,linux用户/用户密码和用户组管理
- 深度可分离卷积组卷积
- 软件耦合的分类及解决方法
- Python 最强 IDE 详细使用指南!
- 基于Android的家校互动系统app
- 手写Vuex核心原理,再也不怕面试官问我Vuex原理
- 超级解霸害死人——安装evc过程种出现“没有文件扩展.vbs的脚本引擎”的问题...
- 企业如何实现IoT物联网远程控制
- 传智_Springmvc+Mybatis由浅入深全套视频教程(燕青)-mybatis笔记(两天)(2017年8月5日16:09:55)