首页
社区
课程
招聘
[原创]新人小试牛刀,纯属无聊之举
发表于: 2014-4-25 20:35 6815

[原创]新人小试牛刀,纯属无聊之举

2014-4-25 20:35
6815
打扰看雪诸君,本人菜鸟,不懂规矩之处还请诸君见谅。
本人因技术不行,菜鸟一个,所以只能借花献佛了,原地址: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},那么,也是一种实现爆破的方式。
总结:爆破方法不为一。在不知道如何删减实现爆破,却知道最终的地点目标是哪句的时候,不如自己增加自己的跳转点,使其在开始就被跳转到自己的最终目的地,其目的都是一样的,或者是将判断的对象弄成同一个,也能如此。本人的无聊之举,让诸君费时观看了,不好意思,耽误诸君时间了。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
2
嗯,所以在Android上用smali搞破解,和写代码是一样的,比二进制修补轻松多了。写得漂亮,继续努力~
2014-4-25 23:33
0
雪    币: 335
活跃值: (313)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
smali是中间语句,所以可以任意修改...
so只能用hex值进行换算修改...
2014-5-6 12:43
0
雪    币: 427
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
smali比较灵活些
2014-5-6 14:15
0
雪    币: 18
活跃值: (430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
smali 就跟源码差不多...
2014-5-6 16:57
0
雪    币: 215
活跃值: (51)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
XD 跟WIN的爆破差不多
2014-9-3 22:50
0
雪    币: 250
活跃值: (251)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主继续加油~
2014-9-4 11:08
0
游客
登录 | 注册 方可回帖
返回
//