Dalvik指令格式

一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式 标识来决定。位描述约定如下:

每16位的字采用空格分隔开来
每个字母表示四位,每个字母按顺序从高字节开始,排列到低字节。每四位之间可 能使用竖线“丨”来表示不同的内容
顺序采用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 字节组成,在这里它们表示寄存器参数
单独使用位标识还无法确定一条指令,必须通过指令格式标识来指定指令的格式编码。 它的约定如下:
指令格式标识大多由三个字符组成,前两个是数字,最后一个是字母
第一个数字是表示指令有多少个16位的字组成
第二个数字是表示指令最多使用寄存器的个数。特殊标记“r”标识使用一定范围内的寄存器
第三个字母为类型码,表示指令用到的额外数据的类型

例子:22x
第一个数字2表示指令有两个16位字组成,第二个数字2表示指令使用到2个寄存器, 第三个字母x表示没有使用到额外的数据

Dalvik指令对语法约定
每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开
每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的 参数,也可以是两个4位的参数,还可以为空,如果指令超过16位,则后面部分 依次作为参数
如果参数采用“vX”的方式表示,表明它是一个寄存器,如v0、v1等。这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器命名产生冲突,如ARM 架构寄存器命名采用I开头
如果参数采用“#+X”的方式表示,表明它是一个常量数字
如果参数采用“+X”的方式表示,表明它是一个相对指令的地址偏移
如果参数采用“[email protected]”的方式表示,表明它是一个常量池索引值。其中kind表 示常量池类型,它可以是“string”(字符串常量池索引)、“type”(类型常量池索引)、“field”(字段常量池索引)或者“meth”(方法常量池索引)

例子:op vAA, [email protected]
指令用到了 1个寄存器参数vAA,并且还附加了一个字符串常量池索引[email protected]

Android 源码 Dalvik/docs 目录下提供了一份文档 insmction-formats.html,里面详细列举了Dalvik指令的所有格式
在Android Dex文件格式(二)中有详细的指令格式解析, 通过解析Hello.dex的指令格式还原出smali代码

时间: 2024-12-14 18:06:33

Dalvik指令格式的相关文章

安卓移动逆向(三)-Android Dalvik虚拟机

大家都知道Java程序是运行在Java虚拟机上,Android程序呢? 虽然Android平台使用Java语言来开发应用程序,但是Android程序却不是运行在标准的Java虚拟机上的. Google为Android平台专门设计了一套虚拟机来运行Android程序–Dalvik Virtual Machine,也就是Dalvik虚拟机了 本篇作用: 扫盲Dalvik虚拟机 了解Smail的语法,能读懂Smail文件 Dalvik概述 Dalvik的特点(相对于JVM) 体积小,占用内存小; 专有

[转载]Dalvik指令集

这篇文章是转载的,为了便于查找一些指令,贴在这里. 转自:http://blog.csdn.net/canfengxiliu/article/details/20144119 --------------------- 声明 : 文章是看<<Android软件安全与逆向分析>>的所写笔记. Dalvik指令格式 一段Dalvik汇编代码由一系列Dalvik指令组成,指令语法由指令的位描述与指令格式标识来决定.位描述约定如下: ● 每16位的字采用空格分隔开来. ● 每个字母表示4位

【Android Dalvik虚拟机好学易用系列】之二:Dalvik汇编语言

一 Dalvik指令格式 1.1 位描述 Dalvik汇编代码由Dalvik指令组成,指令语法由指令的位描述与指令格式辨识来决定.位描述的约定如下所示: 每16位的字采用空格分隔开来: 每个字母表示四位,每个字符顺序从高字节开始,排列到低字节,每四位之间可能使用"|"来表示不同的内容. 顺序采用A~Z的单个大写字母作为一个4位操作码,op表示一个8位的操作码: "?"表示这字段所有位为0值. 举例,如以下指令: A|G|op BBBB F|E|D|C 两个空格:每个

Android Dex文件格式(二)

第三块: 数据区 索引区中的最终数据偏移以及文件头中描述的map_off偏移都指向数据区, 还包括了即将要解析的class_def_item, 这个结构非常重要,下面就开始解析 class_def_item: 这个结构由dex文件头中的classDefsSize和classDefsOff所指向, 描述Dex文件中所有类定义信息, 每一个DexClassDef中包含一个DexClassData的结构(classDataOff), 每一个DexClassData中包含了一个Class的数据, Cla

Dalvik指令分析(一) 字节码转换为smali代码

有过android应用反编译或者再打包的朋友都有使用过apktool的经验,apktool能将dex文件的 字节码转换为smali代码,这个工具是怎么做到对dex进行解析并生成smali代码的呢?这就需要对 dex文件的格式很熟悉.需要掌握dalvik指令的字节码格式,并能翻译成对应的smali代码. 我准备写一系列的文章来分析dex文件的格式.dalvik字节码的格式.以及dex to smali的方法, 基于此可以做很多的应用,比如安全扫描.应用加固等等! Dalvik指令介绍请参考官方文档

4. 如何解释dalvik字节码

如何解释dalvik字节码 文档: 在Android系统源码目录dalvik\docs有相关指令文档 dalvik-bytecode.html 实战: 来直接实战模拟来理解枯燥的理论 用IDA打开一个dex文件, 设置显示指令 随便找一段代码 注意: 206E 28DE 0050是IDA的显示问题 在文件中的存储顺序是 6E 20 DE 28 50 00 在WinHex搜索一下就知道了 上面截图的指令在文件中的排列顺序如下: 14 05 09 00 09 01 6E 20 DE 28 50 00

Chapter3——进入Android Dalvik虚拟机(二)

Dalvik汇编语言基础 Dalvik虚拟机为自己设计了一套指令集,并制定了自己的指令格式和调用规范. 位描述约定如下: 每16位的字采用空格分隔开来 每个字母表示4位,每个字母按顺序从高字节开始,排列到低字节.每4位之间可能使用竖线「|」表示不同的内容. 顺序采用A~Z的单个大写字母作为一个4位操作码,op表示一个8位的操作码. 「∅」来表示这字段所有位为0值. 以「A|G|op BBBB F|E|D|C」为例, 指令中间两个空格每个分开的部分大小为16位: 第一个16位A|G|op,高8位由

Dalvik虚拟机的代码结构

Dalvik是Android程序的运行虚拟机,代码保存在Android源码中的"dalvik/"目录下,Dalvik虚拟机各个子目录的具体说明如下: Android.mk: 是虚拟机编译的makefile文件 dalvikvm: 此目录是虚拟机命令行调用入口文件的目录,主要用来解释命令行参数,调用库函数接口等. dexdump: 此目录是生成dex文件的反编译查看工具,主要用来查看编译出来的代码文件是否正确,查看编译出来的文件结构. dexlist: 此目录是生成查看dex文件里所有类

Dalvik虚拟机片面总结

1.Dalvik 基于寄存器,而 JVM 基于栈.2.Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例3.不同于Java虚拟机运行java字节码,Dalvik虚拟机运行的是其专有的文件格式Dex,ex文件格式可以减少整体文件尺寸4.所有的Android应用的线程都对应一个Linux线程5.Dalvik负责进程隔离和线程管理,每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行.