当我在我的进程中加载dll时,该dll如何解析它导入的函数的地址? 我试图在GetProcAddress和LdrGetProcedureAddress上设置断点,但它并没有在那里打破。
请有人解释。
答案 0 :(得分:3)
加载DLL时,如果需要,加载程序将更新所有地址以反映加载DLL的基址。
http://msdn.microsoft.com/en-us/magazine/bb985014.aspx:
创建DLL时,链接器假定DLL将加载到 特别地址。某些代码和数据包含 硬编码的地址只有在DLL加载时才正确 首选地址。但是,在运行时它可能是 操作系统可能必须将DLL加载到不同的内存中 位置。
要处理操作系统必须移动DLL,链接器的情况 将基本重定位添加到DLL。基址重定位是地址 需要修改,以便它们包含正确的地址 DLL在内存中加载的位置。 DLL具有的基址重定位越多, 操作系统需要处理它们和加载DLL的时间越多。一个 基于正确的DLL加载在其首选地址,并可以跳过 处理基地搬迁记录。
现在,将DLL的基地址作为安全措施随机化是比较常见的,上面的文章早于此。另见: