Android逆向基础1(Smali语法入门)

简单的说,Smali就是Dalvik VM内部执行的核心代码。

1. Smali的基本类型

  • B---byte
  • C---char
  • D---double
  • F---float
  • I---int
  • J---long
  • S---short
  • V---void
  • Z---boolean
  • [XXX---array (数组)
  • Lxxx/yyy---object (对象)

2. 函数的定义

函数的定义一般为:
Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type
注意参数与参数之间没有任何分隔符,同样举几个例子就容易明白了:
(1) foo ()V
没错,这就是void foo()。
(2) foo (III)Z
这个则是boolean foo(int, int, int)。
(4) foo (Z[I[ILjava/lang/String;J)Ljava/lang/String;
看出来这是String foo (boolean, int[], int[], String, long) 了吗?

3. Smali基本语法

  • .field private isFlag:z 定义变量
  • .method 方法
  • .parameter 方法参数
  • .prologue 方法开始
  • .line123 此方法开始于123行
  • invoke-super 调用父函数
  • const/high16 v0,0x7fox 把0x7fox的值赋值给v0
  • invoke-direct 调用函数
  • return-void 函数返回void
  • .end method 函数结束
  • new-instance 创建实例
  • iput-object 对象赋值
  • iget-object 调用对象
  • invoke-static 调用静态函数
  • .class public Lcom/disney/WMW/WMWActivty; 类名
  • .super Lcom/XXX/XXX/XXX; 父类名
  • .source “XXX.java” 源文件名
  • .implements Lcom/XXX/XXX/XXX; 实现了接口
  • .annotation 内部类
  1. Smali局部变量
    (1) 本地寄存器 (local register, 非参寄存器)
    常用v开头数字结尾的符号表示 v0,v1,v2…
    (2) 参数寄存器 (parameter regisgter)
    常用p开头数字结尾的符号来表示 p1,p2,p3…
    a .register 用来标明方法中寄存器的总数,即参数寄存器和非参寄存器
    b .local 标明在这个函数中最少要用到本地寄存器的个数,出现在方法第一行.

5.Smali条件语法

if-eq vA,vB,:cond_** 如果vA等于vB则跳转到:cond_**
ne 不等于
lt 小于
le 小于等于
gt 大于
ge 大于等于
eqz 等于0
nez 不等于0
ltz 小于0
gez 大于等于0
gtz 大于0
lez 小于0

你可能感兴趣的:(Android逆向基础1(Smali语法入门))