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

...)但是我不明白的是:
为什么IDA在函数名称前添加ds:? br />如果我正确地假设FF 15是段寄存器,则无需将其指定为Near调用,即在同一段内部调用函数。为什么IDA仍要添加ds,这又有什么用?

#1 楼

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

为了精确地指定该内存位置,CPU需要段寄存器和地址。在没有显式请求(例如,对于CS为2E)或没有隐式替代(使用EBP选择SS :)的模式下,将使用DS:。尽管Windows使用平面内存模型,但没有阻止段寄存器分配其他值的方法:例如32位Windows支持本地描述符表条目,并且有些技巧为DS:赋予FS:的值执行非显而易见的SEH注册。

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

评论


您写道:“为了精确地指定该存储位置,CPU需要段寄存器和地址。”我认为近距离通话不需要任何分段信息。我以为near调用是“同一段内的函数调用”。我想念什么吗?

– gogo_gorilla
15年4月24日在17:37

也许是“为了指定要从中获取的位置”,然后?从这个意义上说,“ near”是指返回地址,而不是指从中获取它的位置。 Near调用仅将返回地址放在堆栈中。远端调用将选择器和返回地址都放在堆栈中。

–彼得·弗里
2015年4月24日18:27



现在明白了。感谢您的进一步澄清。

– gogo_gorilla
15年4月24日在20:16