是否有java的反汇编程序和调试程序(ala OllyDbg/SoftICE for assembler)?

Ran*_*ron 17 java debugging system disassembly javap

是否有类似于OllyDbg/SoftICE for java的实用程序?即执行类(来自jar/with class path),并且在没有源代码的情况下,显示中间代码的反汇编,能够逐步执行/跳过/搜索引用/编辑内存中的特定中间代码/将编辑应用到文件中. .

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

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

Edit2:我知道javap存在 - 但它只有一种方式(并且没有任何分析).示例(代码取自vmspec文档):从java代码中,我们使用"javac"来编译:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}
Run Code Online (Sandbox Code Playgroud)

到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
Run Code Online (Sandbox Code Playgroud)

这对于反汇编部分是可以的(没有分析就不太好 - "字段#4是Example.i"),但我找不到另外两个"工具":

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

ig0*_*774 12

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

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

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

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

当然,总是可以选择绕过整个JVM基础架构,只需将调试器附加到JVM进程即可.在这个问题以及从该问题链接的此页面对此进行了一些讨论.

然而,最重要的是,你似乎想要完成的东西虽然在本机代码世界中很常见,但在Java世界中并不常见(使用Java的部分原因是抽象)从所有血淋淋的细节).这和字节码反编译的相对微不足道的性质(与C++相比)导致了这种类型的需求很少的情况,这种类型的工具也是如此.