需要帮助理解E8 asm调用指令x86

时间:2012-04-29 23:04:56

标签: assembly x86 disassembly

我需要帮助才能理解以下汇编指令。在我看来,我在someUnknownValue + = 20994A调用地址?

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

2 个答案:

答案 0 :(得分:49)

无论你使用什么来获得反汇编,都试图通过将调用的目标作为它所知道的某个符号的偏移量来提供帮助 - 但是考虑到偏移是如此之大,它可能会混淆。

可以按如下方式计算呼叫的实际目标:

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

e.g。

<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

答案 1 :(得分:-2)

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