发新帖

入门Dalvik 虚拟机!!!

[复制链接]
9677 4
本帖最后由 Amanda小黑 于 2016-3-9 15:49 编辑

Dalvik 虚拟机概述
Google 于 2007 年底正式发布了 Android SDK, Dalvik 虚拟机也第一次进入了我们的视野。
它的作者是丹·伯恩斯坦(Dan  Bornstein) ,名字来源于他的祖先曾经居住过的名叫 Dalvik
的小渔村。Dalvik 虚拟机作为 Android 平台的核心组件,拥有如下几个特点:
1)  体积小,占用内存空间小;
2)  专用的 DEX 可执行文件格式,体积更小,执行速度更快;
3)  常量池采用 32 位索引值,寻址类方法名,字段名,常量更快;
4)  基于寄存器架构,并拥有一套完整的指令系统;
5)  提供了对象生命周期管理、 堆栈管理、 线程管理、 安全和异常管理以及垃圾回收等
重要功能;
6)  所有的 Android 程序都运行在 Android 系统进程里,每个进程对应着一个 Dalvik 虚
拟机实例。


Dalvik 虚拟机与 Java 虚拟机的区别
Dalvik 虚拟机与传统的 Java 虚拟机有着许多不同点, 两者并不兼容, 它们显著的不同点
主要表现在以下几个方面:
1)  Java 虚拟机运行的是 Java 字节码,Dalvik 虚拟机运行的是 Dalvik 字节码;
2)  Dalvik 可执行文件体积更小;
3)  Java 虚拟机基于栈架构,Dalvik 虚拟机基于寄存器架构。


Smali 概述
我们都知道, Dalvik 虚拟机 (Dalvik VM) 是 Google 专门为 Android 平台设计的一套虚拟
机。区别于标准 Java 虚拟机 JVM 的 class 文件格式,Dalvik  VM 拥有专属的 DEX 可执行文件
格式和指令集代码。smali 和 baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器,反
汇编后 DEX 文件会产生.smali 后缀的代码文件,smali 代码拥有特定的格式与语法,smali 语
言是对 Dalvik 虚拟机字节码的一种解释。

Smali 语言起初是由一个名叫 JesusFreke 的 hacker 对 Dalvik 字节码的翻译,并非一种官
方标准语言,因为 Dalvik 虚拟机名字来源于冰岛一个小渔村的名字,JesusFreke 便把 smali
和 baksmali 取自了冰岛语中的 “汇编器” 和 “反编器” 。 目前 Smali 是在 Google Code 上的一
个开源项目。

虽然主流的 DEX 可执行文件反汇编工具不少,如 Dedexer、IDA  Pro 和 dex2jar+jd-gui,
但 Smali 提供反汇编功能的同时, 也提供了打包反汇编代码重新生成 dex 的功能, 因此 Smali
被广泛地用于 APP 广告注入、汉化和破解,ROM 定制等方面。


APK 组成
———————————————————————————————————————
|-- HelloWorld/
|-- AndroidManifest.xml    被编译成二进制的配置文件
|-- class.dex               Android 可执行文件
|-- resources.arsc          被编译成二进制的主资源文件
|-- assets/                  不需编译的原始资源文件目录
|-- res/                     资源文件目录
|-- lib/                     库文件目录
|-- META-INF/               APK 的签名信息
———————————————————————————————————————



Dalvik 虚拟机字节码的类型、方法和字段的表示方法

Dalvik 字节码有两种类型,基本类型和引用类型。对象和数组是引用类型,其它都是基
本类型。

每个 Dalvik 寄存器都是 32 位大小, 对于小于或者等于 32 位长度的类型来说, 一个寄存
器就可以存放该类型的值, 而像 J、 D 等 64 位的类型, 它们的值是使用相邻两个寄存器来存
储的,如 v0 与 v1、v3 与 v4 等。
Java 中的对象在 smali 中以 Lpackage/name/ObjectName;的形式表示。前面的 L 表示
这是一个对象类型,package/name/表示该对象所在的包,ObjectName 是对象的名字,“;”
表示对象名称的结束。 相当于 java 中的 package.name.ObjectName。 例  如: Ljava/lang /String;
相当于 java.lang.String。
“[”类型可以表示所有基本类型的数组。[I 表示一个整型一维数组,相当于 java 中的
int[]。对于多维数组,只要增加[就行了,[[I 相当于 int[][],[[[I 相当于 int[][][]。注意每一维
的最多 255 个。对象数组的表示:[Ljava/lang /String;表示一个 String 对象数组。


方   法
方法调用的表示格式:Lpackage/name/ObjectName;->MethodName(III)Z。
Lpackage/name/ObjectName;表示类型,MethodName 是方法名,III 为参数(在此是 3 个整
型参数) ,Z 是返回类型(bool 型) 。函数的参数是一个接一个的,中间没有隔开。
一个更复杂的例子:method(I[[IILjava/lang /String;[Ljava/lang /Object;)Ljava/lang /String;
在 java 中则为:String method(int, int[][], int, String, Object[])

字     段
字段,即 java 中类的成员变量,表示格式:
Lpackage/name/ObjectName;->FieldName:Ljava/lang/String;  即包名, 字段名
和字段类型,字段名与字段类型是以冒号“:”分隔。




以上内容均来自互联网,楼主只负责收集和整理,希望对你们有帮助!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

举报 使用道具

回复

精彩评论4

只此而过    发表于 2016-3-9 18:27:08 | 显示全部楼层
谢谢分享。

举报 使用道具

回复
A00    发表于 2016-3-9 21:21:36 | 显示全部楼层
感谢楼主分享

举报 使用道具

回复 支持 反对
七少月    发表于 2016-3-10 22:53:44 | 显示全部楼层
谢谢分享,不过这些都是理论,也都是可以查到的,再接再厉

点评

少月哥  详情 回复 发表于 2016-3-11 06:42

举报 使用道具

回复 支持 反对
Amanda小黑    发表于 2016-3-11 06:42:17 | 显示全部楼层
七少月 发表于 2016-3-10 22:53
谢谢分享,不过这些都是理论,也都是可以查到的,再接再厉

少月哥

举报 使用道具

回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表