Java Decompiler

(java-decompiler.github.io)

74 points | by mooreds 4 days ago ago

31 comments

  • uneven9434 5 hours ago

    More modern choices are JADX (https://github.com/skylot/jadx) or Vineflower (https://github.com/Vineflower/vineflower). If you want a paid, higher-quality option, try JEB (https://www.pnfsoftware.com/).

    • embedding-shape a minute ago

      Any of these modern choices include features using LLMs to further decompile the decompiled code? Seems like an obvious direction, even just to infer variable names.

  • drtse4 4 hours ago

    Sadly it's not maintained anymore and even the intellijidea-derived decompilers are better nowadays (used to be horrible until a few years ago).

    In addition to the limitation to classfiles built for Java8, it sadly has a hard time decompiling new language features even if compiled for a Java8 target. And then there is the well known bug that decompiling full jars in bulk does not get you the same output you see in the UI but orders of magnitude worse... jd was great until it lasted, helped me solve a lot of issues with verdors over the years.

    • p0w3n3d 2 hours ago

      The most annoying thing in intellij (fernflower is it) is that it does not maintain correct line numbers, so when debugging, there is a divergence. Still you need to download sources but not always they are available

      • khannn 7 minutes ago

        I've only seen that with transient dependencies that are instantiated via Reflections

  • winrid 7 hours ago

    Vineflower is probably what you want nowadays

  • VonGuard 4 hours ago

    I think this is popping up in Hacker News because the concept of decompilers has become a bit more acceptable recently. (strokes beard)Time was, decompilation was said to be Impossible (as my wise friend syke said: most things people say are impossible are just tedious). Then, it just became "something you could only do in a targeted, single-application fashion.)

    Somewhere in there, Alan Kaye laughed and handed everyone dynamic code.

    These days, with AI in tow, decompilation is becoming the sort of thing that could be in the toolchain, replacing IDA and such. Why debug and examine when you can literally decompile?!

    So, maybe, that idea being considered to be newly on the table, someone felt the need to post a counter-point, proving once again that everything old is new again.

    Hats off for decomiling Java apps that mostly predate generics and annotations... both of which were added in 5.

    • branko_d 3 hours ago

      Is there anything especially hard about decompiling (to) Java?

      .NET/C# decompilers are widespread and generally work well (there is one built into Visual Studio nowdays, JetBrains have their own, there were a bunch of stand-alone tools too back in the the day).

      • leibnitz27 2 hours ago

        < disclaimer - I wrote CFR, which is one of the original set of 'modern' java decompilers >

        Generic erasure is a giant pain in the rear. C# doesn't do this. You don't actually keep any information about generics in the bytecode, however some of the metadata is present. BUT IT COULD BE FULL OF LIES.

        There's also a huge amount of syntactic sugar in later java versions - take for example switch expressions.

        https://www.benf.org/other/cfr/switch_expressions.html

        and OH MY GOD FINALLY

        https://www.benf.org/other/cfr/finally.html

        • Brybry an hour ago

          You're awesome! I had really good experiences with CFR in the mid 2010s.

          I used it for game modding and documentation (and caught/reported a few game bugs + vulnerabilities along the way). I'd pull game files from Steam depots with steamkit, decompile with CFR, and run the resulting java through doxygen.

    • darkamaul 4 hours ago

      One of the use case of décompilation is bug hunting / vulnerability research. And that’s still one of the use cases where AI isn’t that good because you must be precise.

      I’m not saying that won’t change but I still see a bright future for reversing tools, with or without AI sidekicks (like the BN plugin)

      • hhh 3 hours ago

        I used codex 5.1 yesterday to point at a firmware blob and let it extract and explore it targeting a specific undisclosed vulnerability and it managed (after floundering for a bit) to read the Lua bytecode and identify and exploit the vuln on a device running the firmware.

      • never_inline an hour ago

        If anything, vulnerability research should be good target for AI because failure to find an exploit isn't costly (and easily verified) but 1 in N success is very useful.

  • j16sdiz 7 hours ago

    This one haven't been updated for 5 years and do not support any newer java features.

    • jbn 2 hours ago

      which new feature are not supported?

  • Igor_Wiwi 3 hours ago

    Or you can use https://jar.tools/ - online java decompiler I built some time ago. Runs in your browser

    • ur-whale 2 hours ago

      > Runs in your browser

      You say it like it's a good thing.

      • Igor_Wiwi 2 hours ago

        yes, because you don't need to install anything on your machine

  • almosthere 2 hours ago

    next, add a feature that does a pass with an llm that makes local variable names more realistic and adds comments.

  • Sanjay_22_xd 2 hours ago

    What is the use of decompiling, is there any real time use case?

  • mberning 7 hours ago

    A great tool for digging into obscure jar and class files. I used it many times to track down very obscure bugs in Java based products. Often you will have a vendor saying that your issue is not real or not reproducible on their end. But with this kind of tool you can peek behind the curtains and figure out how to trigger some condition 100% of the time.

    • ternaryoperator 6 hours ago

      It had better be really old Java code. This decompiler supports only through Java 8. We're on Java 24 now.

      • esafak 5 hours ago

        Java 8 is your everyday corporate code ...

        • tombert 5 hours ago

          Didn't Oracle drop support for Java 8 like six years ago? I'm sure there are plenty of companies still running it, but even Apple (a relatively conservative company in this regard) updated to Java 11 when I was there in ~2019.

        • rileymichael 4 hours ago

          this isn't really the case. a lot of legacy code may still be running the version it was developed against, but java 17+ has a sizable share of the ecosystem now that all of the popular libraries require it. spring for example bumped their baseline to jdk 17 in 2022.

          • bzzzt 2 hours ago

            Doesn't really matter if you're using an old Spring version with the old Java version. Spring offers enterprise support for Spring framework 5 which still supports Java 8.

            But organizations still using Java 8 will most likely use some kind of Java Enterprise application server with vendor support. IBM will support Websphere with Java 8 until at least 2030 and maybe longer if customers keep paying. I'd guess Oracle has a similar policy.

        • heisenbit 4 hours ago

          It used to but Oracle‘s licensing and probably more important security guidelines from the very top linking CVE scores to mandatory updates got things moving on the last years.

        • anta40 an hour ago

          What about Android? Hmm....

        • krzyk 5 hours ago

          Nope, we are on Java 25