smali, baksmali分别是指安卓系统里的Java虚拟机( Dalvik)所使用的一种, dex格式文件的汇编器、反汇编器,其语法是一种宽松式的Jasmin/dedexer语法,而且实现了.dex格式所有功能(注解、调试信息、线路信息等)。当对apk文件进行反编译后,便会生成此类的文件,其中在Davlik字节码中,寄存器都是32位的,能够支持任何类型, 64位类型( Long/Double)用2个寄存器表示; Dalvik字节码有两种类型:原始类型、引用类型(包括对象和数组)。
1. 部分smali指令如下:
'''
.field private isFlag:z 定义变量
.parameter 方法参数
.line 12 此方法位于第12行
.method 方法
.prologue 方法开始
.end method 函数结束
iput-object 对象赋值
const/high16 v0, 0x7fo3 把0x7fo3赋值给v0
new-instance 创建实例
iget-object 调用对象
invoke-direct 调用函数
invoke-super 调用父函数
invoke-static 调用静态函数
return-void 函数返回void
'''
2. 条件跳转分支指令如下:
if语法 | 使用说明 |
---|---|
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_** |
拓展阅读. smali 语法案例分析
现在我们写一个Java例子
private boolean ifSense(){
boolean tempFlag = ((3-2)==1)? : False;
if (tempFlag){
return true;
}else {
return false;
}
}
-----------------------------------------------------------------------
上面代码反编译之后对应的smali语法如下:
.method private ifSense()Z
.locals 2
.prologue
.line 24
const/4 v0, 0x1 """//v0赋值为1"""
.line 24
.local v0, temoFlag:z
if-eqz v0, :cond_0 """//判断v0是否等于0,不符合条件向下走,符合条件执行cond_0分支"""
.line 25
const/4 v1, 0x1 """//符合条件支"""
.line 27
:goto_0
return v1
:cond_0
const/4 v1, 0x0 """//cond_0 分支"""
goto :goto_0
.end method
"""
如果符合if分支则程序往下走,最终return;
而如果条件不符合则会走到:cond_0分支,最终执行goto :goto0走回到:goto0返回。
"""
网友评论