1

我在看一个程序的gdb反汇编

...
0x8048085: cmp    eax,ecx
0x8048087: je     0x804809f
0x8048089: mov    DWORD PTR [esp+0x4],0x21
0x8048091: mov    DWORD PTR [esp],0x8048160
0x8048098: jmp    0x8048157
0x804809d: mov    esi,0x115e8ba
0x80480a2: add    BYTE PTR [eax],al
...

在第二条指令中,有一个跳转到地址 0x...9f,它位于稍后的两条指令之间。我知道理论上一切都是可能的,因为只要我们向他提供要执行的地址,处理器就不应该关心,但仍然......如果有人可以解释,谢谢

更新:好的,地址似乎有问题。但这是更大代码(200 行)的片段。我查看了“调用 0x ...”的位置,并用标签替换了它们,代码如下所示:

func1:
   ...
   asm
   ...
   call func2
   ...
   ret
func2:
   ...
   asm
   ...
   ret
...

因此,尽管我很想购买反汇编在某个时候在地址中被绊倒的事实,但这与它所说的任何地方都调用 0x... 的事实无关,0x... 之前的指令是一个“退”。如果地址在某处有偏移量,这将是不正确的

4

3 回答 3

3

我的第一个猜测是在0x804809d. 这意味着该部分的反汇编应该从0x804809f.

根据列出的地址,反汇编也有可能在此过程的早期出现了一些错误。

于 2013-10-27T15:02:36.277 回答
1

是的,这是可能的,尽管这里值得一提的是对齐问题:Why should code bealigned to even-address boundary on x86?

我看到了为什么它可以完成的几种可能性:

  • 自修改代码(当实际有意义的指令将在开始后写入该地址时)
  • 将一条指令的数据解释为操作码(类似这样
  • 只是错误的跳转地址(甚至可能是编译器错误,但不是必需的)
于 2013-10-27T14:13:23.620 回答
0

可变字长指令集的反汇编很棘手,我猜你不是在看真正的代码,或者反汇编器有问题。

于 2013-10-27T15:13:04.473 回答