Android与Apk的文件结构在学习逆向很重要的一步。随便记录一下smali语法
1、Android
Android 是google公司针对手机开发的一个平台,并公布了其中大部分代码,其大部分应用程序都是用JAVA开发的。
系统结构
android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
从而看出liunx是很重要的,蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C++语言编写的程序库,红色的代码内核(linux内核+drvier)。
1、应用程序
Android会同一系列核心应用程序包一起发布,应用程序基本都是使用JAVA语言编写的。
2、应用程序框架
开发人员也可以完全访问核心应用程序所使用的API 框架,该应用程序的架构设计简化了组件的重用。
3、系统运行库
(1)、程序库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。其实Android并非讲所有的设备驱动都放在linux内核里面,而是实现在userspace空间,这么做的主要原因是GPL协议,Linux是遵循该 协议来发布的,也就意味着对 linux内核的任何修改,都必须发布其源代码。而现在这么做就可以避开而无需发布其源代码,毕竟它是用来赚钱的。
(2)Android 运行库
Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。每一个Android应用程序都在它自己的进程中运 行,都拥有一个独立的Dalvik虚拟 机实例。Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时Dalvik虚拟机依赖于linux内核的一些功能,比如线程机制和底层内存管理机制。
4、Linux内核
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型。 Linux 内核也同时作为硬件和软件栈之间的抽象层。
2、Apk的文件结构
APK就是一个zip压缩包,解开这个APK包我们可以看到以下的结构:
apk的核心逻辑主要在 classes.dex(代码主要存在的文件),有些代码会在.so(动态链接库)文件 [最头痛的文件].
3、Smali语法
1、函数
函数的定义一般为:
Func-Name (Para-Type1Para-Type2Para-Type3…)Return-Type
注意参数与参数之间没有任何分隔符
1、check ()V —-> void check()
2、check (III)Z —-> boolean check(int,int,int)
3、check (Z[I[Ijava/lang/String)java/lang/String; —-> String check(boolean,int[],int[],String)
而函数又分为direct method和virtual method。direct method就是private函数,其余的public和protected函数都属于virtual method。
函数调用
格式:.method + 访问修饰符 + 方法名(参数表) + 返回值类型
.method // 方法的开始
.end method // 方法结束
在调用函数时,有invoke-direct,invoke-virtual,另外还有invoke-static、invoke-super以及invoke-interface等几种不同的指令。
对象 -> 方法名(参数类型)返回值
invoke-virtual 非静态方法调用
invoke-static 静态方法调用
invoke-direct 构造方法调用?
invoke-super 调用父类方法
invoke-interface 调用接口
(1)、invoke-static:顾名思义就是调用static函数的,因为是static函数,所以比起其他调用少一个参数,例如:
这个是调用static void System.loadLibrary(String)来加载NDK编译的so库用的方法,同样也是这里v0就是参数”fmodex”了。
(2)、invoke-virtual:用于调用protected或public函数
v0是shareHandler:Landroid/os/Handler,v3是传递给removeCallbackAndMessage方法的Ljava/lang/Object参数
调用返回结果:用到move-result(返回基本数据类型)和move-result-object(返回对象)指令
smali中函数实体分析
|
|
.local 0,这句话很重要,标明了你在这个函数中最少要用到的本地寄存器的个数。在这里,由于只需要调用一个父类的onDestroy()处理,所以只需要用到p0,所以使用到的本地寄存器数为0。如果不清楚这个规则,很容易在植入代码后忘记修改.local 的值,那么回编译后运行时将会得到一个VerifyError错误,而且极难发现问题所在。
2、语法
if与switch判断语句
if判断一共有12条指令:
Switch语句
循环语句
|
|
try/catch语句
|
|
Android参考:
http://blog.csdn.net/spy19881201/article/details/5775484
samli参考:
http://blog.csdn.net/chenrunhua/article/details/41250613
https://www.cnblogs.com/zhen-android/p/7259434.html