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


相关文章
|
4月前
|
安全 Android开发 iOS开发
深入探索Android与iOS的差异:从系统架构到用户体验
在当今的智能手机市场中,Android和iOS无疑是最受欢迎的两大操作系统。本文旨在探讨这两个平台之间的主要差异,包括它们的系统架构、开发环境、安全性、以及用户体验等方面。通过对比分析,我们可以更好地理解为何不同的用户群体可能会偏好其中一个平台,以及这些偏好背后的技术原因。
|
4月前
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
19天前
|
Android开发 开发者 Kotlin
Android实战经验之Kotlin中快速实现MVI架构
MVI架构通过单向数据流和不可变状态,提供了一种清晰、可预测的状态管理方式。在Kotlin中实现MVI架构,不仅提高了代码的可维护性和可测试性,还能更好地应对复杂的UI交互和状态管理。通过本文的介绍,希望开发者能够掌握MVI架构的核心思想,并在实际项目中灵活应用。
43 8
|
25天前
|
算法 安全 Java
即时通讯安全篇(一):正确地理解和使用Android端加密算法
本文主要讨论针对Android这样的移动端应用开发时,如何正确的理解目前常用的加密算法,为诸如即时通讯应用的实战开发,如何在合适的场景下选择适合的算法,提供一些参考。
42 0
|
3月前
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
136 21
|
3月前
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。
|
3月前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
3月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
4月前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
4月前
|
Java Linux Android开发
深入探索Android系统架构:从Linux内核到应用层
本文将带领读者深入了解Android操作系统的复杂架构,从其基于Linux的内核到丰富多彩的应用层。我们将探讨Android的各个关键组件,包括硬件抽象层(HAL)、运行时环境、以及核心库等,揭示它们如何协同工作以支持广泛的设备和应用。通过本文,您将对Android系统的工作原理有一个全面的认识,理解其如何平衡开放性与安全性,以及如何在多样化的设备上提供一致的用户体验。

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 5
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 6
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 7
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 10
    【Android Git】Git版本回退方式