调用 PE 文件中的导入函数:为什么目标前面带有 ds(调用 ds:func_name)?

逆向工程 艾达 拆卸 部件 反汇编者 分割
2021-06-10 10:04:50

在 Windows PE 文件(32 位和 64 位)中,对导入函数的调用在 IDA PRO 中如下所示:

call    ds:SetEvent              // default setting
call    [ds:SetEvent]            // Target Assembler set to TASM

我明白它的作用(间接调用,导入表,...)但我不明白:为什么 IDAds:在函数名前添加我检查了操作码,这FF 15意味着接近呼叫。

如果我假设它ds是段寄存器是正确的,则无需将其指定为近调用意味着调用同一段内的函数。

有人能解释一下为什么 IDAds:无论如何都要添加它以及它有什么好处吗?

1个回答

FF 15 是绝对的间接调用。它在内存位置获取值,然后将控制权转移到获取的地址。

为了精确指定内存位置,CPU 需要段寄存器和地址。在没有显式请求(例如 CS 的 2E)或具有隐式覆盖的模式(使用 EBP 选择 SS:)时,使用 DS:。尽管 Windows 使用平面内存模型,但没有什么可以阻止段寄存器为它们分配其他值:例如,32 位 Windows 支持本地描述符表条目,并且有一些技巧,其中 DS: 被赋予 FS: 的值,以执行非明显的 SEH 注册。

IDA 显示段寄存器以消除关于正在使用哪个段寄存器的任何歧义。