
对一个 jar 进行反编译,发现有些代码并没有生成 java 代码,而是这样的结果:
/* JADX WARNING: Code restructure failed: missing block: B:4:0x0007, code lost: r2 = Companion.getClipDataUris$actvity_release(r3); */ /* Code decompiled incorrectly, please refer to instructions dump. */ public final java.util.List<android.net.Uri> parseResult(int r2, android.content.Intent r3) { /* r1 = this; r0 = -1 if (r2 != r0) goto L_0x0004 goto L_0x0005 L_0x0004: r3 = 0 L_0x0005: if (r3 == 0) goto L_0x0010 androidx.activity.result.contract.ActivityResultContracts$GetMultipleContents$Companion r2 = Companion java.util.List r2 = r2.getClipDataUris$activity_release(r3) if (r2 == 0) goto L_0x0010 goto L_0x0014 L_0x0010: java.util.List r2 = kotlin.collections.CollectionsKt.emptyList() L_0x0014: return r2 */ throw new UnsupportedOperationException("Method not decompiled: androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents.parseResult(int, android.content.Intent):java.util.List"); } 两个问题:
1 virusdefender 2024-03-24 14:03:29 +08:00 https://www.benf.org/other/cfr/ 试试这个,有些反编译器冷门的一些用法处理的不太好 |
2 secondwtq 2024-03-24 16:48:56 +08:00 这个看起来是 JVM 支持 goto ,但是 Java 不支持,然后你这个 bytecode 可能是 Kotlin 编译器生成的不是 Java 编译器生成的。你直接用 Java 构造可能会比较困难,但是对已有的 bytecode 做后处理达到这样的效果倒是有可能。 |
3 secondwtq 2024-03-24 16:50:46 +08:00 C/C++ 反编译里面这种情况非常常见,比如你用 Hex Rays 或者 GHIDRA 反编译稍微复杂一点的函数很容易出现一堆 label+goto 的结果,虽然源代码 90% 不是这么写的。其实就是 C/C++ 编译器优化得多 |
4 32uKHwVJ179qCmPj 2024-03-24 17:11:34 +08:00 多试几个反编译器 |
5 flyqie 2024-03-24 17:32:28 +08:00 via Android jadx-gui 逆向效果已经算不错的了吧。。 有这个问题。。可能只能手动看 bytecode 修了。。 |
6 naythefirst01 2024-03-24 21:37:04 +08:00 一般用到了比较少见的写法会解析错误,不排除使用了一些保护手段,jadx 和其他的反编译工具都有 smali code 的窗口吧,就是为了还原 Java code 不顺利时使用的,smali 比较直观 可以人肉翻译 或者直接丢给 GPT 让它给你翻译成 Java 代码 |
7 zhwguest OP 谢谢各位的热心指导。 反编译失败的原因一直没有搞太明白。今天明白了 goto 可能导致反编译失败原因之一,不知道还有没有其他方法。 |
8 Aresxue 2024-03-25 10:53:33 +08:00 多试几个好了。Cfr 、Procyon 、jadx ,一般 Java 的代码很少加混淆也没那个价值 |
9 zerofancy 2024-03-25 17:34:54 +08:00 多用点 Kotlin 协程,jadx 反编译后都是这种代码 |