繁体   English   中英

当jmp到2个指令之间的地址时会发生什么?

[英]What happens when jmp to the address in between 2 instructions?

我正在查看程序的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
...

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

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

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

因此,我想购买这样一个事实,即反汇编在某些时候在地址中被触发,它与它所说的调用0x ...,0x之前的指令...的事实无关。一个“回归”。 如果地址在某处有偏移,那就不是真的

我的第一个猜测是在0x804809d插入了一些填充数据。 意味着该部分的反汇编应该从0x804809f开始。

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

是的,这是一个可能的事情,虽然值得一提的是这里的对齐问题: 为什么代码应该与x86上的偶数地址边界对齐?

我看到为什么可以这样做的几种可能性:

  • 自修改代码(当启动后将实际有意义的指令写入该地址时)
  • 将一条指令的数据解释为操作码(类似这样
  • 只是错误的跳转地址(甚至可能是编译错误,但没有必要)

可变字长指令集的反汇编是棘手的我猜你是不是在看实际代码或者反汇编程序有麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM