smali与逆向,很神奇

(原创)转载请注明出处

什么是smali

 关于这个问题,说来就话长了,不知道从那些起,就随便写吧!
smali是一种语言,其实就是一种dalvik寄存器指令语言,他是由Android的应用程序APK通过apktool反编译出来的,生成的文件里都是以.smali结尾的文件。每一个文件都是java中的一个类,他里面的代码是干啥的呢?主要就是对java文件的翻译,他还原了很多java不能表现的状态,还原了很多细节。

什么是APK?怎么生成的,过程?

 APK(AndroidPackage),就是Android的安装包,他可以直接安装在Android手机上。Android是java开发的环境,所以Apk也是用java的语言写的,那么他在成为.APK文件之前都经过什么?首先,java的源码被编译成以.class结尾的字节码文件,后经过,dalvik虚拟机的作用生成了以.dex结尾的文件,.dex文件和.class文件可是大不一样,dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。

什么是dalvik

 提到了那么多次dalvik,想必还不知道dalvik究竟是个什么东西吧
Android应用程序在运行时必须支持多种不同类型的设备,并且基于安全、性能和可靠性考虑必须被沙箱隔离。如此看来,,虚拟机貌似是非常合适的选择。
dalvik虚拟机是基于寄存器,其内部的执行器执行的是dex格式的文件,并且通过dxtool工具将class文件转换为dex文件,要想Android应用在它自己的虚拟机进程内执行,不仅仅要求大量的虚拟机高效的运行而且还要求新虚拟机能够快速创建(用户会不定时打开新的应用)

dalvik虚拟机里两种不同寄存器的表示方法

 命名法主要有p字命名法和v字命名法,
总结一下下有什么不同:
假设一个函数用到了M个寄存器,并且有N个参数,那么dalvik有自己的一套的规定,局部变量使用前M-N个寄存器,后N个寄存器被N个参数使用
V字命名法:采用小写“v”,开头的方式表示函数中用到的局部变量寄存器参数寄存器所有寄存器从v0开始,依次递增。
p字命名法:没有影响局部变量命名,还是以小写“v”开头,在p字命名方法中,参数寄存器是从p0开始的并且依次递增,
注:带颜色的字体请仔细斟酌。
附表说明:

v字命名法 p字命名法 寄存器表示
v0 v0 第一个局部变量|
v1 v2 第二个局部变量|
局部变量寄存器依次递增|
vM-vN p0 第一个参数寄存器|
寄存器依次递增|
vM-1 pN-1 第N个寄存器|
v字命名法 p字命名法 寄存器表示
v0 v0 第一个局部变量寄存器
依次递增
vM-vN p0 第一个参数寄存器
依次递增
vM pN 第N个参数寄存器

简单说说smali语法规则,不喜勿喷

.field private isFalg:z 定义变量
.method 配合
end method //函数起始与结束
.parameter 参数
.prologue 代码起始处
.line 12 此代码在12行
invoke-super 调用父类
invoke-direct 调用函数
invoke-static 调用静态函数
return-void 函数返回void,也就是无返回
new instance 创建实例
iput-object 给对象输入值,也就是赋值
iget-object 获取对象,也就是调用对象
条件跳转分支:
“if -eq vA,vB,:cond_**”
如果vA等于VB则跳转到cond**_
-ne 不等于
-lt 小于
-gt 大于
-le 小于等于
-ge 大于等于
如果表示一个数小于零或大于零或等等,在后面加‘z’.

APK文件如何反编译成java源码

 主要使用工具dex2jar和jd-gui,
dex2jar是将.dex文件反编译成java源码
jd-gui主要是查看.dex文件反编译成的.jar的文件
详细解题过程见:我以后会写的。。。哈哈哈

你可能感兴趣的:(smali与逆向,很神奇)