一个关于 Java 反编译的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhwguest
V2EX    Java

一个关于 Java 反编译的问题

  •  
  •   zhwguest 2024-03-24 13:52:18 +08:00 2754 次点击
    这是一个创建于 633 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    有这个问题。。可能只能手动看 bytecode 修了。。
    naythefirst01
        6
    naythefirst01  
       2024-03-24 21:37:04 +08:00
    一般用到了比较少见的写法会解析错误,不排除使用了一些保护手段,jadx 和其他的反编译工具都有 smali code 的窗口吧,就是为了还原 Java code 不顺利时使用的,smali 比较直观 可以人肉翻译 或者直接丢给 GPT 让它给你翻译成 Java 代码
    zhwguest
        7
    zhwguest  
    OP
       2024-03-24 23:37:43 +08:00
    谢谢各位的热心指导。
    反编译失败的原因一直没有搞太明白。今天明白了 goto 可能导致反编译失败原因之一,不知道还有没有其他方法。
    Aresxue
        8
    Aresxue  
       2024-03-25 10:53:33 +08:00   1
    多试几个好了。Cfr 、Procyon 、jadx ,一般 Java 的代码很少加混淆也没那个价值
    zerofancy
        9
    zerofancy  
       2024-03-25 17:34:54 +08:00
    多用点 Kotlin 协程,jadx 反编译后都是这种代码
    secondwtq
        10
    secondwtq  
       2024-03-25 23:21:51 +08:00   1
    @zhwguest 不是说"goto 导致反编译失败",所有 control flow 到字节码里面都是 goto ,只是反编译器能不能从 goto 里面还原出原来的 control flow 来。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5215 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 47ms UTC 08:33 PVG 16:33 LAX 00:33 JFK 03:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86