【问题标题】:How does code know the addresses of API functions?代码如何知道 API 函数的地址?
【发布时间】:2014-03-23 03:22:14
【问题描述】:

再次抱歉,标题不好。

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

【问题讨论】:

    标签: assembly dll portable-executable relocation


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 导入的地址总是一样的吗?它将如何获得这个地址?另外,每个加载的 DLL 是否有不同的导入表,还是只有 1 个导入表,每个 DLL 的所有函数都加载到其中?
    • dll 知道函数的地址在其空间内的位置。操作系统(和 dll)知道整个 dll 在空间中的位置。应用程序和 dll 都知道函数的名称,因此应用程序向 dll 询问每个函数,此时 dll 和/或操作系统从导入表中知道每个项目的位置并告诉应用程序
    • 那么当我调用 LoadLibrary 时,它会自动将地址等添加到 IAT 中吗?
    猜你喜欢
    • 1970-01-01
    • 2012-02-20
    • 2016-09-04
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2012-02-15
    • 1970-01-01
    相关资源
    最近更新 更多