我正在寻找一个Java字节码反汇编程序,其输出包括字节码本身,其操作数以及它们在.class文件中的地址,并且以十六进制而不是十进制显示数字。

为了显示我的意思,这是从Javap输出中摘录的几行内容:我发现的每个Java字节码反汇编程序(我在Google上花费了很多时间,并下载了几种不同的方法)尝试)产生的输出与此基本相同。有些格式或装饰略有不同;有些人用精美的GUI替换了命令行界面;但其中没有一个显示.class文件中指令的地址,也不显示字节码本身-有几个声称显示字节码,但实际上都没有,它们只显示代表字节码的文本助记符,而不是字节码本身。此外,它们都以十进制而不是十六进制显示数字信息。

这里是上述输出的编辑版本,我已经手工对其进行了转换,以生成我要查找的事物的示例for:

private java.text.SimpleDateFormat createTimeFormat();
  Code:
   Stack=3, Locals=2, Args_size=1
   0:    new    #84; //class java/text/SimpleDateFormat
   3:    dup
   4:    ldc    #17; //String yyyy-MM-dd'T'HH:mm:ss
   6:    invokespecial    #87; //Method java/text/SimpleDateFormat."<init>":(Ljava/lang/String;)V
   9:    astore_1


行开头的地址与.class文件中指令的位置相对应,就像在普通的hexdump中会发现的那样。显示了字节码及其操作数的十六进制表示形式,反汇编则显示了十六进制常量。

是否有任何可用的东西可以产生类似于此的输出?字段是否顺序不同并不重要,只要它们都在此即可。它必须在Linux上本机运行或在Java下运行。

评论

是否有特定原因必须为十六进制?

我猜没有像这样的工具,因为没有人需要它。但是写一个并不难。附言tableswitch和lookup开关指令的最大长度为64kb,因此您将无法在一行上容纳十六进制。

@IgorSkochinsky-十六进制的要求是使提供的值与十六进制编辑器显示的内容匹配,而无需转换基数。

正如我所想,这是XY问题的典型示例。

@Witnobfigo那么如何找到一个能够显示十进制数字的十六进制编辑器(这很容易一点)呢?

#1 楼

也许rader2是您想要的。观看此屏幕截图:



评论


谢谢-它并不完美,但是比我设法找到的任何东西都要好得多。

– Witnobfigo
13年5月11日在23:28

#2 楼

如果只需要在原始文件中查找需要更改的字节,则IDA在状态栏中显示原始文件的偏移量。您还可以在十六进制视图中检查操作码。



#3 楼

我不知道会执行此操作的反汇编程序,但是我编写了具有字节码输出模式的Java反编译器。它是开源的,可以很容易地进行修改以满足您的需求。随时在这里查看。

评论


顺便说一句,什么是“华尔街”程序员? (根据您的个人资料)

–起搏器
16年1月23日在3:17



@Pacerier哦,我只是在纽约的金融业工作,特别是在高频交易中。

–迈克·斯特罗贝尔(Mike Strobel)
16年1月24日在15:16