调用cs:label指令



这个语法是什么意思?

call cs:label

例如,我遇到过这样的指令:

call cs:MessageBoxA

为什么不像

call MessageBoxA?


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


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

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

但是它有一个不正常的CS前缀,我敢说。Windows(像其他主流x86操作系统一样)使用平面内存模型,所有CS/DS/ES/SS的段基址= 0。因此,CS前缀对从。

加载的地址没有实际影响。

2E确实是一个CS段覆盖前缀,而FF /22是(接近)call r/m32(https://www.felixcloutier.com/x86/call),所以它看起来像是一个接近(不远)call cs:[disp32]

这是一个真正的段覆盖前缀,而不是一个由过于有用的反汇编器添加的默认提示。(就像有些人会把mov eax, ds:label,即使没有DS段覆盖前缀)

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


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

最新更新