需要帮助理解E8汇编call指令x86

20

我需要帮助理解以下汇编指令。在我看来,我正在调用一个地址,该地址的值为 someUnknownValue += 20994A?

E8 32F6FFFF - call std::_Init_locks::operator=+20994A
2个回答

65

你用来获取反汇编代码的工具试图通过给出调用目标作为从已知符号偏移的方式来提供帮助,但考虑到偏移量如此之大,它可能会感到困惑。

实际的调用目标可以按以下方式计算:

  • E8 是一个相对偏移的 call 命令。
  • 在 32 位代码段中,偏移量指定为有符号的 32 位值。
  • 该值以小端字节顺序表示。
  • 该偏移量是相对于下一条指令的地址而言的。

例如:

<some address>       E8 32 F6 FF FF         call <somewhere>
<some address>+5     (next instruction)
  • 偏移量为0xFFFFF632
  • 按带符号的32位值解释,这是-0x9CE
  • call指令位于<some address>处,长度为5个字节;下一条指令位于<some address> + 5处。
  • 因此,调用的目标地址为<some address> + 5 - 0x9CE

非常感谢。您的示例非常准确! - Michael
1
@Matthew call指令是否可以超过5个字节长?(在x86架构中,下一条指令是否可以在<某个地址>+6处?)在什么情况下? - Rafa
1
@Rafa,调用相对偏移指令为5个字节,因为最大相对偏移必须适合4个字节。如果目标距离超过2 ** 31个字节,则使用“mov reg,imm64; call reg”。 - Vladislav Ivanishin

-2

如果您正在使用反汇编器分析PE文件,则反汇编器可能会给出错误的代码。大多数恶意软件作者使用插入E8作为反反汇编技术。您可以验证上面的代码是否是跳转指令,其中跳转位置在E8之后。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接