打扰看雪诸君,本人菜鸟,不懂规矩之处还请诸君见谅。
本人因技术不行,菜鸟一个,所以只能借花献佛了,原地址:http://www.kanxue.com/bbs/showthread.php?t=147356
本人性喜钻牛角尖,对于新鲜事物喜欢多方面做,只为实现一个目的。
原文也介绍了修改if的跳转,在此基础上,我发现了一个好玩的东西。急不可耐想与诸君分享。
# virtual methods
.method public onKey(Landroid/view/View;ILandroid/view/KeyEvent;)Z
.locals 4
.parameter "arg0"
.parameter "arg1"
.parameter "arg2"
.prologue
const/4 v3, 0x1
.line 28
const-string v0, "gogo"
.line 30
.local v0, str:Ljava/lang/String;
const-string v1, "11"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v1
if-eqz v1, :cond_0
.line 31
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
#getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
invoke-static {v1}, Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;
move-result-object v1
invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 32
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
const-string v2, "right++"
invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v1
invoke-virtual {v1}, Landroid/widget/Toast;->show()V
.line 40
:goto_0
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
#getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
invoke-static {v1}, Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;
move-result-object v1
const/4 v2, 0x7
invoke-static {v1, v2}, Landroid/text/util/Linkify;->addLinks(Landroid/widget/TextView;I)Z
.line 41
const/4 v1, 0x0
return v1
.line 35
:cond_0
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
#getter for: Lirdc/ex05_01/EX05_01;->mTextView01:Landroid/widget/TextView;
invoke-static {v1}, Lirdc/ex05_01/EX05_01;->access$0(Lirdc/ex05_01/EX05_01;)Landroid/widget/TextView;
move-result-object v1
invoke-virtual {v1, v0}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
.line 36
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
const-string v2, "error--"
invoke-static {v1, v2, v3}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v1
invoke-virtual {v1}, Landroid/widget/Toast;->show()V
goto :goto_0
.end method
这一整段中,我们在原文中所知道的修改方式如下:
1、将const-string v0, "gogo"与const-string v1, "11" 两者的引号部分改为一样的。
2、if-eqz v1, :cond_0 中,将if-eqz改成if-nez,‘if-eqz’:如果vx == 0 ,跳转到目标。‘if-nez’:如果vx != 0,跳转到目标。
那么,我所发现好玩的东西是:
将if-eqz v1, :cond_0 中的:cond_0改成:cond_1,然后在.line 31下方添加:cond_1,这样一样能达成我们所要求的爆破的目的,因为无论条件语句if所判断的语句是否成立,它的最终执行的目标都是落在同一个地点。
那么,还有更好玩的东西,如下:
第一种方式
原代码:
if-eqz v1, :cond_0
.line 31
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
修改后:
if-nez v1, :cond_0
.line 31
goto :cond_0
iget-object v1, p0, Lirdc/ex05_01/EX05_01$1;->this$0:Lirdc/ex05_01/EX05_01;
编译执行,会发现,就算if-eqz改成了if-nez,但因为强制跳转的作怪,使得修改后的程序依然跟没修改的原程序执行结果一样。故而,在一些特殊情况,是否可以直接使用强制跳转goto来实现爆破的目的。
第二种方式
原代码:
.line 28
const-string v0, "gogo" //理解为v0 = “gogo”
.line 30
.local v0, str:Ljava/lang/String;
const-string v1, "11" //理解为v1 = “11”
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z // 理解为检测v0,v1两个数是否等值
move-result v1//理解为将上一次方法的返回值赋值到v1,即:equals(Ljava/lang/Object;)Z得到的返回值给
if-eqz v1, :cond_0//理解为若v0与v1不等,false,返回值为0的时候,跳转到目标 :cond_0执行方法,若v0与v1相等,ture,返回值为1的时候,执行下面的程序。注: if-eqz的意思是,若判断对象的值==0时,执行目标跳转。
故而,我们又得到一种方法,将 invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z中的 invoke-virtual {v0, v1}内中的两个值,即:v0,v1修改成一样的,比如 invoke-virtual {v1, v1},那么,也是一种实现爆破的方式。
总结:爆破方法不为一。在不知道如何删减实现爆破,却知道最终的地点目标是哪句的时候,不如自己增加自己的跳转点,使其在开始就被跳转到自己的最终目的地,其目的都是一样的,或者是将判断的对象弄成同一个,也能如此。本人的无聊之举,让诸君费时观看了,不好意思,耽误诸君时间了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!