如何解决调用 cs:label 指令
这个语法是什么意思?
call cs:label
例如我遇到过这样的指令:
call cs:MessageBoxA
为什么不是这样:
call MessageBoxA
?
我发现 IDA Pro (v6.8) 中的指令反汇编了一些 Win exe
文件的代码。
这是指令的十六进制操作码:2E FF 15 24 01 6C 00
解决方法
这是通过存储在内存中该符号地址的函数指针进行的调用。这对于 DLL 调用来说是正常的;动态链接更新指针。
但它有一个不正常的 CS 前缀,AFAIK。 Windows(与其他主流 x86 操作系统一样)使用平面内存模型,所有 CS/DS/ES/SS 的段基地址 = 0。所以 CS 前缀对加载的地址没有实际影响。
2E
really is 是 CS 段覆盖前缀,FF /2
2 是(接近)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。
奇怪,这个可执行文件是如何创建的?我不认为编译器会这样做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。