首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Apk 反编译前期了解

Dalvik 虚拟机使用的指令是基于寄存器,而 Java 虚拟机则使用的指令集是基于堆栈的。(Dalvik 基于寄存器,而 JVM 基于栈。)...,每一个 Android 应用在底层都会对应一个独立的 Dalvik 虚拟机实例,其代码在虚拟机的解释下得以执行; 不同于 Java 虚拟机运行 java 字节Dalvik 虚拟机运行的是其专有的文件格式...而在 Dalvik 字节中,包含俩种类型,分别为: 基本类型 引用类型 我们常说的对象和数组便是引用类型,下面附上关于 Dalvik 字节的基本类型图: ?...而 Dalvik 字节引用类型又包含如下: 对象类型: 例如,L 代表 Java 类型中任何类,而在 Java 代码中引用格式如下: package.name.ObjectName....寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器指令寄存器(IR)和程序计数器(PC)。

1K30

Android 逆向笔记 —— 说说 Dalvik 及其指令

Dalvik 是解释执行加上 JIT,每次app运行的时候,它动态的将一部分 Dalvik 字节 解释为机器。随着 App 的运行,更多的字节被编译和缓存。...JVM 运行的是 Java 字节,而 Dalvik 运行的是 Dalvik 字节。...的确,Java 虚拟机的操作都是单字节的,其指令字总操作个数不超过 256 条。而 Dalvik 指令则长的多的多,数量也多的多。...2 表示该指令有多少个 16 位的字组成 1 表示该指令最多使用多少个寄存器 c 为类型,c 代表常量池索引 关于类型,还有很多种,如下表所示: 助记符 位数 含义 b 8 有符号立即数(字节) c...类型描述符 Dalvik 字节中只有两种类型,基本类型和引用类型。除了对象和数组以外,其他的所有 Java 类型都是基本类型。这和 JVM 的类型描述符是基本一致的。基本类型都是使用单个字母来表示。

1.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

安卓逆向系列篇:Dalvik概念&破解实例

Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节。...Smali格式是dex格式的一种直观可读形式 Smali文件可以认为是Davilk的字节文件 详见后续的Smali介绍 2、Dalvik寄存器命名法 Dalvik虚拟机参数传递方式中的规定:假设一个函数使用到...,传入参数位于p1处,传出参数位于v0处 5、dex文件反编译工具 Dalvik 虚拟机并不支持直接执行 JAVA 字节,所以会对编译生成的 .class 文件进行翻译、重构、解释、压缩等处理,这个处理过程是由...字节类型 Davilk字节只有两种类型:基本类型和引用类型,对象和数组都是引用类型。...,比如在Java代码中的java.lang.String对应在Davlik中描述是Ljava/lang/String 二、Dalvik指令集 上面只是简单了解了Dalvik字节,具体每个方法涉及到的逻辑还需要

1.5K10

001

; 字段格式:类型(包名+类名)-> 字段名称:字段类型 dalvik 指令 基础字节 - 名称后缀/字节后缀 目的寄存器寄存器 nop 空操作指令,值为 00,对其代码,无实际操作...move-result vAA 将上一个 invoke 类型指令操作的单字非对象结果赋给 vAA 寄存器 move-result-wide vAA 将上一个 invoke 类型指令操作的双字非对象结果赋给...这条指令占用两个字节,值为 0xooff (Android4.0新增) 实例操作指令 check-cast vAA, type@BBBB 将 vAA 寄存器中的对象引用转换为指定类型 instance-of...BBBB 相同,只是参数寄存器使用 range 字节指定了取值范围 fill-array-data vAA, +BBBBBBBB 用指定的数据填充数组, vAA 寄存器为数组引用,引用必须为基础类型的数组...,在指令后面会紧跟一个数据表 异常指令 throw vAA 抛出 vAA 寄存器中指定类型的异常 跳转指令 if-eq 等于 if-ne 不等于 if-lt 小于 if-le 小于等于

63220

JAVA虚拟机与Android虚拟机的区别

1.JAVA虚拟机运行的是JAVA字节Dalvik虚拟机运行的是Dalvik字节 java虚拟机:JAVA->class文件 dalvik虚拟机:JAVA->class文件->Dalvik字节...Dalvik虚拟机 SDK中有个dx工具负责将JAVA字节转换为Dalvik字节,**对JAVA类文件重新排列,**将所有JAVA类文件中的常量池分解,消除其中的冗余信息,重新组合形成一个常量池,...2.代码尺寸和解码效率不如基于栈虚拟机,因为它包含操作数,所以指令大于基于堆栈的指令。但是基于寄存器产生更少的代码,所以总的代码数不会增加。...3.寄存器虚拟机必须从操作指令中解码操作数,需要额外的解码操作。...Dalvik虚拟机执行的是dex字节,ART虚拟机执行的是本地机器 Dalvik执行的是dex字节,依靠JIT编译器解释执行,运行时动态地将执行频率很高的dex字节翻译成本地机器,然后在执行,

1.1K20

从JVM到Dalivk再到ART(class,dex,odex,vdex,ELF)

一般来说,基于堆栈的机器必须使用指令才能从堆栈上的加载和操作数据,因此,相对基于寄存器的机器,它们需要更多的指令才能实现相同的性能。...但是基于寄存器机器上的指令必须经过编码,因此,它们的指令往往更大。...常量池已被修改为只使用32位的索引,以简化解释器 标准Java字节实行8位堆栈指令,Dalvik使用16位指令集直接作用于局部变量。局部变量通常来自4位的“虚拟寄存器”区。...在 Dalvik 下,应用每次运行的时候,字节都需要通过即时编译器(just in time ,JIT)转换为机器,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节就会预先编译成机器...在 Android N 之前,对于在 dalvik 环境中 使用 dexopt 来对 dex 字节进行优化生成 odex 文件最终存在手机的 data/dalvik-cache 目录下,最后把 apk

1.8K21

s002android逆向安全初级篇之android smali语法总结

smali 的dalvik 操作链接dalvik_opcodes smali 中的数据类型 smali中有两类数据类型:基本类型和引用类型。 引用类型是指数组和对象,其他都是基础类型。...寄存器dalvik字节中,寄存器都是32位的,能够支持任何类型。64位类型(Long和Double型)用2个寄存器表示。 有两种方式指定一个方法中有多少寄存器是可用的。....registers指令指定了方法中寄存器的总数。 .locals指令表明了方法中非参寄存器的数量。 方法的传参 当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。....registers 指令指定了方法中寄存器的总数 .locals 指令表明了方法中非参寄存器的总数,出现在方法中的第一行 类 如果没有内部类的话一个类在一个文件中; 如果有内部类,则内部类单独一个文件文件名格式为...说了这么多,其实读到这里只要记住两点:在字节层面表示构造方法,表示静态程序块。

70840

JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比

,但JAVA编译后生成的字节是在JVM上跑,需要由JVM把字节翻译成机器指令,才能使JAVA程序跑起来。...而DVM 运行的是Dalvik字节,所有的Dalvik字节由JAVA字节转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中,DVM通过解释DEX文件来执行这些字节...③JVM基于栈,DVM基于寄存器 JAVA虚拟机基于栈结构,程序在运行时虚拟机需要频繁的从栈上读取写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费很多CPU时间。...Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...JIT以JVM为例,javac把程序源码编译成JAVA字节,JVM通过逐条解释字节将其翻译成对应的机器指令,逐条读入,逐条解释翻译,执行速度必然比C/C++编译后的可执行二进制字节程序慢,为了提高执行速度

1.3K20

Android-Dalvik虚拟机

并拥有一套完整的指令系统 5.提供了对象生命周期管理 堆栈管理 线程管理 安全和异常管理以及垃圾回收等重要功能 6.所有的Android程序都运行在Android系统进程里 每个进程对应一个Dalvik...虚拟机实例 Dalvik虚拟机与Java虚拟机的区别 两者不兼容 1.java虚拟机运行的是Java字节 Dalvik虚拟机运行的是Dalvik字节 传统的Java程序经过编译 生成Java字节保持在...class文件中 Java虚拟机通过编码class文件中的内容来运行程序 而Dalvik虚拟机运行的是Dalvik字节 所有Dalvik字节由Java字节转换而来 并被打包到一个DEX可执行文件中...Dalvik虚拟机通过解释DEX文件来执行这些字节 2....程序在运行时虚拟机需要频繁的从栈上读取或写入数据 这个过程需要更多的指令与内存访问次数 会耗费不少CPU时间 对于像手机设备资源有限的设备来说这是相当大的一笔开销 Dalvik虚拟机基于寄存器架构 数据的访问通过寄存器间直接传递

40310

Android内存管理(JVM 、DVM(dalvik) 、ART简介)

,但JAVA编译后生成的.class字节是在JVM上跑,需要由JVM把字节翻译成机器指令,才能使JAVA程序跑起来。...Dalvik虚拟机基于 寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器 基于栈的架构通常指令更短,因为其操作不需要指定操作数和结果的地址 基于寄存器的架构通常运行速度更快,因为有寄存器的支撑 基于寄存器的架构通常需要较少的指令来完成同样的运算...,因为不需要进行压栈和出栈 执行的字节不同:Java运行的是Java字节,DVM运行的是Dalvik字节。...ART : .dex->.odex(机器)(AOT  Ahead-Of-Time) Dalvik: .dex->.odex(字节)(JIT Just-In-Time) 机器可直接执行,而字节每次启动都需要执行将优化过的

1.7K10

Java虚拟机和Dalvik虚拟机的区别java虚拟机和Dalvik虚拟机的区别

但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容;同时还要两个明显的不同: Java虚拟机运行的是Java字节,而Dalvik虚拟机运行的则是其专有的文件格式...在Java SE程序中的Java类会被编译成一个或者多个字节文件(.class)然后打包到JAR文件,而后Java虚拟机会从相应的CLASS文件和JAR文 件中获取相应的字节;Android应用虽然也是使用...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节。...(java类会被编译成一个或多个字节.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节Dalvik运行的是自定义的.dex字节格式。...(1)虚拟机很小,使用的空间也小; (2)Dalvik没有JIT编译器; (3)常量池已被修改为只使用32位的索引,以简化解释器; (4)它使用自己的字节,而非Java字节

2.5K90

Android内存管理(JVM 、DVM(dalvik) 、ART简单介绍)

,但JAVA编译后生成的.class字节是在JVM上跑,需要由JVM把字节翻译成机器指令,才能使JAVA程序跑起来。...Dalvik虚拟机基于 寄存器架构,数据的访问通过寄存器间直接传递,这样的访问方式比基于栈方式要快很多。...基于栈的架构具有更好的可移植性,因为其实现不依赖于物理寄存器 基于栈的架构通常指令更短,因为其操作不需要指定操作数和结果的地址 基于寄存器的架构通常运行速度更快,因为有寄存器的支撑 基于寄存器的架构通常需要较少的指令来完成同样的运算...,因为不需要进行压栈和出栈 执行的字节不同:Java运行的是Java字节,DVM运行的是Dalvik字节。... ART : .dex->.odex(机器)(AOT  Ahead-Of-Time) Dalvik: .dex->.odex(字节)(JIT Just-In-Time) 机器可直接执行

2.7K00

【Java 虚拟机原理】动态字节技术 | Dalvik & ART 虚拟机 | Android 字节打包过程

文章目录 一、动态字节技术 二、Dalvik & ART 虚拟机 三、Android 字节打包过程 总结 一、动态字节技术 ---- 动态字节技术 就是在 运行时 , 动态修改 Class 字节...数据 ; 如 : 修改下面字节文件中的二进制数据信息 ; 动态字节技术实现 : 首先 , 要 分析整个 Class 字节中的信息 ; 然后 , 找到要修改的字节 数据位置 ; 最后 , 替换对应的二进制数据..., 不需要开发者自己手动分析 Java 字节文件 ; 二、Dalvik & ART 虚拟机 ---- Android 5.0 之前使用 Dalvik 虚拟机 . 5.0 之后使用 ART 虚拟机...; Dalvik 已经被淘汰 , 目前重点学习 ART 即可 ; JVM 与 Dalvik 虚拟机区别 : JVM 是基于栈的 ; 打包后的字节文件是 jar 文件 ; Dalvik 是基于寄存器的...; 打包后的字节文件是 dex 文件 ; 程序在 CPU 上运行 , 通过执行寄存器上的指令对数据进行操作 ; jar 文件与 dex 文件 对比图 : JVM 中有 JIT 即时编译器 , 代码在运行时

57720

Android内存优化(一)DVM和ART原理初探

DVM是基于寄存器的,它没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈指令,同时指令更紧凑更简洁。...但是由于显示指定了操作数,所以基于寄存器指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少。...执行的字节不同 在Java SE程序中,Java类会被编译成一个或多个.class文件,打包成jar文件,而后JVM会通过相应的.class文件和jar文件获取相应的字节。...从上图可以看出,首先Java编译器编译的.class文件经过DX工具转换为.dex文件,.dex文件由类加载器处理,接着解释器根据指令集对Dalvik字节进行解释、执行,最后交与Linux处理。...ART与DVM的区别 DVM中的应用每次运行时,字节都需要通过即时编译器(JIT,just in time)转换为机器,这会使得应用的运行效率降低。

1.2K101

Android虚拟机的JIT编译器

Android虚拟机的演变 4.4版本前,使用的是Dalvik虚拟机 5.0版本以后,使用的是Art虚拟机 Dalvik虚拟机 原理 Dalvik是基于寄存器的虚拟机,读取和保存数据会比基于栈的JVM在运行时快很多...基于寄存器的虚拟机允许更快的执行时间,但代价是编译后的程序更大 新的Dex字节格式 合并多个class字节文件 减少常量池大小 减少文件的IO操作,提高类的查找速度 减少文件大小 dex的优化格式...Dex的优化 Dalvik的JIT 在运行时对dex的指令进行intercept,解释成机器 虚拟机根据函数调用的次数,来决定热点代码 以函数为维度将热点代码的机器进行缓存,在下一次调用时直接调用该机器...而根据Profile生成AOT的过程就是:Profile Guided AOT 而在JIT的过程中会进行以下事情: JIT的解释器:将字节解释成机器指令 JIT的编译器:将函数编译成机器指令 根据运行时的环境生成...Android N的ART模式 JIT的解释器 对字节进行解释 基于计算的跳转指令 基于Arm汇编的Operation Code处理 Profiling以及JIT编译的触发 基于函数执行次数以及搜索式的代码热度

1.4K40

笔记——JVM、DVM(dalvik)和ART之间的区别(二十)

,但JAVA编译后生成的.class字节是在JVM上跑,需要由JVM把字节翻译成机器指令,才能使JAVA程序跑起来。...增加了对新的操作的支持,使文件结构尽量简洁,使用等长的指令,借以提高解析速度。 3、什么是ART虚拟机,和JVM/DVM有什么不同?...Dalvik虚拟机执行的是dex字节,ART虚拟机执行的是本地机器。...Dalvik执行的是dex字节,依靠JIT编译器去解释执行,运行时动态地将执行频率很高的dex字节翻译成本地机器,然后在执行,但是将dex字节翻译成本地机器是发生在应用程序的运行过程中,并且应用程序每一次重新运行的时候...安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器,也就是说,应用程序仍然是一个包含dex字节的apk文件。

3.1K30

.apk反编译_apk反编译教程

APK、Dalvik字节和smali文件 APK文件 大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮...Dalvik字节 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节。...Dalvik VM比JVM速度更快,占用空间更少。 通过Dalvik字节我们不能直接看到原来的逻辑代码,这时需要借助如Apktool或dex2jar+jd-gui工具来帮助查看。...前面说过,Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器是什么意思呢?

9.5K30

Dalvik虚拟机

java虚拟机和Dalvik虚拟机的区别: java虚拟机 Dalvik虚拟机 java虚拟机基于栈。 ...基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多 dalvik虚拟机是基于寄存器的 java虚拟机运行的是java字节。...(java类会被编译成一个或多个字节.class文件,打包到.jar文件中,java虚拟机从相应的.class文件和.jar文件中获取相应的字节Dalvik运行的是自定义的.dex字节格式。...(java类被编译成.class文件后,会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后dalvik虚拟机会从其中读取指令和数据) 常量池已被修改为只使用32位的索引,以 简化解释器...每个android dalvik应用程序都被赋予了一个独立的linux PID(app_*)) Dalvik虚拟机架构: 在android源码中,Dalvik虚拟机的实现位于“dalvik/”目录下

1.2K70

Android 逆向之 smali

Dalvik字节 Dalvik是google专门为Android操作系统设计的一个虚拟机,经过深度的优化。...Dalvik VM是基于寄存器的,而JVM是基于栈的;Dalvik有专属的文件执行格式dex(dalvik executable),而JVM则执行的是java字节。...goto :goto_0 .end method smali寄存器 Dalvik VM与JVM的最大的区别之一就是Dalvik VM是基于寄存器的。基于寄存器是什么意思呢?...没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地,boolean类型则使用带“-boolean”的指令操作。...ARM常用指令 ADD 加指令 SUB 减指令 STR 把寄存器内容存到栈上 LDR 把栈上内容载入一个寄存器中 .W 是一个可选指令宽度说明符。

1.8K31
领券