...)但是我不明白的是:
为什么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