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方式能快速获取“热路径”,更短时间和内存编译代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码莎拉蒂 .

你的鼓励是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值