代码如何知道API函数的地址?

时间:2014-02-21 14:39:01

标签: assembly dll portable-executable relocation

再一次,抱歉这个糟糕的头衔。

所以上周我一直在研究PE格式,但我并没有得到什么。当进程加载时,所有DLL都被映射到内存中。我不明白的是,因为DLL可以在随机基地址加载,.exe文件的代码如何能够知道API函数的地址?是否有一些“启动代码”,寻找Kernel32.dll或什么?我理解这个过程很容易用GetProcAddress查找函数,但是它如何获取GetProcAddress的地址?

1 个答案:

答案 0 :(得分:4)

所有Windows .EXE文件(以及所有.DLL文件,具体取决于其他.DLL文件)都有一个所谓的导入表。

此表包含所需的DLL和函数列表以及函数地址数组。

当.EXE文件加载到内存中时,Windows将在内部为所有DLL调用LoadLibrary,并为该.EXE文件所需的所有API函数调用GetProcAddress。它将使用GetProcAddress返回的值填充imports表中的数组。

如果GetProcAddress返回NULL,则该值不会写入数组,但加载.EXE文件将失败!