Android逆向——Smali语法
一、android盗版软件大部分都是二次打包完成的。基本上就是反编译,注入广告,打包签名,上传市场。其中注入广告或者破解游戏都是通过smali来达到的。smali就是DVM内部执行的核心代码!
二、语法
1.dalvik字节码有两种类型,原始类型和引用类型。对象和数组属于引用类型。其他的都是原始类型。
2.原始类型:
V void 返回值类型
Z boolean
B byte
S short
C char
I int
J long(64位)
F float
D double(64位)
3.对象类型
对象的表示以L开头,格式是LpackageName/objectName;,
String对象在smali中为:Ljava/lang/String;
内部类对象为:LpackageName/objectName$subObjectName;在内部类前加$符号
4.数组类型
int[] [I
int[][] [[I
String[] [Ljava/lang/String;
5.方法
Lpackage/name/ObjectName;
->MethodName(III)Z
翻译成java是:Lpackage/name/ObjectName表示包名;MethodName是方法名;III表示三个整型参数;Z表示返回boolean类型
方法的参数是连接起来的没有分隔符
fool()V-----------------void foo()
set(Ljava/lang/String;Ljava/lang/String;I)V---------------void set(String name, String id, int age)
foo(Z[I[ILjava/lang/String;J)Ljava/lang/String;------------String foo(boolean,int[],int[],String,long)
6.参数
Lpackage/name/ObjectName;
->FieldName:Ljava/lang/String;
包名->字段名:字段类型
7.寄存器DVM
DVM与JVM最大的区别就是DVM是基于寄存器的。基于寄存器的意思是说:在smali中所有的操作都必须经过寄存器来进行。
8.smali基本指令语法
.field private isFlag:z 定义变量
.method 方法
.parameter 方法参数
.line 8 此方法位于第8行
invoke-super 调用父函数
const/high16 v0,0x7fo3 把0x7fo3赋值给v0
invoke-super 调用父函数
invoke-direct 调用函数
return-void 函数返回void
.end method 函数结束
new-instance 创建实例
iput-object 对象赋值
iget-object 调用对象
invoke-static 调用静态函数
条件跳转分支:
if-eq vA,vB, :cond_** 如果vA等于vB则跳转到:cond_**
if-ne........ 不等于
if-lt 小于
if-le 小于等于
if-gt 大于
if-ge 大于等于
eqz 等于0
nez 不等于0
ltz 小于0
gez 大于等于0
gtz 大于0
lez 小于等于0