Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)



1、Dalvik虚拟机架构和Java虚拟机的架构不同

1、Java虚拟机基于栈结构,需要频繁从栈读取或写入数据,这个过程需要更多的指令与内存访问次数,会消耗cpu时间
2、Dalvik虚拟机基于寄存器,数据访问通过寄存器直接传递,比栈方式快。

 

 public class Hello {public int foo(int a, int b) {return (a + b) * (a - b);}

 

public static void main(String[] args) {Hello hello = new Hello();System.out.println(hello.foo(5, 3));}
}


保存为Hello.java文件,打开终端执行
javac Hello.java 编译生存Hello.class文件
然后再执行 dx --dex --output=Hello.dex Hello.class 生存dex文件
javap -c -classpath .Hello 命令执行后得到下面代码:

public int foo(int, int);
Code:
 0: iload_1
 1: iload_2;
   2: iadd
   3: iload_1
   4: iload_2
   5: isub
   6: imul
   7: ireturn

 


使用dexdump.exe查看foo()函数的Dalvik字节码,执行下面命令
dexdump.exe -d Hello.dex
得到如下代码
   0000:add-int v0, v3, v4
   0002:sub-int v1, v3, v4
   0004:mul-int/2addr v0, v1
   0005:return v0
 

Java字节码分析:8个命令 8个字节,至于怎么压栈进栈就不详细讲了
Dalvik字节码分析:4条命令完成操作
代码指令减少,速度更快。

2、Dalvik虚拟机如何执行程序的


Android系统有Linux内核、函数库、Android运行时、应用程序框架和应用层组成。Dalvik虚拟机属于Android运行时环境


Android系统启动加载完成内核后,第一个执行的是init进程,init进程首要做的是设备初始化工作,然后读取inic.rc文件并启动系统中的重要的外部程序Zygote
Zygote是所有进程的孵化器,它启动会初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令,当执行一个Android应用程序时,system_server
进程通过socket方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样程序启动完成,流程图如下

Zygote提供3种创建进程的方法
1、fork(),创建一个Zygote进程
2、forkAndSpecialize()创建一个非Zygote进程
3、forSystemServer()创建一个系统服务进程
Zygote可以再fork()出其他进程,非Zygote进程不可以fork其它进程,而系统服务进程在终止后它的子进程也必须终止
当进程fork()成功之后,执行的工作就交给Dalvik虚拟机,Dalvik虚拟机首先通过loadClassfromDex()函数完成类的装载工作,每个类成功解析后会拥有一个classObject
类型的数据结构存储在运行时环境中,虚拟机使用gDvm.loadedClasses全局哈希表来存储与查询所有装载进来的类,然后字节码验证器是有那个dvmVerifyCodeFlow()函数对装入的daim进行
校验,然后虚拟机调用FindClass()函数查找并装载main方法类,随后调用dvmInterpret()函数初始化解释器并执行字节码流,过程如下


3、Dalvik虚拟机JIT(既时编译)


JIT(既时编译),又为动态编译,是一种通过运行时将字节码编译为机器猫的技术,让程序执行更快Android2.2以上
JIT包含2两字节码编译方式
1、method方式:以函数或方法为单位进行编译
2、trace方式:以trace为单位进行编译
trace方式解释:函数的有些路径在实际运行过程中很少被执行的,这部分代码为“冷路径”,而执行比较频繁的路径为“热路径”传统的method方式会编译整个方法的代码,这
会在“冷路径”上浪费很多编译世家,消耗内存,trace方式能快速获取“热路径”,更短时间和内存编译代码。

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

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

相关文章

cacti及其相关插件的安装

cacti是什么?1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用户。因此,snmp和rrdtool是cacti的关键。Snmp关系…

6张图,带你深入理解GitOps,真硬核!

大家好,我是小碗汤,今天分享一篇6张图深入理解GitOps,内容硬核,建议兄弟们收藏~在使用 K8s 的云原生应用中,Serverless,Devops 工具以及大量其他云技术。通常,基础设施代码和应用程序代码是分开…

css 字体加粗_HTML基础属性与CSS基础

有头发且有趣的码农万里挑一~ 40有料叔 | 一位有故事的程序猿1HTML基础属性1.class属性:用于定义元素的类名,如需为一个元素规定多个类,用空格分隔类名定义格式:2.name属性: 用于指定标签元素的名称。Name属性的值可以…

linux之如何快速在文本里面写入内容

一、创建文件 touch file 二、写入内容 echo "hello word">>file 图片举例 还有 echo "hello">file 是把之前的内容覆盖,然后内容只有hello 如图: 最后: 无论是echo "hello">file 还是 echo&quo…

css实战手册第四版 pdf_你真的了解CSS继承吗?看完必跪

也许你瞧不起以前的 css ,但是你不该再轻视眼下的 css 。近年来 css 的变量系统已逐步得到各大浏览器厂商支持,自定义选择器等强势袭来,嵌套系统/模块系统也在路上...为了更好的掌握 css 这门语言,很有必要把之前零零散散的 css 知…

hibernate级联操作详解

2019独角兽企业重金招聘Python工程师标准>>> 级联操作 一.简单的介绍 cascade和inverse (Employee – Department) l Casade用来说明当对主对象进行某种操作时是否对其关联的从对象也作类似的操作,常用的cascade: none,all,save-update,delete, lock,ref…

出门就背他了!可伸缩的背包,自由变大变小,还有防盗功能!

▲ 点击查看出门能不背包就不背包,几乎是小爆身边每个男生的人生信条。不背包时,两手空空一身轻,潇洒有型。但一旦到了必须背包,比如五一外出回家或旅游的时候,男同胞们翻箱倒柜找出来的背包,大多都是这种双…

C#实现网页加载后将页面截取成长图片 | Playwright版

前言如何将网页生成预览图?要实现这个功能,可以用WebBrowser组件模拟浏览器,或者使用系统浏览器访问网页,再进行截图操作。但是,这样需要编写大量的控制代码。工欲善其事,必先利其器!利用Playwr…

python链接mysql报错2003_Python连接Mysql报错问题解决

import MySQLdb #打开数据库 db MySQLdb.connect("127.0.0.1","root","123456","testdb",3306) #使用corsor()方法获取操作游标 cursor db.cursor() #使用execute方法执行SQL语句 cursor.execute("SELECT VERSION()") #使…

nodejs项目_多人群聊实现其实很简单:Nodejs+WebSocket+Vue轻松实现Web IM

点击右上方红色按钮关注“web秀”,让你真正秀起来前言在《Nodejs WebSocket简单介绍及示例 - 第一章》中简单的介绍了,Nodejs WebSocket的使用方法及作用,今天就用它来搭建一个简单的聊天室功能。1、NodejsWebSocket创建后台服务器功能 2、…

交友软件上的两种网友类型......

1 轻轻松松月入五千的方法(素材来源网络,侵删)▼2 像极了期末复习的你(via.段子楼,侵删)▼3 听说你想要中国的熊猫▼4 听说学校附近有野人出没(素材来源网络,侵删)▼5…

解读最新的 Xamarin 更新

微软中国MSDN 点击上方蓝字关注我们Good news——Visual Studio 2022 包括了 Xamarin 对 Android 12和苹果最新的 Xcode 13 版本下的 iOS、iPadOS、macOS 和 tvOS 的支持,以及适用于支持它们的最新 Xamarin.Forms 版本。让我们一起来了解下最新 Xamarin版本&#x…

原来医生的处方不是随便乱写的...

1 奇奇怪怪的知识又增加了(素材来源网络,侵删)▼2 像极了早上刚睡醒炸毛的你▼3 原来医生的处方不是瞎写的▼4 当爷爷不当孙子(素材来源网络,侵删)▼5 40厘米的身高差(素材来源网络&#xf…

Android之解决Gigaset手机不能设置DeviceOwner权限提示already provisioned问题

客户那里有Gigaset手机,安装我们的产品需要注入DeviceOwner,但是刚恢复默认出厂的Gigaset手机很奇葩,注入权限的提示下面错误,导致不能使用我们的产品 设置DeviceOwner权限是有限制的,需要手机账号(acount)为0 1 我们用命令查看手机的帐号 adb shell dumpsys account …

收集网络状态(Ping),并用邮件通知管理员

在没有第三方工具对网络进行监控的话,要检查网络中某台主机,或是某个IP地址通讯是否正常,我们通常用手动PING来进行测试。有了PowerShell,我们可以用他定时Ping网络上的几个IP地址,然后把ping的个延时时间用邮件通知给…

sql 某列数据全部为0则不显示该列_数据产品经理养成记(五):汇总分析

学会了如何查找数据后,接下来就要对数据进行分析处理,比如求和、平均值、加总等等。这些对数据的加工处理通过汇总函数来实现。汇总函数在之前的两篇文章中都有涉及,这里采用概念--案例--总结的方式,集中介绍一下。1.什么是汇总函…

vim学习日志(5):vim下wimrc的配置,解决中文乱码问题

解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: set fileencodingsutf-8,ucs-bom,gb18030,gbk,gb2312,cp936 set termencodingutf-8 set enco…