2012-04-27 77 views
1

现在我已经从EIP寄存器获得了机器指令地址。这个机器指令可以改变某个区域的内存的值,我想要但不能得到这个内存的地址。如何获取一条机器指令写入的地址?

当然,我可以从机器指令的地址读取数据,但内容是机器指令,如:0x8b0c4d8b ......,它是不可读的(我不能使用gdb等调试工具)。

如何获取一条机器指令将写入的地址?

+1

使用调试器 - 在该指令的地址中设置断点,然后在断点处检查EIP - 这是唯一可靠的方法。 – 2012-04-27 08:00:04

+0

但EIP是指令的地址,我说得对吗?我仍然无法获得该指令将写入的地址。 – zsounder 2012-04-27 08:12:39

+0

我觉得@PaulR misspoke;尽管如此,仍然有必要使用反汇编程序(或者内置一个工具)或编写自己的工具来知道如何反汇编x86操作码。 – geekosaur 2012-04-27 08:16:15

回答

1

如果你知道机器代码EIP点,只是想和你拆开它,做这样的事情(我把你的0x8b0c4d8b为例):

 
#create binary file 
$ echo -en "\x8b\x0c\x4d\x8b" > foo.bin 

#disassemble it 
$ objdump -D -b binary -m i386 foo.bin 

foo.bin:  file format binary 


Disassembly of section .data: 

00000000 : 
    0: 8b      .byte 0x8b 
    1: 0c 4d     or  $0x4d,%al 
    3: 8b      .byte 0x8b 

因此,在这种情况下,这不是”不改变任何内存位置,但如果它确实如此,你可以很容易地从汇编代码中看到它。

编辑:从评论看来,你想以编程方式做到这一点。看看udis86。它允许examining operands的说明。对于ARM,请参阅disarm

+0

抱歉,我的示例0x8b0c4d8b不是一个好的。 – zsounder 2012-04-27 08:26:00

+0

尽管这在一般情况下不起作用 - 仅适用于硬编码地址(即不涉及基于寄存器的寻址时) - 唯一可靠的方法是在调试器下运行代码并检查相关寄存器(s) 。 – 2012-04-27 08:34:07

+0

@PaulR:是的,我知道。我提供了这个答案,因为OP提到他不能使用调试器。 – Job 2012-04-27 08:35:11