软件安全教学课件(鲁宏伟)第五讲 Android程序的逆向分析.ppt
文本预览下载声明
Android与ARM处理器 ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括: 1、31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。 2、6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,目前只使用了其中的一部分。 ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。 Android与ARM处理器 Android最初选择ARM作为其主要支持的硬件平台,除了市场原因外,在技术层面上可能是更多的考虑到ARM处理器的高性能,及其使用的广泛性。可以吸引以前在ARM平台上开发的工程师,加入到Android的开发行列中。 从Android1.6开始,Dalvik虚拟机提供了x86架构的支持 Android 4.1加入了对MIPS的支持 ARM汇编语言程序结构 在 ARM ( Thumb )汇编语言程序中,以程序段为单位组织代码。 段是相对独立的指令或数据序列,具有特定的名称。 段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。 一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。 ARM汇编语言程序结构 可执行映象文件通常由以下几部分构成: 一个或多个代码段,代码段的属性为只读。 零个或多个包含初始化数据的数据段,数据段的属性为可读写。 零个或多个不包含初始化数据的数据段,数据段的属性为可读写 链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。因此源程序中段之间的相对位置与可执行的映象文件中段的相对位置一般不会相同。 程序示例 Dalvik虚拟机是如何执行程序的 Dalvik虚拟机在Zygote进程中启动完成之后,就会获得一个JavaVM实例和一个JNIEnv实例。其中,获得的JavaVM实例就是用来描述Zygote进程的Dalvik虚拟机实例,而获得的JNIEnv实例描述的是Zygote进程的主线程的JNI环境。 关于Dalvik虚拟机JIT Android 2.2的虚拟机Dalvik使用了JIT(Just-In-Time)技术,使其运行速度快了5倍。 Dalvik解释并执行程序,JIT技术主要是对多次运行的代码进行编译,当再次调用时使用编译之后的机器码,而不是每次都解释,以节约时间。 Dalvik指令格式 在 Dalvik 中每一个指令的作用会由指令和相关数据组合而成。组合的方式有很多种 比如指令格式为“B|A|op CCCC”,就是表示这条指令有两个16位的字组成,因为中间有空格分隔,每个分开的表示16位字。第一个16位,就是“B|A|op”,高字节由B和A组成,低字节由操作码op组成。第二个16位是由CCCC组成,它是表示一个16位的值。 DEX文件反汇编工具 baksmali可以反编译dex文件,输出Dalvik汇编文件。 smali将Dalvik类型的文件编译回dex,这个功能应用于apk修改、补丁、破解等场合。 使用方法:将baksmali、smali以及目标文件classes.dex放到android sdk安装路径下的tools目录下。反编译:java -jar baksmali.jar -o classout/ classes.dex?编译:java -jar smali.jar classout/ -o classes.dex DEX文件反汇编工具 dex2jar 5 将Dalvik虚拟机的dex文件转换回标准Java的class文件的工具,然后可以用JD-GUI工具直接打开查看。用法:dex2jar.bat 目标文件主页:/p/dex2jar/ 了解Dalvik寄存器 当一个方法被调用的时候,方法的参数被置于最后N个寄存器中。 如果一个方法有2个参数,5个寄存器(v0-v4),那么参数将置于最后2个寄存器——v3和v4。?非静态方法中的第一个参数总是调用该方法的对象。 例如,非静态方法LMyObject;-callMe(II)V有2个整型参数,另外还有一个隐含的LMyObject;参数,所以总共有3个参数。假如在该方法中指定了5个寄存器(v0-v4),以.registers方式指定5个或以.locals方式指定2个(即2个local寄存器+3个参数寄存器)。当该方法被调用的时候,调用该方法的对象(即this引用)存放在v2中,第一个整型参数存放在v3中,第二个整型参数存放在v4中。 了解Dalv
显示全部