对一个 jar 进行反编译,发现有些代码并没有生成 java 代码,而是这样的结果:
/* JADX WARNING: Code restructure failed: missing block: B:4:0x0007, code lost:
r2 = Companion.getClipDataUris$activity_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 237 天前
https://www.benf.org/other/cfr/ 试试这个,有些反编译器冷门的一些用法处理的不太好
|
2
secondwtq 237 天前
这个看起来是 JVM 支持 goto ,但是 Java 不支持,然后你这个 bytecode 可能是 Kotlin 编译器生成的不是 Java 编译器生成的。你直接用 Java 构造可能会比较困难,但是对已有的 bytecode 做后处理达到这样的效果倒是有可能。
|
3
secondwtq 237 天前
C/C++ 反编译里面这种情况非常常见,比如你用 Hex Rays 或者 GHIDRA 反编译稍微复杂一点的函数很容易出现一堆 label+goto 的结果,虽然源代码 90% 不是这么写的。其实就是 C/C++ 编译器优化得多
|
4
32uKHwVJ179qCmPj 237 天前
多试几个反编译器
|
5
flyqie 237 天前 via Android
jadx-gui 逆向效果已经算不错的了吧。。
有这个问题。。可能只能手动看 bytecode 修了。。 |
6
naythefirst01 237 天前
一般用到了比较少见的写法会解析错误,不排除使用了一些保护手段,jadx 和其他的反编译工具都有 smali code 的窗口吧,就是为了还原 Java code 不顺利时使用的,smali 比较直观 可以人肉翻译 或者直接丢给 GPT 让它给你翻译成 Java 代码
|
7
zhwguest OP 谢谢各位的热心指导。
反编译失败的原因一直没有搞太明白。今天明白了 goto 可能导致反编译失败原因之一,不知道还有没有其他方法。 |
8
Aresxue 236 天前 1
多试几个好了。Cfr 、Procyon 、jadx ,一般 Java 的代码很少加混淆也没那个价值
|
9
zerofancy 236 天前
多用点 Kotlin 协程,jadx 反编译后都是这种代码
|