为了显示我的意思,这是从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下运行。
#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
评论
是否有特定原因必须为十六进制?我猜没有像这样的工具,因为没有人需要它。但是写一个并不难。附言tableswitch和lookup开关指令的最大长度为64kb,因此您将无法在一行上容纳十六进制。
@IgorSkochinsky-十六进制的要求是使提供的值与十六进制编辑器显示的内容匹配,而无需转换基数。
正如我所想,这是XY问题的典型示例。
@Witnobfigo那么如何找到一个能够显示十进制数字的十六进制编辑器(这很容易一点)呢?