smali语法第一课

Smali是一种汇编语法,来源Dalvik的vm的字节码,即dex文件中的bytecode=二进制数据,反汇编后得到的Smali代码,对应文件叫:Smali文件

dalvik的字节码有两大类类型,原始类型和引用类型。引用类型是对象和数组,其他一切都是原始类型。

一、原始类型语法类型smali和java对比

V    void

Z    boolean-----区别点

B    byte

S    short

C    char

I    int

J    long(64bits)---区别点

F    float

D    double(64bits)

二、引用类型

对象类型:对象类型以L作为开头,格式是:LpackageName/objectName;(注意必须有个分号跟在最后),String对象在smali中为Ljava/lang/String;,

内部类的格式为:LpackageName/objectName$subObjectName;在内部类前面加$符号

数组类型:在基本类型前面加[ ,例如int数组和float数组分别表示为[I、[F

方法:总是以非常详细的形式指定,其中包括方法的类型、方法名称、参数类型和返回类型

格式:Lpackage/name/ObjectName;->MethodName(III)Z

eg:method(I[[IILjava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;在java中是:

String method(int,int[][],int,String,Object[])

三、Smali基本语法:

.field private isFlag:z    定义变量

.method    方法

.parameter    方法参数

.prologue    方法开始

.line 123    此方法位于123行

invoke-super    调用父函数

const/high16 vo,ox7fo3    把ox7fo3赋值给v0

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 vA,vB,:cond_\**"如果vA不等于vB则跳转到cond_**

"if-lt vA,vB,:cond_\**" 如果vA小于vB则跳转到cond_**

"if-ge vA,vB,:cond_\**" 如果vA大于等于vB则跳转到cond_**

if-gt vA,vB,:cond_\**" 如果vA大于vB则跳转到cond_**

if-le vA,vB,:cond_\**" 如果vA小于等于vB则跳转到cond_**

if-eqz vA,:cond_\**" 如果vA等于0则跳转到cond_**

if-nez vA,:cond_\**" 如果vA不等于0则跳转到cond_**

if-ltz vA,:cond_\**" 如果vA小于0则跳转到cond_**

if-gez vA,:cond_\**" 如果vA大于等于0则跳转到cond_**

if-gtz vA,:cond_\**" 如果vA大于0则跳转到cond_**

if-lez vA,:cond_\**" 如果vA小于等于0则跳转到cond_**

五、关于寄存器的知识

在java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的

寄存器为32位,可以支持任何类型。

寄存器分为本地寄存器和参数寄存器

本地寄存器:用v开头数字结尾的符号来表示 eg:v0、v1、v2

参数寄存器:用p开头数字结尾的符号来表示 eg:p0、p1、p2

在非static方法中,po代指this,p1为方法的第一个参数

在static方法中,p0为方法的第一个参数

说明:.register:指定了方法中寄存器的总数,.locals:表明了方法中非参寄存器的总数,出现在方法中的第一行

五、操作指令

成员变量格式是:.field public/private [static] [final] varName:<类型>

对于不同的成员变量也有不同的指令

一般来说 获取的指令有:

iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等 看到get的都是获取指令

操作的指令有:

iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等

没有“-object”后缀的表示操作的成员变量对象是基本数据类型,带“-object”表示操作的成员变量是对象类型,特别地boolean类型则使用带“-boolean”的操作指令操作。

array的操作是aget和aput

六、方法/函数 Methods

.method public/private [static][final] methodName()<类型>

.end method

函数类型

direct method = private方法

virtual method = 其余的方法(public、protected)

函数调用

格式:invoke-指令类型{参数1,参数2...},L类名;->方法名

包含

invoke-direct

invoke-virtual

invoke-static

invoke-super

invoke-interface

函数返回结果:

invoke-result或move-result-object来保存函数返回的结果

invoke-result返回基本数据类型

move-result-object返回对象类型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容

  • Smali语法 ①基本数据类型 smali类型 java类型 V void Z boolean...
    rc0903阅读 25,666评论 1 4
  • 前言 Android采用的是java语言进行开发,但是Android系统有自己的虚拟机Dalvik和ART,代码编...
    风澈vio阅读 12,398评论 5 115
  • <div align =center>Android逆向工程 初篇</div> 本篇文章建立于有开发环境(jdk...
    Ojie阅读 4,248评论 1 11
  • 一、android盗版软件大部分都是二次打包完成的。基本上就是反编译,注入广告,打包签名,上传市场。其中注入广告或...
    冰至如归阅读 319评论 1 0
  • 注意:Dalvik虚拟机使用的寄存器都是32位,对于64位类型,采用两个相邻的寄存器来表示。以下语法以baksma...
    尔林阅读 2,225评论 0 5