概述
1、Smali中的包信息
- .class <访问权限> [修饰关键字] <类名>
- .super <父类名>
- .source <源文件名>
.class public Lcom/aaa;
.super Lcom/bbb;
.source "ccc.java"
该smali文件是由ccc.java编译而来的,它是com.aaa这个包下的一个类,继承自com.bbb这个类
2、Smali中的寄存器知识
- 本地寄存器以v开头数字结尾,如:v0,v1...
- 参数寄存器以p开头数字结尾,如:p0,p1...
- p0不一定是函数中的第一个参数,在非static函数中,p0就是“this”的意思,后面的才为函数参数
3、Smali中的函数
函数的整体架构:
.method <访问权限> [修饰关键字] <方法原型> #方法声明
<.locals> #局部变量个数
[.parameter] #参数
[.prologue] #代码开始处
[.line] #源代码行号
<代码体>
.end method #方法结束
4、Smali中的数据类型
- v void只能用于返回值类型
- Z boolean类型
- B byte类型
- S shot类型
- C char类型
- I int类型
- J long类型
- F float类型
- D double类型
- 数组类型: [
- [后面跟着基本数据类型
- 如:float [] ===> [F
- char [][] ===> [[C
- 对象类型:L<包名>/<类名>;
- 分号表示对象结束
- String对象 ===> Ljava/lang/String;
- 内部类前面加 “ $ ” 符号:L<包名>/<类名>$<内部类名>;
5、Smali中的成员变量
- 格式:.field [访问权限] [修饰关键字] <变量名>:<数据类型>
- 成员变量的获取指令:iget、sget、iget-boolean、sget-boolean、iget-object、sget-object等
- 成员变量的操作指令:iput、sput、iput-boolean、sput-boolean、iput-object、sput-object等
- 除了带有-object和-boolean之外的指令操作的是基本数据类型
- get指令的使用:
- 如:sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;
- 表示的是获取String类型的ID变量的值,并将其存放到v0寄存器中
- 前面为该变量所属类的类型,在冒号后面表示变量的数据类型,“->”表示所属关系
- 表示的是获取String类型的ID变量的值,并将其存放到v0寄存器中
- iget-object v0,p0,Lcom/aaa;->view:Lcom/aaa/view;
- p0为该变量所在类的实例,即“this”
- 获取数组的话,用aget-object
- 如:sget-object v0, Lcom/aaa;->ID:Ljava/lang/String;
- put指令的使用:
- const/4 v1, 0x0
- sput-object v3, Lcom/aaa;->timer:Lcom/aaa/timer; ===> this.timer=null;
- 因为给object对象赋值,所以为null
- .local v0, args:Landroid/os/Message;
- const/4 v1, 0x12
- iput v1, v0, Landroid/os/Message;->what:I ===> args.what=18;
- 实例化对象Message为args并存放在寄存器v0中,给v1赋值为0x12,然后使用iput将v1的值赋给args对象的what属性
6、Smali其他基本语法:
- .invoke-super #调用父类方法
- const/high16 v0, 0xadf1 #将0xadf1存放到寄存器v0中
- invoke-direct #调用函数
- return-void #函数返回void
- new-instance #创建实例
- iput-object #给对象赋值
- iget-object #调用对象
- invoke-static #调用静态函数
7、Smali中的条件分支
- if-eq v1, v2:cond_* ===> 如果v1=v2则跳转到:cond_*
- if-ne v1, v2:cond_* ===> 如果v1≠v2则跳转到:cond_*
- if-lt v1, v2:cond_* ===> 如果v1<v2则跳转到:cond_*
- if-le v1, v2:cond_* ===> 如果v1<=v2则跳转到:cond_*
- if-ge v1, v2:cond_* ===> 如果v1>=v2则跳转到:cond_*
- if-gt v1, v2:cond_* ===> 如果v1>v2则跳转到:cond_*
- if-eqz v1:cond_* ===> 如果v1=0则跳转到:cond_*
- if-nez v1:cond_* ===> 如果v1≠0则跳转到:cond_*
- if-ltz v1:cond_* ===> 如果v1<0则跳转到:cond_*
- if-lez v1:cond_* ===> 如果v1<=0则跳转到:cond_*
- if-gtz v1:cond_* ===> 如果v1>0则跳转到:cond_*
- if-gez v1:cond_* ===> 如果v1>=0则跳转到:cond_*
8、Smali中的函数调用
- 函数分为两种:direct和virtual
- direct method表示private
- virtual method表示public、protected
- 在函数调用时有:invoke-direct、invoke-virtual、invoke-static、invoke-super等
- 当参数多于4个的时候使用:invoke-xxx/range
- invoke-static:用于调用静态函数
- invoke-static {}, Lcom/aaa;->Check()Z
- {}:里面的东西表示传入函数的实例+参数列表,由于该static函数不需要任何参数所以里面为空
- const-string v0, "NIUBI"
- invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
- 这是调用static void System.loadLibrary(String)方法,传入的参数为“NIUBI”
- invoke-static {}, Lcom/aaa;->Check()Z
- invoke-super:调用父类方法,一般用于调用onCreate、onDestroy等方法
- invoke-direct:调用private函数
- invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V
- 这里的<init>就是定义在TabActivity中的private函数
- invoke-direct {p0}, Landroid/app/TabActivity;-><init>()V
- invoke-virtual:调用的是public、protected函数
- sget-object v0, Lcom/aaa;->bbb:Lcom/ccc;
- invoke-virtual {v0, v1}, Lcom/ccc;->Message(Ljava/lang/Object;)V
- v0是Lcom/ccc
- v1是传给Message方法的Ljava/lang/Object;参数
- public void ccc.Message(Object)
- invoke-xxxx/range:当方法的参数多于4个的时候使用
- 在调用函数的时候通常会有返回结果,如果返回值非void,则需要使用
- move-result (返回基本数据类型)和move-result-object (返回对象)
- const-string v0, "Eric"
- invoke-static {v0}, Lcmb/pbi;->t(Ljava/lang/String;)Ljava/lang/String;
- move-result-object v2
- v2就保存了t方法的返回值String类型的
最后
以上就是粗犷戒指为你收集整理的smali汇编语言学习总结的全部内容,希望文章能够帮你解决smali汇编语言学习总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复