DLL如何解决它的IAT?

时间:2012-05-20 22:23:00

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

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

请有人解释。

1 个答案:

答案 0 :(得分:3)

加载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)