【发布时间】:2017-06-05 05:03:25
【问题描述】:
在反转时,我们看到一些模块间调用,例如 call dword ds:[004000238h] 或 call dword ptr ds:_imp_atoi。
为什么它使用数据段而不是使用代码段(CS)?
【问题讨论】:
标签: assembly x86 reverse-engineering
在反转时,我们看到一些模块间调用,例如 call dword ds:[004000238h] 或 call dword ptr ds:_imp_atoi。
为什么它使用数据段而不是使用代码段(CS)?
【问题讨论】:
标签: assembly x86 reverse-engineering
call dword ds:[004000238h] 是一个间接近调用,它读取 004000238h 处的 DWORD 值并使用它进行调用。
请注意,方括号和dword ptr 是用于确定指令类型的位置。
由于指令的操作数是内存操作数,DS 被隐式用于读取它(反汇编程序在使用段覆盖语法显示它时很迂腐)。
调用是近的(保护模式下的远调用很少见并且带有特殊的语义)所以CS 的当前值不会改变。
我们可以说CS 被隐式使用,因为调用是相对于CS 的当前值。
Intel manual 3 描述了protected mode 中的调用机制。
附带说明,即使对于 32 位系统,分段也被有效禁用(所有描述符都以零为基数),因此您可以忘记选择器寄存器,但对于 TLS 和 SEH(通常使用 fs/ gs 注册)。
【讨论】:
user32 和 kernel32 这样的库。