有没有用于java的反汇编器+调试器(ala OllyDbg / SoftICE for assembler)?

2022-09-02 13:49:00

有没有类似于OllyDbg / SoftICE的java实用程序?即执行类(从jar/具有类路径),并且在没有源代码的情况下,显示中间代码的分解,能够单步执行/单步执行/搜索引用/编辑内存中的特定中间代码/将编辑应用于文件...

如果没有,是否有可能写这样的东西(假设我们愿意在调试期间没有热点)?

编辑:我不是在谈论JAD或JD或Cavaj。这些都是很好的反编译器,但我不想要一个反编译器,原因有几个,最值得注意的是它们的输出不正确(充其量,有时只是完全错误)。我不是在寻找一个神奇的“编译字节到java代码” - 我想看看即将执行的实际字节。另外,我希望能够更改这些字节(就像在程序集调试器中一样),并希望将更改的部分写回类文件。

Edit2:我知道javap存在 - 但它只做一种方式(没有任何分析)。示例(代码取自 vmspec 文档):在 java 代码中,我们使用“javac”来编译以下内容:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

到 java .class 文件。使用javap -c,我可以得到这个输出:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

这对于拆卸部分来说是可以的(没有分析就不是很好 - “字段#4是Example.i”),但我找不到另外两个“工具”:

  1. 一个调试器,它检查指令本身(使用堆栈,内存转储等),允许我检查实际的代码和环境。
  2. 一种反转过程的方法 - 编辑反汇编的代码并重新创建.class文件(使用编辑的代码)。

答案 1

我不认为这真的是一个完整的答案,但一些指针可能会提供一些可行的东西:

(1)在查看和直接使用字节码方面,旧的BCEL类构造工具包可能很有用(它是我所知道的唯一字节码的GUI编辑器)。

(2)在调试和单步执行字节码方面,这个与Eclipse调试器集成的Eclipse插件可以满足您的需求。

我不知道有任何实用程序可以组合这些功能,并允许您在执行代码时操作字节码(至少以与OllyDbg等相同的方式)。但是,Java调试器API应该能够支持在运行时操作代码(但是,考虑到HotSpot和JIT的一般性质,我不知道是否有可能在调用之前重写指令---当前正在执行的字节码操作码实际上是解释器如何选择实现op的抽象, 与本机代码不同,在本机代码中,反汇编的操作码实际上是发送到CPU的指令)。或者,您可以查看 Java Instrumentation API,它提供了一种在运行时重新定义字节代码的方法。当然,任何各种开源字节码操作库都可能提供帮助或提供灵感。

当然,总有一种选择是绕过整个JVM基础设施,简单地将调试器附加到JVM进程。在这个问题中以及从该问题链接的此页面上有一些讨论

然而,底线是,你似乎试图完成的事情,虽然在原生代码世界中很常见,但在Java世界中并不是那么普遍的做法(使用Java的部分原因是从所有血腥的细节中抽象出来)。这一点,以及字节代码反编译的相对琐碎的性质(与C++相比)导致了这种类型的需求稀缺的情况,这种类型的工具也是如此。


答案 2

看看 JAD Decomplier 用于反编译 Java 代码。然后,可以使用生成的源运行 IDE 的内置调试器。IDE 可以是 IntelliJ、Eclipse 或 NetBeans。这种方法不是完全自动的,但它应该完成这项工作。