18

是否有类似于 OllyDbg / SoftICE for 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 文件(使用编辑后的代码)。
4

2 回答 2

12

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

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

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

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

而且,当然,总是可以选择绕过整个 JVM 基础结构并简单地将调试器附加到 JVM 进程。在这个问题从那个问题链接的这个页面上有一些讨论。

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

于 2010-04-02T02:34:37.923 回答
2

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

于 2010-03-31T06:27:38.390 回答