2014-02-21 48 views
1

再一次,对于不好的标题感到抱歉。代码如何知道API函数的地址?

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

回答

4

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

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

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

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

+1

导入的地址是否始终相同?它如何获得这个地址?此外,是否有每个加载的DLL的不同导入表,还是只有一个导入表,其中每个DLL的所有功能都加载到哪里? – user2073973

+0

dll知道函数的地址在哪里。操作系统(和dll)知道dll作为一个整体在太空中的位置。应用程序和dll都知道函数的名称,因此应用程序会针对每个函数询问dll,并且此时dll和/或操作系统会从导入表中知道每个项目所在的位置,并告知应用程序 –

+0

因此,当我调用LoadLibrary,它会自动将地址等添加到IAT中吗? – user2073973