利用smali代码去解决jadx出bug时的反编译问题

jadx可以很方便的进行反编译、但是有时候会增加了一些破坏代码后 、jadx就不能正常的解码出java代码。比如这段代码就是出错后的代码:

     /*
        r0 = isMediaUri(r9);
        r1 = 0;
        if (r0 != 0) goto L_0x0008;
    L_0x0007:
        return r1;
    L_0x0008:
        if (r9 == 0) goto L_0x0057;
    L_0x000a:
        r8 = r8.getContentResolver();
        r4 = 0;
        r5 = 0;
        r6 = 0;
        r7 = 0;
        r2 = r8;
        r3 = r9;
        r9 = r2.query(r3, r4, r5, r6, r7);	 Catch:{ Exception -> 0x0053, all -> 0x004b }
        r0 = r9.moveToFirst();	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        if (r0 == 0) goto L_0x0041;
    L_0x001e:
        r0 = 0;
        r0 = r9.getInt(r0);	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        r2 = "video";
        r2 = r10.contains(r2);	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        r3 = 1;
        if (r2 == 0) goto L_0x0033;
    L_0x002c:
        r4 = (long) r0;	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        r8 = android.provider.MediaStore.Video.Thumbnails.getThumbnail(r8, r4, r3, r1);	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
    L_0x0031:
        r1 = r8;
        goto L_0x0041;
    L_0x0033:
        r2 = "image/*";
        r10 = r10.contains(r2);	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        if (r10 == 0) goto L_0x0041;
    L_0x003b:
        r4 = (long) r0;	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        r8 = android.provider.MediaStore.Images.Thumbnails.getThumbnail(r8, r4, r3, r1);	 Catch:{ Exception -> 0x0049, all -> 0x0047 }
        goto L_0x0031;
    L_0x0041:
        if (r9 == 0) goto L_0x0057;
    L_0x0043:
        r9.close();
        goto L_0x0057;
    L_0x0047:
        r8 = move-exception;
        goto L_0x004d;
        goto L_0x0054;
    L_0x004b:
        r8 = move-exception;
        r9 = r1;
    L_0x004d:
        if (r9 == 0) goto L_0x0052;
    L_0x004f:
        r9.close();
    L_0x0052:
        throw r8;
    L_0x0053:
        r9 = r1;
    L_0x0054:
        if (r9 == 0) goto L_0x0057;
    L_0x0056:
        goto L_0x0043;
    L_0x0057:
        return r1;
        */

那怎么读懂这个代码呢?借助AndroidKiller来看smali代码,还原这个成java代码。
先看一段java 代码

        int shhh=3;
        boolean r0 = isMediaUri(r9);

        if (r0) {
            shhh=5;
        }


        if (!r0) {
            shhh=8;
        }

        System.err.println("shhh "+shhh);

对应的smali代码是这样

 const/4 v0, 0x3

    .line 326
    .local v0, "shhh":I
    invoke-static {p1}, Lcom/bbbbb/ccccc/FileUtils;->isMediaUri(Landroid/net/Uri;)Z

    move-result v1

    .line 328
    .local v1, "r0":Z
    if-eqz v1, :cond_0

    .line 329
    const/4 v0, 0x5

    .line 333
    :cond_0
    if-nez v1, :cond_1

    .line 334
    const/16 v0, 0x8

    .line 337
    :cond_1
    sget-object v2, Ljava/lang/System;->err:Ljava/io/PrintStream;

    new-instance v3, Ljava/lang/StringBuilder;

    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V

    const-string v4, "shhh "

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    invoke-virtual {v3}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v3

    invoke-virtual {v2, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V

很显然,根据这个转换我们很方便就可以解读出如下代码

        /*
        r0 = isMediaUri(r9);
        r1 = 0;
        if (r0 != 0) goto L_0x0008;

这段转成java就是这样子

        boolean r0 = isMediaUri(r9);
        if (!r0) {
            //goto L_0x0008;
            //去执行 L_0x0008对应的代码
        }

其他的依次类推,你学会了吗。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值