更好地解释不同的 x86 CALL 变化

逆向工程 x86 部件
2021-06-12 04:11:35

希望对x86call指令有更好的解释我有点理解调用近和调用远。但我不完全理解细分市场。深入了解我的主要问题,我正在查看 IDA 中的二进制文件,其起始代码是:

push 0xdeadbeef
call near 0xdeadbeef
2个回答

您在现代二进制文件中遇到的 99% 的调用都是near.

  • call near(with opcode E8) 是相对于当前地址的调用,并且只影响?IP. 因此,它将操作数(字或双字)添加到下一条指令指针。它将操作数添加?IP
  • call far(with opcode 9A) 跳转到一个绝对段和 offset即,这就像设置 CS?IP一次。

内存实际上是按段组织的。在现代操作系统中,您通常不会弄乱段(CS在用户模式和内核模式下具有固定值),因此您不会出于任何原因更改它们。

实际段更改的罕见情况是作为反调试32/64b 模式混淆

段是进入一段内存的“窗口”。您可以将全部或部分内存映射到单个段中,多个段可以具有相同内存的重叠视图。远程调用或跳转允许您在这些窗口之间或之内移动。近距离呼叫或跳跃允许您仅在当前窗口内移动。

调用和跳转的唯一区别是调用将返回地址保存在堆栈上。对于远调用,返回选择器也保存在堆栈中。

但是,您的问题缺乏关于您到底想知道什么的足够详细信息。