2016-11-09 89 views
0

对进口函数生成的我不知道如果我正确的措辞问题,但基本上我想知道是如何产生的调用指令调用从另一个库中导入函数时。如何调用指令得到一个编译的模块

例如

GetModuleFileName(...) 

被编译为

call 0x4D0000 

其中0x4D0000是导入的函数,它是动态的地址。

如何Windows中设置这些电话,并有可能绕过它并设置自定义地址来代替。

+1

您正在寻找的术语叫做* relocation。* – fuz

回答

1

调用语句中使用的地址不是动态的。这是一个相对地址,在链接时固定,就像调用任何其他函数一样。这是因为这个调用实际上是一个存根,并且这个存根执行间接跳转到这个实函数。间接跳转使用引用导入表中位置的内存操作数。当Windows加载可执行文件(或DLL)时,它将使用可执行文件或DLL在链接到的任何DLL中使用的所有函数的地址更新导入表。

所以,如果一个可执行这样的调用指令:

call [email protected] 

然后在其他地方在同一个可执行文件astub这样的:

[email protected]: 
    jmp [[email protected]] 

而且某处导入表有一个定义像这样:

[email protected]: 
    DD ? 

Windows设置值[email protected]在加载可执行文件(或DLL)时的导入表中。尽管在加载可执行文件(或DLL)后更改该值并不难,但您可以做些改变。请注意,导入表可能位于只读部分,这意味着您可能需要更改虚拟内存保护才能执行此操作。

相关问题