【问题标题】:Need help understanding E8 asm call instruction x86需要帮助理解 E8 asm 调用指令 x86
【发布时间】:2012-05-09 17:53:42
【问题描述】:

我需要帮助才能理解以下组装说明。在我看来,我正在调用 someUnknownValue += 20994A 的地址?

E8 32F6FFFF - call std::_Init_locks::operator=+20994A

【问题讨论】:

    标签: assembly x86 disassembly


    【解决方案1】:

    无论您使用什么来获得反汇编,都试图提供帮助,方法是将调用的目标作为它知道的某个符号的偏移量 - 但鉴于偏移量如此之大,它可能会感到困惑。

    调用的实际目标可以计算如下:

    • E8 是具有相对偏移量的 call
    • 在 32 位代码段中,偏移量指定为带符号的 32 位值。
    • 此值采用 little-endian 字节顺序。
    • 偏移量是从以下指令的地址开始测量的。

    例如

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

    【讨论】:

    • 非常感谢您。你的例子是正确的!
    • @Matthew 调用指令的长度可以超过 5 个字节吗? (在 x86 架构中。下一个指令可以在 + 6 处)吗?在什么情况下?
    • @Rafa,调用相对偏移量指令为 5 个字节,因为最大相对偏移量必须适合 4 个字节。如果目标距离超过 2**31 个字节,则使用mov reg, imm64; call reg
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 2014-01-14
      相关资源
      最近更新 更多