【问题标题】:How DLL's resolve its IAT?DLL 如何解析其 IAT?
【发布时间】:2012-05-20 22:22:59
【问题描述】:

当我在我的进程中加载​​ dll 时,该 dll 如何解析它导入的函数的地址? 我试图在 GetProcAddress 和 LdrGetProcedureAddress 上设置断点,但它没有在那里中断。

请人解释一下。

【问题讨论】:

  • 好吧,事实并非如此。它是负责处理它的 Windows 加载程序。它不需要使用 GetProcAddress,它可以直接访问导入表中的原始数据。这需要很快。
  • 您是想做一些具体的事情还是只是好奇?
  • 如果你想在加载DLL时中断,你可以使用windbg:stackoverflow.com/questions/1366051/…
  • 我想挂钩函数CreateWindowExW/A,主要问题是该函数不是直接从主可执行模块调用而是主要从comctl32.dll,shlwapi.dll等调用,我试过了做 IAT/EAT 挂钩,但没有奏效。 Rohitab API Monitor(rohitab.com) 成功地挂钩了该功能,但我不知道它是如何做到的......

标签: c++ windows winapi dll portable-executable


【解决方案1】:

加载 DLL 时,加载程序将根据需要更新所有地址以反映加载 DLL 的基地址。

http://msdn.microsoft.com/en-us/magazine/bb985014.aspx

创建 DLL 时,链接器假定 DLL 将在 具体地址。某些代码和数据包含 只有当 DLL 在 首选地址。但是,在运行时可能 操作系统可能必须在不同的内存中加载 DLL 位置。

为了处理操作系统必须移动 DLL 的情况,链接器 将基址重定位添加到 DLL。基址重定位是 需要修改,以便它们包含正确的地址 DLL 在内存中加载的位置。 DLL 的基址重定位越多, 操作系统需要处理它们并加载 DLL 的时间越多。一种 基于正确的 DLL 在其首选地址加载,并且可以跳过 处理基地重定位记录。

现在更常见的是 DLL 的基地址被随机化作为一种​​安全措施,上面的文章早于那篇文章。另见:

Relocation (Wikipedia)

Portable Executable (Wikipedia)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多