【问题标题】:How to get the address that one machine instruction write to?如何获取一条机器指令写入的地址?
【发布时间】:2012-05-07 23:27:11
【问题描述】:

现在我从 EIP 寄存器中得到了一个机器指令的地址。这条机器指令可以改变某个内存区域的值,我确实想要但无法获得这块内存的地址。

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

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

【问题讨论】:

  • 使用调试器 - 在该指令的地址处设置断点,然后在遇到断点时检查 EIP - 这是唯一可靠的方法。
  • 但是 EIP 是指令的地址,对吗?我仍然无法获得该指令将写入的地址。
  • 我认为@PaulR 说错了;尽管如此,您仍然必须使用反汇编程序(或内置工具)或编写自己的知道如何反汇编 x86 操作码的工具。
  • @geekosaur,我已经编写了自己的调试工具,它是一个简单的调试器,没有符号支持和反汇编支持。但似乎很难反汇编 x86 操作码。
  • 抱歉 - 我的意思是“检查相关寄存器”,当然不是“检查 EIP”。

标签: linux debugging disassembly instructions


【解决方案1】:

如果你知道 EIP 指向的机器码并且只想反汇编它,请执行以下操作(我以你的 0x8b0c4d8b 为例):

#创建二进制文件 $ echo -en "\x8b\x0c\x4d\x8b" > foo.bin #拆开它 $ objdump -D -b 二进制 -m i386 foo.bin foo.bin:文件格式二进制 .data 部分的反汇编: 00000000 : 0: 8b .byte 0x8b 1: 0c 4d 或 $0x4d,%al 3:8b .byte 0x8b

因此,在这种情况下,它不会更改任何内存位置,但如果更改了,您可以从汇编代码中轻松查看。

编辑: 从 cmets 看来,您希望以编程方式执行此操作。看看udis86。它允许examining operands 的指令。对于 ARM,请参阅 disarm

【讨论】:

  • 这在一般情况下不起作用 - 仅适用于硬编码地址(即,当涉及基于寄存器的寻址时) - 唯一可靠的方法是在调试器下运行代码并检查相关的寄存器。
  • @PaulR:是的,我知道。我提供了这个答案,因为 OP 提到他不能使用调试器。
  • 是的 - 我不知道“我不能使用像 gdb 这样的调试工具”是指“我不知道如何使用像 gdb 这样的调试工具”还是“那里是一些技术原因为什么我不能使用像gdb这样的调试工具吗?
  • 有一些技术原因我不能使用它。我希望这个过程由我自己的进程完成,这就是我编写一个较小的调试器的原因。
  • @AlanGame: udis86 是一个库,你可以从你自己的进程中调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-07
相关资源
最近更新 更多