Smail语法

  • 数据类型

B---byte
C---char
D---double
F---float
I---int
J---long
S---short
V---void
Z---boolean
[XXX---array
Lxxx/yyy---object

  • 函数的定义

Func-Name (Para-Type1Para-Type2Para-Type3...)Return-Type

在smali里的所有操作都必须经过寄存器来进行:本地寄存器用v开头数字结尾的符号来表示,如v0、v1、v2、...参数寄存器则使用p开头数字结尾的符号来表示,如p0、p1、p2、...特别注意的是,
p0不一定是函数中的第一个参数,在非static函数中, p0代指“this”,p1表示函数的第一个参数,p2代表函数中的第二个参数…而在static函数中p0才对应第一个参数
(因为Java的static方法中没有this方法)。本地寄存器没有限制,理论上是可以任意使用的


const/4 v0, 0x0
iput-boolean v0, p0, Lcom/disney/WMW/WMWActivity;->isRunning:Z
相当于
this.isRunning = false;

  • 函数调用

1)、invoke-static:顾名思义就是调用static函数的
2)、invoke-super:调用父类方法用的指令,在onCreate、onDestroy等方法都能看到
3)、invoke-direct:调用private函数的
4)、invoke-virtual:用于调用protected或public函数

.local 1 标明了你在这个函数中最少要用到的本地寄存器的个数 v0

  • 插入日志

.local 5 (用到v4)

const-string v3, "tag"
const-string v4, "log456"
invoke-static {v3, v4}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

 

打印数字

const/high16 v1, 0x7f030000
const-string v3, "tag"
invoke-static {v1}, Ljava/lang/Boolean;->toString(Z)Ljava/lang/String;
move-result-object v4
invoke-static {v3, v4}, Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I

 

 
  • 打印调用栈
new-instance v0, Ljava/lang/Exception;
const-string v1, "print trace"
invoke-direct {v0,v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V
invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

或者

invoke-static {}, Ljava/lang/Thread;->dumpStack()V

  




posted @ 2020-03-02 14:41  ahuo  阅读(809)  评论(0编辑  收藏  举报