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

你可能感兴趣的:(Android逆向——Smali语法)