首页 > 安卓培训/ 正文
在安卓应用逆向技术的第一部分中,我们已经通过一个简单的例子让大家对于安卓应用逆向有了一个简单的认知。本次开始,将会从头讲解这一技术的细节。而安卓应用的基础细节,是我们逆向成功的基础。也是我们本次内容的重点。
安卓应用基础分为下面几部分来讲解:1. 应用和Delvik指令集。2. Dex和odex文件格式。3. Arm原生代码格式。本次内容也会比较偏重介绍性质,不会涉及太多细节,都是点到为止。希望大家能够对于安卓应用的整体情况有一个宏观的理解。
本次内容稍微需要一点安卓框架的基础知识。
0. 背景知识
在介绍安卓应用格式之前,希望大家能够了解下面的知识:安卓设备运行在ARM架构的CPU上;安卓的底层系统基于Linux实现;安卓应用运行在Delvik虚拟机(类似于Java)中;应用可以通过JNI接口运行原生arm程序。
0.1 ARM
大家对于intel可能非常熟悉,intel的x86架构一直是PC端的霸主,大家的电脑大都用的intel的CPU。但是对于移动设备来讲,ARM就相当于PC界的Intel。ARM有三种CPU架构,我们经常用到的(也是安卓中的)是cortex-A系列。最新的架构已经更新到了Cortex-A72,基于ARMv8-A架构实现。下图是arm官网介绍:(高通,MTK等可以理解为是arm的下游企业,也就是使用arm的架构开发自己的东西)
0.2 Linux与安卓
安卓底层一直使用的是Linux的内核,但是由于一些专利的原因,安卓中的硬件相关的一个驱动层代码并不是开源的。但是内核逻辑和一般命令基本都是可以通用的。大家可以理解为两者大致一样就行。
0.3 Delvik虚拟机
Delvik虚拟机与Java很类似,都是多做了一层虚拟化,将底层的架构与java字节码分开,便于兼容各种设备。而且开发应用的语言基本就是Java。但是还是有一些区别:Java基于栈而Delvik基于寄存器(后面会详细介绍)。
0.4 JNI
在Delvik虚拟机的基础上,安卓应用可以通过JNI调用arm原生代码(arm elf,类似于windows的exe文件)。所以逆向一个应用,有时候还需要仔细分析其中包含的原生代码,甚至最难和最核心的内容就是原生代码的逆向。
1. 安卓应用和Delvik指令集
1.1 APK构建
apk是Android package的缩写,大家可能也非常熟悉。其中不仅包含了可执行文件(dex,odex)也包含了其他资源:图片,界面,第三方库等等。下图是生成apk的流程图(安卓官方图)。由于这个并不是我们关心的重点,所以接下来我们会主要关注Delvik指令集。
1.2 简单Delvik例子(使用smali编写的HelloWorld)
.class public LHelloWorld;
.super Ljava/lang/Object;
.method public static main([Ljava/lang/String;)V
.registers 4
.parameter
.prologue
#空指令
nop
nop
nop
nop
#数据定义指令
const/16 v0, 0x8
const/4 v1, 0x5
const/4 v2, 0x3
#数据操作指令
move v1, v2
#数组操作指令
new-array v0, v0, [I
array-length v1, v0
#实例操作指令
new-instance v1, Ljava/lang/StringBuilder;
#方法调用指令
invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V
#跳转指令
if-nez v0, :cond_0
goto :goto_0
:cond_0
#数据转换指令
int-to-float v2, v2
#数据运算指令
add-float v2, v2, v2
#比较指令
cmpl-float v0, v2, v2
#字段操作指令
sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v1, "Hello World" #构造字符串
#方法调用指令
invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
#返回指令
:goto_0
return-void
.end method
使用命令:
java -jar smali.jar -o classes.dex HelloWorld.smali生成dex文件(第二部分会以该文件为例详细分析dex文件的格式)。然后将这一dex文件直接放到安卓设备中:
adb push classes.dex /data/local/tmp
然后再root权限(注意必须是root,否则无权限执行;因为命令在执行时 , dalvikvm 会在 /data/dalvik-cache/ 目录下创建 .dex 文件 ,因此要求 ADB 的执行 Shell 对目录 /data/dalvik-cache/ 有读、写和执行的权限 ,否则无法达到预期效果)的shell中执行:
dalvikvm -cp /data/local/tmp/HelloWorld.dex HelloWorld
可以得到结果:
之后还会多次用到这一例子。
1.3 Delvik指令集
上一部分使用了最基本的Delvik语法编写了一个基本的HelloWorld。而上次推送中的附录中也有基本的smali语法的相关内容。本次将详细解释相关指令集细节。
1.3.1 Delvik基础
Delvik是基于寄存器的指令,详细的请自行google。在32位x86汇编中,函数传参数是使用栈;arm32,arm64和amd64使用寄存器和栈(分别是4+N,8+N和6+N,意思是前几个参数用寄存器,后面N个都用栈来传递);但是在Delvik中,完全使用寄存器传递参数:
v命名法使用小写字母‘v’开头的方式表示函数中用到的局部变量与参数,所有的寄存器命名从v0开始递增。参数使用最后的几个寄存器,而前面的寄存器是局部变量。
p命名法的局部变量表示与v相同,但是之后的参数的寄存器使用p开头。这种方法可以很清楚分辨局部变量和参数。
1.3.2 Delvik指令集(以上面的HelloWorld.smali为例)
空指令:nop,值为00,用作对齐代码,无操作。
数据定义指令:const/16 v0, 0x8。将8符号位扩展为32位后赋给v0
数据操作指令:move v1, v2。将v2赋给v1
数组操作指令:new-array v0, v1, [I。构建类型为I(32位int)大小为v1的数组,并将值赋给v0。
方法调用指令:invoke-virtual {v0, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V。调用实例的虚方法。v0,v1为参数,返回值为V(也就是void)。Ljava/io/PrintStream;->中L表示class类型,/表示类表示中的点(.),分号表示类名结束,->之后的是函数名。
当然这仅仅是一个初步介绍,需要详细了解的请自行查阅资料。
2. Dex和odex文件格式。
Dex文件是Delvik虚拟机可执行文件。
odex文件有两种存在:一种是apk中提取出来放在apk文件同一目录中,后缀为odex的文件,这类文件一般是Android ROM的系统程序;另一种是保存在cache/dalvik-cache目录下,对应着安装在各个目录下应用的odex文件。比如system@app@Calculator.apk@classes.dex表示在/system/app目录下Calculator.apk程序的odex文件,而data@app@com.tencent.mm表示安装在/data/app下的微信的odex文件。
由于Android程序的apk文件是zip压缩包格式,Dalvik虚拟机每次加载都需要从apk中读取classes.dex文件,这样会耗费很多时间。使用odex方式优化的dex文件中已经包含了加载dex必须的依赖库文件列表,Dalvik虚拟机只需检测并加载所需的依赖库即可执行相应的dex文件,这大大缩短了读取dex文件所需的时间。对于ROM来讲,把系统app全部转换成外置的odex文件与apk放在同一目录,这样系统启动速度就会加快。(dexopt-wrapper命令可以完成odex文件优化过程)
稍微一讲篇幅就变长了,这次简单给下Dex,odex和arm elf文件格式图,详细介绍下次再说。
更多计算机学校,计算机培训 资讯,计算机二级培训,郑州电脑维修学校,计算机培训课程,郑州电脑学校相关文章
- 软件培训网向您解答:安卓发展前景怎么样?
- 学习安卓有前途吗?
- 河南安卓技术培训怎么样
- 有没有适合退伍军人学习的技术学校呢?
- 郑州哪家安卓培训学校比较好
- 在郑州做安卓工程师的月薪多少
- 软件测试培训主要有哪些课程
- 学习安卓软件开发技术可以找个好工作吗
- android软件编程培训好学吗?
- 学了java可以做软件开发吗?
- 软件编程怎么快速入门
- 学android技术需要多久
- 要想学习安卓开发,哪个学校好?
- 学手机安卓开发怎么样呢?
- Android开发待遇好吗
- 安卓开发学习
- 搞安卓开发薪水高吗?
- 安卓工程师培训学费多少钱?
- 安卓工程师学习前景怎么样?
- C#好学还是安卓好学?
- 做个安卓应用开发需要什么技术?
- 学习Android的方法?应该怎么进行学习
- 郑州Android培训班,什么时候开班?
- 安卓开发工程师现在的薪资水平怎么样?
- 快速学会开发安卓 App的妙招
- Android开发和iOS开发哪个更有前景?
- 安卓工程师大专毕业会怎样?
- android的app开发入门教程
- 给大家提供些android面试题摘要
- 搜索
-
- 热门标签