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

6E 20 81 29 04 00

6E 30 83 29 34 07

.....

我们分别对如上3个条指令做解释

1. 14 05 09 00 09 01

14 为操作码 (opcode) 去文档查询

3li表示 

第1个数字3表示指令由3个16位字组成

第2个数字1表示该条指令使用到1个寄存器

第3个字母i表示后面有一个32位立即数

所以我们可以知道,这条指令一共有6个字节 其中4个字节是立即数

此时你肯定有疑问i哪里来的?

助记符 位大小 说 明
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 无额外数据

没错文档中后面的字母就可以查询上表的助记符

那么指令格式又如何约定呢?  instruction-formats.html

指令格式为: const VAA, #+BBBBBBBB

那么现在, 嗯! 又有一些很操蛋的约定了

● 每16位的字采用空格分隔开来。

● 每个字母表示4位,每个字母按顺序从高字节开始,排列到低字节。每4位之间可能使用竖线 “|” 来表示不同的内容。

● 顺序采用 A ~ Z 的单个大写字幕作为一个4位的操作码,op表示一个8位的操作码。

● “Φ” 来表示这字段所有位为0值

● 每条指令从操作码开始,后面紧跟参数,参数个数不定,每个参数之间采用逗号分开。

● 每条指令的参数从指令第一部分开始,op位于低8位,高8位可以是一个8位的参数,

也可以是两个4位的参数,还可以为空,如果指令超过16位,则后面部       分一次作为参数

● 如果参数采用 “vX” 的方式表示,表示它是一个寄存器,如v0、v1等。

这里采用v而不用r是为了避免与基于该虚拟机架构本身的寄存器名字产生冲突,如ARM架构寄存器命名采用r开头。

● 如果参数采用 “#+X” 的方式表示,表明它是一个常量数字。

● 如果参数采用 “+X” 的方式表示,表明它是一个相对指令的地址偏移。

● 如果参数采用 “[email protected]” 的方式表示,表明它是一个常量池的索引值。其中kind表示常量池类型,它可以是

“string” 字符串常量池索引

“type”   类型常量池索引

“field    字段常量池索引

“meth”  方法常量池索引

那么对于上面的指令 const VAA, #+BBBBBBBB

const                   op操作码

VAA                     8位来描述这个寄存器

#+BBBBBBBB      常量数值

于是有


14


05


09 00 09 01


op


寄存器下标


立即数


const


V5


0x01090009

最后翻译出指令 const V5, 0x01090009

2 .6E 30 83 29 34 07

同样的方法:

拿着6E查询dalvik-bytecode.html得到如下信息

指令格式下标为35c,拿着指令下表查询instruction-formats.html得到

对于6E 30 83 29 34 07

op = 6E

A   = 3

B   = 0

CCCC = 83 29

D = 4

E = 3

F = 7

G = 0

于是翻译成指令有

invoke-virtual {v4, v3, v7} [email protected]

来自为知笔记(Wiz)

时间: 2024-12-23 10:21:10

4. 如何解释dalvik字节码的相关文章

APK、Dalvik字节码和smali文件

     这部分涉及的内容比较多,我会尽量从最基础开始说起,但需要读者一定的android开发基础.但注意可能讲解详细得令人作呕,请根据个人理解程度斟酌. APK.Dalvik字节码和smali文件 APK文件 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版本): Where's My Water.zip\ asset\            

Android逆向基础----Dalvik字节码

参考此微博,更多详细内容可以到这里查看 http://blog.csdn.net/dd864140130/article/details/52076515 Dalvik字节码 1.寄存器位32位,64位数据(double)用两个相邻的32寄存器表示. 2.两种类型:基本类型和引用类型(对象和数组) 全限定名是什么? 以String为例,其完整名称是Java.lang.String,那么其全限定名就是java/lang/String;,即java.lang.String的"."用&quo

Dalvik字节码的类型,方法与字段表示方法

Dalvik字节码有着自己的类型,方法与字段表示方法,这些方法与Dalvik虚拟机指令集一起组成了一条条的Dalvik汇编代码. 1.类型 Dalvik字节码只有两种类型,基本类型与引用类型.Dalvik使用这两种类型来表示Java语言的全部类型,除了对象与数组属于引用类型外,其他的Java类型都是基本类型.BakSmali严格遵守DEX文件格式中的类型描述符定义.类型描述符对照如下表 语法 含义 V void,只用于返回类型 Z boolean B byte S short C char I

dalvik字节码问答

参考资料 https://source.android.com/devices/tech/dalvik/dalvik-bytecode.html https://source.android.com/devices/tech/dalvik/instruction-formats.html http://www.milk.com/kodebase/dalvik-docs-mirror/docs/dalvik-bytecode.html 什么是Dalvik字节码? dalvik 的虚拟机指令代码.d

安卓逆向学习---初始APK、Dalvik字节码以及Smali

参考链接:https://www.52pojie.cn/thread-395689-1-1.html res目录下资源文件在编译时会自动生成索引文件(R.java ), asset目录下的资源文件无需生成索引. 一般来说:使用C++游戏引擎的资源文件放在asset下 java开发中除音频和视频资源(放在raw或asset下),均放在res下. Dalvik字节码是什么? Dalvik是Google专门为Android设计的一个虚拟机. Dalvik VM是基于寄存器的,而JVM是基于栈的,Dal

【分析】dalvik虚拟机解释执行字节码

参考源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. dvmInterpret函数中调用了dvmInterpretPortable函数对方法的字节码进行解释执行,dvmInterpret在dalvik/vm/interp/Interp.cpp文件中. dvmInterpretPortable函数在dalvik/vm/mterp/out/InterpC-portable.cpp文件中. 使用gcc -E -P -C InterpC-portable.cpp > Int

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

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

实例具体解释:反编译Android APK,改动字节码后再回编译成APK

本文具体介绍了怎样反编译一个未被混淆过的Android APK,改动smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk不管输入什么样的username和password都能够成功进入到第二个Activity. 有时难免要反编译一个APK.改动当中的若干关键推断点,然后再回编译成一个全新的可用的apk,这全然是可实现的. 若要完毕上述工作,须要以下工具,杂家后面会把下载链接也附上.这些软件截止本文公布时,经过杂家确认都是最新的版本号. 1.APK-Multi-Toolv

实例详解:反编译Android APK,修改字节码后再回编译成APK

本文详细介绍了如何反编译一个未被混淆过的Android APK,修改smali字节码后,再回编译成APK并更新签名,使之可正常安装.破译后的apk无论输入什么样的用户名和密码都可以成功进入到第二个Activity. 有时难免要反编译一个APK,修改其中的若干关键判断点,然后再回编译成一个全新的可用的apk,这完全是可实现的.若要完成上述工作,需要以下工具,杂家后面会把下载链接也附上.这些软件截止本文发布时,经过杂家确认都是最新的版本. 1.APK-Multi-Toolv1.0.11.zip 用它