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

简介: 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运行时环境

1.png

Android系统启动加载完成内核后,第一个执行的是init进程,init进程首要做的是设备初始化工作,然后读取inic.rc文件并启动系统中的重要的外部程序Zygote

Zygote是所有进程的孵化器,它启动会初始化Dalvik虚拟机,然后启动system_server并进入Zygote模式,通过socket等候命令,当执行一个Android应用程序时,system_server

进程通过socket方式发送命令给Zygote,Zygote收到命令后通过fork自身创建一个Dalvik虚拟机的实例来执行应用程序的入口函数,这样程序启动完成,流程图如下

2.png

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.png

3.png

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


JIT(既时编译),又为动态编译,是一种通过运行时将字节码编译为机器猫的技术,让程序执行更快Android2.2以上

JIT包含2两字节码编译方式

1、method方式:以函数或方法为单位进行编译

2、trace方式:以trace为单位进行编译

trace方式解释:函数的有些路径在实际运行过程中很少被执行的,这部分代码为“冷路径”,而执行比较频繁的路径为“热路径”传统的method方式会编译整个方法的代码,这

会在“冷路径”上浪费很多编译世家,消耗内存,trace方式能快速获取“热路径”,更短时间和内存编译代码。


相关文章
|
2月前
|
开发工具 Android开发 iOS开发
Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
本文旨在深入探讨Android与iOS两大移动操作系统在技术架构、开发环境及市场表现上的核心差异,为开发者和技术爱好者提供全面的视角。通过对比分析,揭示两者如何塑造了当今多样化的移动应用生态,并对未来发展趋势进行了展望。 ####
|
2月前
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
119 21
|
2月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
2月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
3月前
|
安全 Linux Android开发
深入探索Android与iOS的系统架构:一场技术较量
在当今数字化时代,智能手机操作系统的选择成为了用户和开发者关注的焦点。本文将深入探讨Android与iOS两大主流操作系统的系统架构,分析它们各自的优势与局限性,并对比两者在用户体验、开发生态和安全性方面的差异。通过本文的技术剖析,读者将对这两个平台的核心技术有更深入的理解。
|
3月前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
3月前
|
安全 Android开发 iOS开发
深入探索Android与iOS的差异:从系统架构到用户体验
在当今的智能手机市场中,Android和iOS无疑是最受欢迎的两大操作系统。本文旨在探讨这两个平台之间的主要差异,包括它们的系统架构、开发环境、安全性、以及用户体验等方面。通过对比分析,我们可以更好地理解为何不同的用户群体可能会偏好其中一个平台,以及这些偏好背后的技术原因。
|
3月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
84 0
|
3月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
3月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS的系统架构差异
本文旨在通过对比分析Android和iOS两大移动操作系统的系统架构,揭示它们在设计理念、安全性、应用生态及开发环境等方面的显著差异。我们将从底层架构出发,逐步剖析至用户界面层面,为开发者和科技爱好者提供一份详尽的技术参考。
75 1

热门文章

最新文章

  • 1
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    24
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    33
  • 3
    Android历史版本与APK文件结构
    121
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    29
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    23
  • 6
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    57
  • 7
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 8
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
    73
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    118
  • 10
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
    29