1

再次,抱歉标题不好。

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

4

1 回答 1

4

所有 Windows .EXE 文件(以及依赖于其他 .DLL 文件的所有 .DLL 文件)都有一个所谓的导入表。

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

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

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

于 2014-02-21T14:55:36.023 回答