代码之家  ›  专栏  ›  技术社区  ›  Ran Biron

是否有Java的反汇编程序+调试器(ALE OLYDBG/SOFIST用于汇编程序)?

  •  15
  • Ran Biron  · 技术社区  · 15 年前

    有类似于Java的OLYDBG/SOFIST的实用程序吗?也就是说,执行类(从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
    

    这对拆卸部分来说是可以的(没有分析不是很好-“field 4 is example.i”),但是我找不到其他两个“工具”:

    1. 一个调试器,它检查指令本身(包括堆栈、内存转储等),允许我检查实际的代码和环境。
    2. 反向处理的一种方法-编辑反汇编的代码并重新创建.class文件(使用编辑的代码)。
    2 回复  |  直到 15 年前
        1
  •  11
  •   Community CDub    7 年前

    我不认为这是一个完整的答案,但一些可能提供一些可行的建议:

    (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++相比)导致了这种类型的需求稀少,而这种类型的工具也是如此。

        2
  •  2
  •   Slava Imeshev    15 年前

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

    推荐文章