是否有用于Java的反汇编程序+调试器(用于汇编程序的ala OllyDbg / SoftICE)?

发布于 2021-01-30 17:45:24

是否有类似于Java的OllyDbg / SoftICE的实用程序?即执行类(从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文件(带有已编辑的代码)。
关注者
0
被浏览
95
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

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

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

    (2)就调试和逐步执行字节码而言,与Eclipse的调试器集成在一起的Eclipse
    插件可能会满足您的需求。

    我不知道有任何实用程序可以组合这些功能,并允许您在执行代码时操作字节码(至少以与OllyDbg等相同的方式)。但是,Java
    调试器API应该能够支持在运行时对代码进行操作(尽管从总体上讲,由于HotSpot和JIT的本质,我不知道是否有可能在调用指令之前重写一条指令-
    -当前执行的字节码操作码实际上是解释器如何选择实现操作的一种抽象,与本机代码不同,在本机代码中,反汇编的操作码实际上是发送给CPU的指令。另外,您可以研究Java
    Instrumentation
    API
    ,该API提供了一种在运行时重新定义字节码的方法。而且当然,各种开源字节码操作库中的任何一个都可以帮助或提供启发。

    而且,当然,总是可以选择绕过整个JVM基础结构,而只是将调试器附加到JVM进程。此问题以及与此问题相关的链接此页面上都有一些讨论。

    然而,最重要的是,尽管您试图实现的目标虽然在本地代码世界中很普遍,但在Java世界中并不是一种普遍的做法(使用Java的部分原因是抽象性)从所有血腥细节)。这种情况以及字节码反编译的相对琐碎的本质(与C
    ++相比)导致了这种需求稀缺的情况,这种工具也是如此。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看