调用 cs:label 指令

call cs:label instruction

这个语法是什么意思?

call cs:label

例如我运行进入这样的指令:

call cs:MessageBoxA

为什么不像:

call MessageBoxA?


我在一些 Win exe 文件的 IDA Pro (v6.8) 反汇编代码中发现了该指令。

这是指令的十六进制操作码:
2E FF 15 24 01 6C 00

这是通过存储在该符号地址的内存中的函数指针进行的调用。这对于 DLL 调用是正常的;动态链接更新指针。

但是它有一个不正常的 CS 前缀,AFAIK。 Windows(与其他主流 x86 操作系统一样)使用平面内存模型,所有 CS/DS/ES/SS 的段基地址 = 0。所以 CS 前缀对加载的地址没有实际影响。


2E really is a CS segment-override prefix, and FF /22 is (near) call r/m32 (https://www.felixcloutier.com/x86/call),所以看起来是近(不远)call cs:[disp32].

这是一个真正的段覆盖前缀,而不是提醒过度有用的反汇编程序散布的默认值。 (有些人会放置 mov eax, ds:label,即使没有 DS 段覆盖前缀。)

脚注 2:在八进制中,0x15 ModRM 字节是 025/r 字段是位 [5:3],就在顶部 2 位模式字段的下方。所以操作码是 FF /2.


奇怪,这个可执行文件是如何创建的?我不认为编译器会那样做。