是否有类似于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;
}
到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”),但我找不到另外两个“工具”:
答案 0 :(得分:11)
我认为这不是一个完整的答案,而是一些可能提供可行的指示:
(1)在查看和直接使用字节码方面,旧BCEL Class Construction Kit可能很有用(它是我所知道的字节码的唯一GUI编辑器)。
(2)在调试和单步执行字节码方面,this Eclipse plugin与Eclipse的调试器集成可能满足您的需求。
我不知道任何组合这些功能的实用程序,并允许您在执行代码时操作字节码(至少与OllyDbg中的方式相同,等等)。但是,Java debugger API应该能够支持在运行时操作代码(尽管考虑到HotSpot和JIT的性质,我不知道是否可以在它之前重写一条指令。调用---当前正在执行的字节码操作码实际上是解释器选择如何实现操作的抽象,不同于本机代码,其中反汇编的操作码实际上是发送给CPU的指令。或者,您可以查看Java Instrumentation API,它提供了一种在运行时重新定义字节代码的方法。当然,any of the various open source bytecode manipulation libraries可以帮助或提供灵感。
当然,总是可以选择绕过整个JVM基础架构,只需将调试器附加到JVM进程即可。对in this question和this page linked from that question进行了一些讨论。
然而,最重要的是,你似乎想要完成的东西虽然在本机代码世界中很常见,但在Java世界中并不常见(使用原因的部分原因) Java是所有血腥细节的抽象。这个以及字节代码反编译的相对微不足道的性质(与C ++相比)导致了这种类型的需求很少的情况,这种类型的工具也是如此。答案 1 :(得分:2)
查看JAD Decomplier以反编译Java代码。然后,您可以使用生成的源运行IDE的内置调试器。 IDE可以是IntelliJ,Eclipse或NetBeans。这种方法并不是完全自动的,但应该可以胜任。