一个关于 Java 反编译的问题

245 天前
 zhwguest

对一个 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. 什么情况下会出现这种问题,比如注释中写明了 Code restructure failed: misseing block ,那是不是我们估计构造这样的代码可以增加反编译难度;
  2. 经常发现代码反编译不成功的额时候,会用一段注释将其描述出来,这段描述也不是标准的字节码,那重新对这个 java 文件直接进行编译能够得到原来的 class 文件么?
  3. 有没有办法指定给反编译器,当反编译为 java 不成功的时候,直接使用字节码反编译,方便后续再次编译为 class ? 感谢
2106 次点击
所在节点    Java
10 条回复
virusdefender
245 天前
https://www.benf.org/other/cfr/ 试试这个,有些反编译器冷门的一些用法处理的不太好
secondwtq
245 天前
这个看起来是 JVM 支持 goto ,但是 Java 不支持,然后你这个 bytecode 可能是 Kotlin 编译器生成的不是 Java 编译器生成的。你直接用 Java 构造可能会比较困难,但是对已有的 bytecode 做后处理达到这样的效果倒是有可能。
secondwtq
245 天前
C/C++ 反编译里面这种情况非常常见,比如你用 Hex Rays 或者 GHIDRA 反编译稍微复杂一点的函数很容易出现一堆 label+goto 的结果,虽然源代码 90% 不是这么写的。其实就是 C/C++ 编译器优化得多
32uKHwVJ179qCmPj
245 天前
多试几个反编译器
flyqie
245 天前
jadx-gui 逆向效果已经算不错的了吧。。

有这个问题。。可能只能手动看 bytecode 修了。。
naythefirst01
244 天前
一般用到了比较少见的写法会解析错误,不排除使用了一些保护手段,jadx 和其他的反编译工具都有 smali code 的窗口吧,就是为了还原 Java code 不顺利时使用的,smali 比较直观 可以人肉翻译 或者直接丢给 GPT 让它给你翻译成 Java 代码
zhwguest
244 天前
谢谢各位的热心指导。
反编译失败的原因一直没有搞太明白。今天明白了 goto 可能导致反编译失败原因之一,不知道还有没有其他方法。
Aresxue
244 天前
多试几个好了。Cfr 、Procyon 、jadx ,一般 Java 的代码很少加混淆也没那个价值
zerofancy
244 天前
多用点 Kotlin 协程,jadx 反编译后都是这种代码
secondwtq
243 天前
@zhwguest 不是说"goto 导致反编译失败",所有 control flow 到字节码里面都是 goto ,只是反编译器能不能从 goto 里面还原出原来的 control flow 来。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1026486

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX