这个语法是什么意思?
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 /2
2是(接近)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。
奇怪,这个可执行文件是怎么创建的?我不认为编译器会这样做。