linux反编译查找bug,利用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;->()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对应的代码

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值