38.安卓逆向-壳-smali语法2(条件语句和for循环)
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于:图灵Python学院
本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。
工具下载:
链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd=6tw3
提取码:6tw3
复制这段内容后打开百度网盘手机App,操作更方便哦
上一个内容:37.安卓逆向-壳-smali语法1
上一个内容里写了java转smali,本次接着继续
然后是条件判断的smali写法如下图
首先它的执行过程,用颜色区分
然后编码转文字的方式,使用谷歌浏览器的控制台(打开谷歌浏览器然后按F12可以打开控制台)就可以,如下图
代码说明
代码
.class public Lcom/example/course1/Samli;
.super Ljava/lang/Object;
.source "Samli.java"# static fields
.field private static flag:Ljava/lang/String;.field public static run:Z# instance fields
.field public name:Ljava/lang/String;.field public num:I# direct methods
.method static constructor <clinit>()V.registers 1.prologue.line 4const-string v0, "jb666"sput-object v0, Lcom/example/course1/Samli;->flag:Ljava/lang/String;.line 7const/4 v0, 0x1sput-boolean v0, Lcom/example/course1/Samli;->run:Zreturn-void
.end method.method public constructor <init>()V.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()Vreturn-void
.end method.method public static func2(I)Ljava/lang/String;.registers 2 #用到两个寄存器.param p0, "num" #I这里把入参的内存地址给p0寄存器.prologue.line 10const/16 v0, 0x64 #0x64是十六进制数,它的十进制是100,正好对应java中的100if-lt p0, v0, :cond_7 #如果p0小于v0就跳转到cond_7.line 11const-string v0, "\u4f18\u79c0" #这俩\u4f18\u79c0是utf8编码,它俩代表的中文是优秀,然后这里把\u4f18\u79c0赋值给v0.line 15:goto_6return-object v0 #把v0的值进行返回.line 12:cond_7const/16 v0, 0x50 #0x50是十六进制数,它的十进制是80,正好对应java中的80if-lt p0, v0, :cond_e #如果p0的值小于v0,也就是p0的值小于入参的值就跳转到cond_e.line 13const-string v0, "\u666e\u901a" #这俩\u666e\u901a是utf8编码,它俩代表的中文是普通,然后这里把\u666e\u901a赋值给v0goto :goto_6 #跳转到goto_6位置进行做返回.line 15:cond_econst-string v0, "\u53ca\u683c" #这俩\u53ca\u683c是utf8编码,它俩代表的中文是及格,然后这里把\u53ca\u683c赋值给v0goto :goto_6 #跳转到goto_6位置进行做返回
.end method
循环语句
.class public Lcom/example/course1/Samli;
.super Ljava/lang/Object;
.source "Samli.java"# static fields
.field private static flag:Ljava/lang/String;.field public static run:Z# instance fields
.field public name:Ljava/lang/String;.field public num:I# direct methods
.method static constructor <clinit>()V.registers 1.prologue.line 4const-string v0, "jb666"sput-object v0, Lcom/example/course1/Samli;->flag:Ljava/lang/String;.line 7const/4 v0, 0x1sput-boolean v0, Lcom/example/course1/Samli;->run:Zreturn-void
.end method.method public constructor <init>()V.registers 1.prologue.line 3invoke-direct {p0}, Ljava/lang/Object;-><init>()Vreturn-void
.end method.method public static func2(I)Ljava/lang/String;.registers 2.param p0, "num" # I.prologue.line 10const/16 v0, 0x64if-lt p0, v0, :cond_7.line 11const-string v0, "\u4f18\u79c0".line 15:goto_6return-object v0.line 12:cond_7const/16 v0, 0x50if-lt p0, v0, :cond_e.line 13const-string v0, "\u666e\u901a"goto :goto_6.line 15:cond_econst-string v0, "\u53ca\u683c"goto :goto_6
.end method.method public static func3(Ljava/lang/String;)V.registers 6.param p0, "arg1" # Ljava/lang/String;.prologue.line 20const/4 v3, 0x3 #把数字3给v3new-array v2, v3, [Ljava/lang/String;#创建数据组的内存空间,空间v3个const/4 v3, 0x0 #这意思是数组下标0const-string v4, "\u590f\u6d1b"#这里的意思是数组的值aput-object v4, v2, v3#这意思是把v4的值放到v2里下标v3的位置上const/4 v3, 0x1 #这意思是数组下标0const-string v4, "aa" #这里的意思是数组的值aput-object v4, v2, v3 #这意思是把v4的值放到v2里下标v3的位置上const/4 v3, 0x2 #这意思是数组下标0const-string v4, "bb" #这里的意思是数组的值aput-object v4, v2, v3 #这意思是把v4的值放到v2里下标v3的位置上.line 21.local v2, "nameArray":[Ljava/lang/String;#把v2的值给到nameArrayconst/4 v0, 0x0.local v0, "idx":I#把v0的值给到idx:goto_13array-length v3, v2#把v2的长度取出来给到v3if-ge v0, v3, :cond_20#如果v0的值大于v3的值就跳转到cond_20,也就是结束循环.line 22aget-object v1, v2, v0#这意思是把v2下标v0位置的值给到v1.line 23.local v1, "item":Ljava/lang/String;#把v1的值给到item,也就是对应java的 String item = nameArray[idx];这一句sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;#然后获取System.out.println方法的地址invoke-virtual {v3, v1}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V#调用方法v3是方法地址v1是方法的入参.line 21add-int/lit8 v0, v0, 0x1#v0自增1也就是idx++goto :goto_13#然后跳到goto_13位置,也就是进行下一轮循环.line 25.end local v1 # "item":Ljava/lang/String;:cond_20return-void
.end method