Android软件安全与逆向分析第3章笔记
进入Android Dalvik虚拟机
1.虽然Android平台使用了Java语言来开发应用程序,但Android程序却不是运行在标准Java虚拟机上的,可能是为了解决移动设备 上软件运行效率的问题,也可能是为了规避与Oracle公司的版权纠纷.Google为Android平台专门设计了一套虚拟机来运行Android 程序,它就是Dalvik Virtual Machine(Dalvik虚拟机)
2.Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点:
- 体积小,占用内存空间小
- 专有的DEX可执行文件格式,体积更小,执行速度更快
- 常量池采用32位索引值,寻址类方法名,字段名,常量更快
- 基于寄存器架构,并拥有一套完整的指令系统
- 提供了对象生命周期管理,堆栈管理,线程管理,安全和异常管理以及垃圾回收等重要功能
- 所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例
3.Dalvik虚拟机与Java虚拟机的区别
- java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码
传统的Java程序经过编译,生成Java字节码保存在class文件中,Java虚拟机通过解码class文件中的内容来运行程序.而Dalvik虚拟机运行的是Dalvik字节码,所有的Dalvik字节码由Java字节码转换而来,并被打包到一个DEX(Dalvik Executable)可执行文件中.Dalvik虚拟机通过解释DEX文件来执行这些字节码
- Dalvik可执行文件体积更小
Android SDK中有一个叫dx的工具负责将Java字节码转换为Dalvik字节码.dx工具对Java类文件重新排列,消除在类文件中出现的所有冗余信息,避免虚拟机在初始化时出现反复的文件加载与解析过程.dx将所有的Java类文件中的常量池进行分解,消除其中的冗余信息,重新组合形成一个常量池,所有的类文件共享同一个常量池
- Java虚拟机与Dalvik虚拟机虚拟机架构不同
Java虚拟机基于栈架构.程序在运行时虚拟机需要频繁的从栈上读取或写入数据.Dalvik虚拟机基于寄存器架构,数据的访问通过寄存器直接传递,这样的访问方式比基于栈方式要快很多,基于寄存器架构的Dalvik虚拟机与基于栈架构的Java虚拟机相比,由于生成的代码指令减少了,程序执行速度会更快一些
4.Android系统由Linux内核,函数库,Android运行时,应用程序框架以及应用程序组成.Dalvik虚拟机属于Android运行时环境,它与 一些核心库共同承担Android应用程序的运行工作
5.JIT(Just-in-time Compilation,即时编译),双称为动态编译,是一种在运行时将字节码翻译为机器码的技术,使得程序的执行速 度更快.主流的JIT包含两种字节码编译方式:
method方式:以函数或方法为单位进行编译,耗费更多的内存 trace方式:以trace为单位进行编译,耗费内存少,目前Dalvik虚拟机默认采用trace方式编译代码
6.Dalvik虚拟机基于寄存器架构,在代码中大量地使用到了寄存器,Dalvik中用到的寄存器都是32位的,支持任何类型,64位类型用2 个相信寄存器表示,Dalvik支持2^16-1=65535个寄存器,寄存器采用v0作起始值,因此它的取值范围是v0~v65535.Dalvik虚拟机为每 个进程维护一个调用栈,这个调用栈其中一个作用就是用来”虚拟”寄存器,每个函数都在函数头部使用.registers指令指定函数用 到的寄存器数目,当虚拟机执行到这个函数时,会可以接收寄存器的数目分配适当的栈空间,这些栈空间就是用来存放寄存器实际的 值的.虚拟机通过处理字节码,对寄存器进入读与写的操作
7.在Android4.0系统以前,每个指令的字节码只占用一个字节,范围是0x0~0xff.在Android4.0系统中,又扩充了一部分指令,这些指 令被称为扩展指令
8.编译smali文件命令:java -jar smali.jar -o output.dex input.smali