Android软件安全与逆向分析之Dalvik

注意点

首先,让我们来思考下面几个问题:

什么是Dalvik虚拟机?

Dalvik VM与JVM有什么区别?

Dalvik VM有什么新的特点?

Dalvik VM的架构是怎么样的?

首先,我得承认第一个问题问得很傻:什么是Dalvik虚拟机?没有人给出过一个明确的定义,但是,我们似乎可以从人们对Java虚拟机的描述中得到些信息。

Java虚拟机(JVM)是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。它有自己完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统。使用“Java虚拟机”程序就是为了支持与操作系统无关、在任何系统中都可以运行的程序。

因此,我们不妨对Dalvik虚拟机作出这样的描述:

Dalvik虚拟机是Android程序的虚拟机,是Android中Java程序的运行基础。其指令集基于寄存器架构,执行其特有的文件格式——dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。它的核心内容是实现库(libdvm.so),大体由C语言实现。依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。

与Dalvik虚拟机关系最密切的非JVM莫属,在Android源码readme文档中有这样一段话:Much of the code under this directory originally came from the Apache Harmony project, and as such contains the standard Apache header comment. Some of the code was written originally for the Android project…

Dalvik VM与Apache Harmony 项目关系源远流长,因此,与JVM关系自然就密切了。

然而:Dalvik VM ≠Java VM

dalvik基于寄存器,而JVM基于stack

Dalvik执行的是特有的DEX文件格式,而JVM运行的是*.class文件格式。

优势:1、在编译时提前优化代码而不是等到运行时

    2、 虚拟机很小,使用的空间也小;被设计来满足可高效运行多种虚拟机实例。

3、常量池已被修改为只使用32位的索引,以 简化解释器

JVM的字节码主要是零地址形式的,概念上说JVM是基于栈的架构。Google Android平台上的应用程序的主要开发语言是Java,通过其中的Dalvik VM来运行Java程序。为了能正确实现语义,Dalvik VM的许多设计都考虑到与JVM的兼容性;但它却采用了基于寄存器的架构,其字节码主要是二地址/三地址的混合形式。

基于栈与基于寄存器的架构,谁更快?现在实际的处理器,大多都是基于寄存器的架构,从侧面反映出基于寄存器比基于栈的架构更与实际的处理器接近。但对于VM来说,源架构的求值栈或者寄存器都可能是用实际机器的内存来模拟的,所以性能特性与实际硬件又有不同。一般认为基于寄存器架构的Dalvik VM比基于栈架构JVM执行效率更高,原因是:虽然零地址指令更紧凑,但完成操作需要更多的load/store指令,也意味着更多的指令分派(instruction dispatch)次数与内存访问次数;访问内存是执行速度的一个重要瓶颈,二地址或三地址指令虽然每条指令占的空间较多,但总体来说可以用更少的指令完成操作,指令分派与内存访问次数都较少。

转载于:https://www.cnblogs.com/Tesi1a/p/7624131.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/398339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在java中实现日期类型和字符串类型的转换大全(Date String Timestamp Datetime)

用Timestamp来记录日期时间还是很方便的,但有时候显示的时候是不需要小数位后面的毫秒的,这样就需要在转换为String时重新定义格式。 Date、String、Timestamp之间的转换! [java] view plaincopyprint? public static void main(String[] ar…

c++ 多个线程操作socket要同步吗_基础知识深化:NIO优化原理和Tomcat线程模型

1、I/O阻塞书上说BIO、NIO等都属于I/O模型,但是I/O模型这个范围有点含糊,我为此走了不少弯路。我们日常开发过程中涉及到NIO模型应用,如Tomcat、Netty中等线程模型,可以直接将其视为 网络I/O模型 。本文还是在基础篇章中介绍几种I…

Http中的同步请求和异步请求

最近在上springmvc的JSON数据交换的时候,老师下课提了一个课后问题:什么是异步请求?什么是同步请求?我想大部分同学听到这个问题的时候应该和我一样不知所云。现在,给大家分享一篇关于同步请求和异步请求的小知识。举个…

Linux常用命令汇总--ln

1.功能:将一个文件或者文件夹链接到另外一个文件或者文件夹上。链接分为硬链接和软链接,硬链接可以看做是一个文件具有多个访问的入口,软链接可以看成是快捷方式。2.用法:ln [选项] 源文件或目录 目标文件或目录3.参数&#xff1a…

用同一uuid作为两个字段的值_这两个小技巧,让SQL语句不仅躲了坑,还提升了 1000 倍...

作者:帅地个人简介:一个热爱编程的在校生,我的世界不只有coding,还有writing。目前维护订阅号「苦逼的码农」,专注于写「算法与数据结构」,「Java」,「计算机网络」。本次来讲解与 SQL 查询有关的两个小知识…

vue动态绑定类样式ClassName知多少

对于动态绑定类样式,之前用的最多的也就是:class"{classA:true}" ,今天遇到一种情况,就是要给元素动态添加一个保存在数据源中的类样式,那前边的这种写法显然满足不了。 想起之前微信小程序中动态添加类样式…

C#深入浅出 关键字(一)

1.thisthis关键字用于指示当前对象“自己”,来看一个例子,了解什么时候需要用thisclass Star{String name;int age;public void SetInfo(string name,int age){name name;//注意此处的赋值age age;//}public void Show(){Console.WriteLine(name"…

利用platform库获取浏览器和操作系统版本

原生方法检测 网站获取用户的浏览器和操作系统版本是一个很常见的需求,但是细说起来这个功能的实现并不简单。一般情况下有两种思路。 一是利用用户代理UserAgent来判断浏览器和OS的版本,因为各个平台和浏览器的UA都不一样。但是这种方法存在一个局限性&…

linux桌面lxde 安装_观点|最新精简型 Linux 桌面环境大比拼:LXDE Vs. Xfce Vs. MATE

对于相当一部分 Linux 用户而言,性能永远是其追求的终极目标。无论他们使用的计算机已经太过陈旧,需要尽量发掘其中的有限潜能,还是希望凭借手中崭新的高性能系统承载全部高强度任务负载,让一切保持简洁。这些都是实现性能保障的重…

Android SQLite详解

在项目开发中,我们或多或少都会用到数据库。在Android中,我们一般使用SQLite,因为Android在android.database.sqlite包封装了很多SQLite操作的API。我自己写了一个Demo来总结SQLite的使用,托管在Github上,大家可以点击…

Catalan数的理解

Catalan数的理解 f(0)1f(1)1f(2)2f(3)5f(4)14f(5)42f(2)f(1)f(1)f(3)f(2)f(1)*f(1)*f(2)f(4)f(3)f(2)*f(1)f(1)*f(2)f(3)通项公式:f(n) f(n-1) f(n-2)f(1) f(n-3)f(2) ... f(1)f(n-2) f(n-1) 理解:固定一个,n-1个全在左边,n-…

Type interface mapper.UserMapper is not known to the MapperRegistry

Type interface mapper.UserMapper is not known to the MapperRegistry. 报错:Type interface mapper.UserMapper is not known to the MapperRegistry. 解决:已经解决;请查看mapper是否配置正确,我下面就配置错误了。 解决效果…

我看objective-C --不要把objC当做c/c++的超集

--不要把objC当做c/c的超集 我承认看objective-C的时间不是很长,连apple官网的objCpdf都没看完。 但是我已经感觉到很多介绍objC文章都说过的一句话是在误导初学者。那句话 就是objective-C是 c/c语言的超集。 我们在学与c/c相关的语言的时候很自然的想到java、c#这…

微信整人假红包图片_警惕:千万别点!这些红包是假的

春节将至,又到了“考验手速”的时候。近年春节,“抢红包”为大家带来了“新年味”与许多快乐。但是,有些不法分子却从中捣乱,制造了一些假红包企图骗取钱财。如何辨别“假红包”?这里总结了几种“假红包”类型&#xf…

SQL Server中SCAN 和SEEK的区别

SQL Server中SCAN 和SEEK的区别 SQL SERVER使用扫描(scan)和查找(seek)这两种算法从数据表和索引中读取数据。这两种算法构成了查询的基础,几乎无处不在。Scan会扫描并且返回整个表或整个索引。 而seek则更有效率&…

HDU 2897 (博弈 找规律) 邂逅明下

根据博弈论的两条规则&#xff1a; 一个状态是必胜状态当且仅当有一个后继是必败状态一个状态是必败状态当且仅当所有后继都是必胜状态然后很容易发现从1开始&#xff0c;前p个状态是必败状态&#xff0c;后面q个状态是必胜状态&#xff0c;然后循环往复。 1 #include <cstd…

C# 设置Excel打印选项及打印excel文档

C# 设置Excel打印选项及打印excel文档 打印Excel文档是一个很常见的操作&#xff0c;但有时候我们会碰到各种不同的打印需求&#xff0c;例如只打印一个Excel工作表的其中一部分&#xff0c;或打印时每页都有表头&#xff0c;或把工作表中超出1页所有内容打印到1页上等等&#…

tp5框架原理详解_笔记:TP5框架完整学习笔记

安装配置官网下载TP5完整版(初学者学习用的)解压到本地的开发环境phpstudy中&#xff0c;默认的入口文件是public&#xff0c;访问public会看到TP5成功页面。目录介绍一般开发中&#xff0c;代码都是写在application这个文件夹中开发一个项目的时候&#xff0c;通常分为前台和后…

mustache 模板使用

//一 ,基本使用 <!DOCTYPE html><html ng-app"myApp"><head lang"en"> <meta charset"UTF-8"> <title></title> <script src"jquery-1.10.2.min.js"></script> <script src"…

Sphinx编译docs文档

在使用Python、Django的过程中&#xff0c;经常看到docs目录&#xff0c;里面存放着一些txt文本文件&#xff0c;也就是自带的一些帮助文档&#xff0c;里面有make.bat&#xff0c;在dos目录下直接执行make&#xff0c;给出的帮助是可以转换成Html、PDF等文件形式&#xff0c;那…