当前位置: 首页 > 面试题库 >

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

慕迪
2023-03-14
问题内容

是否有类似于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文件(带有已编辑的代码)。

问题答案:

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

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

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

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

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

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



 类似资料:
  • 问题内容: 是否有任何Linux程序可以反汇编OSX通用x86 / x86_64胖Mach-O二进制文件,如objdump?GNU binutils的objdump支持ELF和Windows PE文件,但不支持Mach-O。 问题答案: AFAIK,本地的Darwin二进制工具是cctools软件包的一部分。它们没有与GNU binutils 相同的命令行语法或输出。但是后来的binutils(即

  • 1. 汇编程序的Hello world 之前我们学习了如何用C标准I/O库读写文件,本章详细讲解这些I/O操作是怎么实现的。所有I/O操作最终都是在内核中做的,以前我们用的C标准I/O库函数最终也是通过系统调用把I/O操作从用户空间传给内核,然后让内核去做I/O操作,本章和下一章会介绍内核中I/O子系统的工作原理。首先看一个打印Hello world的汇编程序,了解I/O操作是怎样通过系统调用传给

  • 我试图理解这个简单的C程序: 当它在汇编代码中时: 第三线和第四线发生了什么 为什么必须使用另外两个寄存器(edi和eax)来代替rsp DWORD PTR[rbp-4]实际发生了什么

  • 1. 最简单的汇编程序 例 18.1. 最简单的汇编程序 #PURPOSE: Simple program that exits and returns a # status code back to the Linux kernel # #INPUT: none # #OUTPUT: returns a status code. This can be viewed # by ty

  • 我正在为64位mips机器使用gcc编译器。我注意到生成的一段汇编代码很有趣。下面是详细信息: 通常,bnez将立即跳到0xb0。但在0xb0之后的块中,我确信程序必须使用a1作为参数。但是我们可以看到,在0xb0之后,a1从未出现在块中。 但是a1在0x58中使用,就在bnez(0x54)之后。 那么0x54和0x58指令有可能同时执行吗?超标量处理器通过同时将多条指令分派到处理器上的冗余功能单

  • 说实话绝影就等着张厂长把他的研究成果公布出来,这样才能当场找出其中的纰漏并当场将他驳回。你想我绝影做到这里能弄出个反汇编器来,已经是突破性进展了,张厂长还能比我牛? 于是他平静地说:"说来听听,看看你有啥好法子。" 张厂长哪里知道绝影心里的算盘,他还是和平时一样一本正经严肃认真一丝不苟地说道:"这几天我去他们车间调研了,其实开始我们都想复杂了。他们的芯片和主机通过穿口通信,类似于一问一答……" "