【发布时间】:2014-05-05 22:37:30
【问题描述】:
对 DLL 函数的调用的地址修复是一个多阶段过程:链接器将调用指令定向到间接跳转指令,并将间接跳转指令定向到 .rdata 部分中的导入表中的内存字,Windows 程序在其中loader 将在运行时加载 DLL 时放置函数的地址。
间接跳转指令必须由链接器生成,因为编译器不知道函数会在 DLL 中。通过为每个函数只生成一个间接跳转指令,可以最小化程序文件的大小,无论从多少个地方调用它。
鉴于此,显而易见的方法是在所有目标文件中的所有编译器生成代码之后,在文本部分的末尾收集所有间接跳转指令,而这似乎确实是当我使用 Microsoft 链接器 /nodefaultlib 开关尝试了一个简单的测试用例(它生成了一个足够小的可执行文件,我可以理解完整的反汇编)。
当我以正常方式将一个小程序与 C 标准库链接时,生成的可执行文件足够大,我无法遵循所有的反汇编,但据我所见,间接跳转指令似乎分散在整个代码中,一次可能三个小组。
我失踪有什么原因吗?
【问题讨论】:
标签: windows dll linker reverse-engineering portable-executable