调用 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 /2
2 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.
奇怪,这个可执行文件是如何创建的?我不认为编译器会那样做。
这个语法是什么意思?
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 /2
2 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.
奇怪,这个可执行文件是如何创建的?我不认为编译器会那样做。