欢迎光临
我们一直在努力

安卓逆向@Dalvik 虚拟机

Dalvik虚拟机基于寄存器架构,而非堆栈架构。通过寄存器之间直接传递,这样的方式比基于栈的方式要快得多。

实例对比:

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

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

Dalvik虚拟机如何执行程序?

我们首先要了解Android系统架构:

Dalvik虚拟机属于安卓运行时环境,与一些核心库共同承担Android应用程序的运行工作。

LoadClassFromDex() -> gDvm.LoadedClasses() -> dvmVerifyCodeFlow() -> FindClass() -> dvmInterpret()

即时编译:Method方式 和 Trace方式

Dalvik汇编基础:指令语法 = 位描述 + 指令格式标识

Dalvik在设计之初采用了ARM架构,将部分寄存器映射到了ARM基础器上,还有一部分通过调用栈进行模拟。用到的寄存器都是32位的,支持任何类型,64位类型使用两个相邻寄存器来表示。虚拟机为每个进程维护一个调用栈,这个调用栈其中一个作用就是虚拟寄存器,每个函数都在函数头部使用.registers指令指定函数用到的寄存器数目,当虚拟机执行到这个函数的时候,会根据寄存器的数目分配适当的栈空间,这些空间就是用来存放寄存器实际的值,虚拟机通过处理字节码,对寄存器进行读与写的操作,其实都是在写栈空间。

理解Dalvik字节码

z字节码只有两种类型:基本类型和引用类型,Dalvik使用这两种类型来表示Java语言的全部类型,除了对象与数组属于引用对象外,其他的Java类型都是基本类型。有自己的类型描述符对照表。

未经允许不得转载:LinuxBar.org » 安卓逆向@Dalvik 虚拟机

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

Welcome to LinuxBar.org

联系我联系我