【问题标题】:Why we do we use DS to call procedures?为什么我们使用 DS 来调用程序?
【发布时间】:2017-06-05 05:03:25
【问题描述】:

在反转时,我们看到一些模块间调用,例如 call dword ds:[004000238h]call dword ptr ds:_imp_atoi
为什么它使用数据段而不是使用代码段(CS)?

【问题讨论】:

    标签: assembly x86 reverse-engineering


    【解决方案1】:

    call dword ds:[004000238h] 是一个间接近调用,它读取 004000238h 处的 DWORD 值并使用它进行调用。

    请注意,方括号和dword ptr 是用于确定指令类型的位置。

    由于指令的操作数是内存操作数,DS 被隐式用于读取它(反汇编程序在使用段覆盖语法显示它时很迂腐)。

    调用是近的(保护模式下的远调用很少见并且带有特殊的语义)所以CS 的当前值不会改变。
    我们可以说CS 被隐式使用,因为调用是相对于CS 的当前值。

    Intel manual 3 描述了protected mode 中的调用机制。

    附带说明,即使对于 32 位系统,分段也被有效禁用(所有描述符都以零为基数),因此您可以忘记选择器寄存器,但对于 TLS 和 SEH(通常使用 fs/ gs 注册)。

    【讨论】:

    • 为什么即使在c中的静态链接模块中我们也需要导入地址表。我认为 IAT 用于动态链接
    • @user7445340 很难说没有具体的例子,但 Windows API 主要是作为用户空间 DLL 实现的。 C 运行时仍然需要加载像 user32kernel32 这样的库。
    猜你喜欢
    • 2011-01-04
    • 2022-11-06
    • 1970-01-01
    • 2012-01-26
    • 2012-09-01
    • 2011-07-12
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多