BindImageEx 实际上是做什么的?

逆向工程 视窗 聚乙烯
2021-06-13 21:04:48

文档如果我理解正确,此函数会预先计算导入的 DLL 的虚拟地址并将它们写入图像的 IAT(前提BIND_NO_UPDATE是未设置为参数)。我的理解是您对图像(文件中)执行此操作以使其启动速度更快。

  • windows加载器如何知道图像已经被绑定(并且不需要计算虚拟地址)?
  • PE 文件DllCharacteristics中(在可选标头中),有一个名为NO_BIND. BindImageEx如果设置了失败吗?
  • 是什么区别BIND_NO_BOUND_IMPORTSBIND_NO_UPDATE如果它唯一的更新是对IAT?
1个回答

Windows Loader 知道导入是绑定的,因为绑定进程也会写入绑定模块的时间戳

假设 x.exe 绑定到 y.dll
y.dll 在它的 peheader 中有一个 TimeDateStamp
当绑定时它在 _IMAGE_BOUND_IMPORT_DESCRIPTOR 中写入 y.dll 的
TimeDateStamp

0:000> dt ole32!_IMAGE_BOUND_IMPORT_DESCRIPTOR
   +0x000 TimeDateStamp    : Uint4B
   +0x004 OffsetModuleName : Uint2B
   +0x006 NumberOfModuleForwarderRefs : Uint2B
0:000>

有问题的 Api 有一个回调 StatusRoutine,
当您通过 noupdate 时,将在绑定过程中调用该回调,该回调仍将被调用,
您可以进行一些检查并可能在那里采取行动,但不影响 exe

BIND_NO_BOUND_IMPORTS 不写入新的 ImportTable

引用文档

BIND_NO_BOUND_IMPORTS 0x00000001

不要生成新的导入地址表。

BIND_NO_UPDATE 0x00000002

不要对文件进行更改。