0

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

请有人解释。

4

1 回答 1

3

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

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

创建 DLL 时,链接器假定 DLL 将加载到特定地址。某些代码和数据包含硬编码地址,仅当 DLL 在首选地址加载时才是正确的。但是,在运行时,操作系统可能不得不将 DLL 加载到不同的内存位置。

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

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

搬迁(维基百科)

便携式可执行文件(维基百科)

于 2012-05-21T01:06:21.607 回答