64位的java字节码

时间:2011-08-30 05:30:47

标签: java

我查看了x86_64bit机器的指令集并尝试匹配,但遗憾的是没有得到任何解决方案。我不想要确切的答案,只是询问有人知道解决这个问题的步骤,或者是否有任何工具可以解决它。

感谢您的时间

2 个答案:

答案 0 :(得分:3)

首先,将该字节流写入文件。使用它比使用字符串更容易。有很多方法可以解决我刚才首先考虑的特定问题(可能非常不理想):

  

echo -n`echi ba000000004885ff74144889fa8b073b02480f4cd7488b7f084885ff75ef4889d0c3 | sed's /(..)/ \\ x \ 1 / g'`> f.bin

现在您可以使用各种工具来反汇编文件:

e.g。

  

ndisasm -b 64 f.bin

-b选择64位默认模式

  

objdump -D -b binary -m i386:x86-64:intel f.bin

-D表示反汇编所有部分,-b binary指定文件是二进制文件(而不是目标文件),-m i386:x86-64:intel选择64位x86-64解码英特尔语法。

您还可以查看opcode map来解码流。我们开始时看到BAB8+r匹配MOV r16/32/64 imm16/32/64。由于该指令没有REX前缀,因此它是r32 imm32版本。在这种情况下是r == 0xBA-0xB8 == 2,查看“32/64位ModR / M字节”表,我们看到redx。紧接着在接下来的4个字节中(在这种情况下它是0)。换言之,该指令解码为:

mov edx, 0 

下一条指令以REX.W前缀(48)开头,后跟TEST r/m16/32/64 r16/32/6485)。您应该能够自己解码跟随ModR字节。

最后提示:您可能希望查看objdump s --adjust-vma命令行选项。

答案 1 :(得分:0)

使用gdb。您可以在序列中定义数据字节,然后使用反汇编操作。如果您需要扩展这个答案,请告诉我。

修改即可。因为这是家庭作业,你应该手工完成。

sandpile.org上的解码表非常好。单击“一个字节操作码”开始。

您的机器语言是:

ba000000004885ff74144889fa8b073b02480f4cd7488b7f084885ff75ef4889d0c3

所以你的第一个字节是ba。在表中查找。它说MOV rDX,Iv (r10,Iv)。没有REX前缀,所以它是进入edx。要了解Iv,请转到http://www.sandpile.org/x86/opc_enc.htm。在这里,我们看到大写I表示立即,小写v是单词或双字或qword。当您进入edx时,您有一个dword,所以请查看ba之后的下一个8字节。它们都是零,因此您的第一条指令是mov edx, 0。痛苦,是的,但它是功课。如果您还没有涵盖这些解码表的使用,那么请使用user786653答案中提供的漂亮技术。