http://ift.tt/2Gaml8x
java语言反编译 smali 汇编基础语法(4)之返回指令和循环、分支结构
返回指令
返回指令不多,有以下几种:
- return-void:返回一个void
- return-vAA:返回一个32位非对象类型的值,返回寄存器为8位
- return-wide vAA:返回一个64位非对象类型的值,返回寄存器为8位
- return-object vAA:返回一个对象类型
字符串操作
指令 | 说明 |
---|---|
const-string v0,”english string" | 英语字符串可以被直接解析 |
const-string v1,”\uxxx\uxxx" | unicode字符串是这种方式 |
const v3,0xxxxxx | 说明字符串存在于资源文件中,后面是资源的id |
选择结构
smali条件跳转分支的语法一般为:
if-<条件>v0,v1:cond_xx
如果v0<条件>v1成立,就跳转到cond_xx
判断关键字如下:
条件关键字 | 意思 |
---|---|
if-eq | if equal |
if-ne | if not equal |
if-lt | if less than |
if-le | if less or equal |
if-ge | if greater or equal |
if-eqz | if equal zero |
if-nez | if not equal zero |
if-ltz | if less than zero |
if-lez | if less equal zero |
if-gtz | if greater than zero |
if-gez | if greater equal zero |
循环结构
在smali中循环的实现就是通过无条件跳转语句goto加条件语句if-<条件>相结合实现
循环无非就是三张,for循环,while循环,do...while循环,判断的时候注意一下就好了
分支结构
分支结构在smali中有两种
第一种:case值是连续递增的
关键字是packed-switch
比如:
public void showPackedSw(int nNumber){
switch(nNumber){
case 0:{...}break;
case 1:{...}break;
case 2:{...}break;
}
}
这种的在smali汇编中一般展现为:
packed-switch p1,:pswitch_data_0 # p1为传递进来哟啊匹配case值的参数
:goto_0
#退出分支结构代码
:pswitch_0
#case 0时的程序代码
goto :goto_0 # 跳转到分支结构退出代码
:pswitch_1
#程序代码
goto:goto_0
#pswitch_2
goto:goto_0
:pswitch_data_0
.packed-switch 0x00 #case 值开始的地方,依次递增
:pswitch_0 #case 0:
:pswitch_1 #case 1:
:pswitch_2 #case 2:
.end packed-switch
第二种:case值可以为任意值
关键字为sparse-switch
比如:
public ShowTest(int nNumber){
switch(nNumber){
case 0x5:{....}break;
case 0xf:{...}break;
....
}
}
体现在汇编中就是
sparse-switch p1,:switch_data_0 #p1 传进来的参数
:goto_0 #case 出口
#代码
:pswitch_0 #case 5跳转到这里
#case值等于5时的程序代码
goto:goto_0
:pswitch_1
#程序代码
goto:goto_0
:pswitch_data_0
.sparse-swich #case值开始的地方,依次递增
0x5->:pswitch_0 #case 0x5
0xf->:pswtich_1 #case 15
.end packed-switch
The post java语言反编译 smali 汇编基础语法(4)之返回指令和分支结构 appeared first on cole.
http://ift.tt/2DyyCGb Smali, smali January 24, 2018 at 02:31PM
评论
发表评论