一个关于 Java 反编译的问题

2024-03-24 13:52:18 +08:00
 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 ? 感谢
2583 次点击
所在节点    Java
10 条回复
virusdefender
2024-03-24 14:03:29 +08:00
https://www.benf.org/other/cfr/ 试试这个,有些反编译器冷门的一些用法处理的不太好
secondwtq
2024-03-24 16:48:56 +08:00
这个看起来是 JVM 支持 goto ,但是 Java 不支持,然后你这个 bytecode 可能是 Kotlin 编译器生成的不是 Java 编译器生成的。你直接用 Java 构造可能会比较困难,但是对已有的 bytecode 做后处理达到这样的效果倒是有可能。
secondwtq
2024-03-24 16:50:46 +08:00
C/C++ 反编译里面这种情况非常常见,比如你用 Hex Rays 或者 GHIDRA 反编译稍微复杂一点的函数很容易出现一堆 label+goto 的结果,虽然源代码 90% 不是这么写的。其实就是 C/C++ 编译器优化得多
32uKHwVJ179qCmPj
2024-03-24 17:11:34 +08:00
多试几个反编译器
flyqie
2024-03-24 17:32:28 +08:00
jadx-gui 逆向效果已经算不错的了吧。。

有这个问题。。可能只能手动看 bytecode 修了。。
naythefirst01
2024-03-24 21:37:04 +08:00
一般用到了比较少见的写法会解析错误,不排除使用了一些保护手段,jadx 和其他的反编译工具都有 smali code 的窗口吧,就是为了还原 Java code 不顺利时使用的,smali 比较直观 可以人肉翻译 或者直接丢给 GPT 让它给你翻译成 Java 代码
zhwguest
2024-03-24 23:37:43 +08:00
谢谢各位的热心指导。
反编译失败的原因一直没有搞太明白。今天明白了 goto 可能导致反编译失败原因之一,不知道还有没有其他方法。
Aresxue
2024-03-25 10:53:33 +08:00
多试几个好了。Cfr 、Procyon 、jadx ,一般 Java 的代码很少加混淆也没那个价值
zerofancy
2024-03-25 17:34:54 +08:00
多用点 Kotlin 协程,jadx 反编译后都是这种代码
secondwtq
2024-03-25 23:21:51 +08:00
@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