Asm CALL指令 - 它是如何工作的?

时间:2013-01-19 16:13:11

标签: c++ c windows assembly x86

我希望在Windows环境(PE可执行文件)中有一个明确的解释,CALL XXXXXXXXXXXXXXX指令如何工作。我一直在研究PE格式,但我对CALL ADDRESS指令,从dll导入函数以及CALL ADDRESS如何在DLL中找到代码之间的关系感到很困惑。除了ASLR和其他安全功能可能会移动DLL,可执行文件如何处理这个?

2 个答案:

答案 0 :(得分:9)

它(即直接调用具有正常相对调用的导入)不起作用,这就是为什么不是这样做的原因。

要调用导入的函数,请执行称为导入地址表(IAT)的操作。简而言之,IAT中的条目首先指向函数名称(即它从Import Name Table的副本开始),并且这些指针被更改为指向加载器的实际函数。

IAT位于固定地址,但如果图像已被重新定位,则可以重新定位,因此调用它只涉及单个间接 - 因此call r/m与内存操作数一起使用(这只是一个简单的常量)调用导入的函数,例如call [0x40206C]

答案 1 :(得分:0)

链接器。链接可执行文件时,链接器将替换并基于所有DLL地址。由于虚拟内存,所有进程都加载到相同的基址,从而使寻址更容易。因为DLL是PIL(位置无关代码),所以加载器可以为应用程序重新定义DLL。因为代码引用了liker可以重定位的符号,所以它永远不需要关心它的位置。

编辑:刚刚意识到其中一些是关闭的 - Linux动态库是PIL,而Windows则不是(这就是为什么我们必须根本改变)。