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关系…

.net 测试工具类

fluentassertions QuickStart (替换Assert )https://github.com/dennisdoomen/fluentassertions/wiki Moq QuickStarthttps://github.com/Moq/moq4/wiki/Quickstart转载于:https://www.cnblogs.com/peteryu007/p/4081265.html

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

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

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

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

OPENSSL ENGINE机制

1. 概念 OpenSSL项目是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSL v2/v3)和传输层的安全性…

mongoDB的副本机制

主机192.168.99.80[rootmaster ~]# grep -v "^#" /etc/mongod.conf | grep -v "^$" bind_ip 192.168.99.80 fork true pidfilepath /var/run/mongodb/mongod.pid logpath /var/log/mongodb/mongod.log unixSocketPrefix /var/run/mongodb dbpath /mo…

文件系统一些概念【更新完毕】

煮酒品茶:文章大多摘自《分布式文件系统研究》《构建高性能WEB站点》《大型网站技术架构》文件系统是操作系统的一个重要组成部分,通过对操作系统所管理的存储空间的抽象,向用户提供统一的、对象化的访问接口,屏蔽对物理设备的直接…

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

Win32NET是一个Win32API的.NET下封装的类库,包含:1: 常用win32的API的net封装2:鼠标、键盘、热键hook钩子模块,3:模拟键盘输入文字(支持各种字符文字、不同语言的文字)、模拟鼠标点击移动滚动等…

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…

Oracle数据库的备份与恢复

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。导出备件是一种逻辑备份,冷备份和热备份是物理备份。一、 导出/导入(Export/Import)…

关于Windows® API Code Pack for Microsoft® .NET Framework

相比之前的操作系统,Window 7(or Vista)提供了很多新特性,我们在应用实现中可以利用这些特性来提升用户体验。 这些特性主要包括以下几个方面: Shell EnhancementsDirectX TechnologiesApplication Restart and Recove…

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

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

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

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

Android安全与逆向之Dex动态加载

Dex动态加载是为了解决什么问题? 在Android系统中,一个App的所有代码都在一个Dex文件里面。 Dex是一个类似Jar的存储了多个Java编译字节码的归档文件。 因为Android系统使用Dalvik虚拟机,所以需要把使用Java Comp…

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()") #使…

死锁示例代码

死锁产生实例&#xff0c;两个线程两个互斥锁&#xff0c;每个线程占有一个互斥锁&#xff0c;同时想获得另一个互斥锁则会产生死锁。解决方案&#xff1a;  1.一次占有全部资源  2.每个线程占有锁的顺序是一致的。比如都是同时占有A&#xff0c;然后占有B锁。#include <…