【问题标题】:Load-time dynamic linking (import library) search order加载时动态链接(导入库)搜索顺序
【发布时间】:2012-06-28 18:17:15
【问题描述】:

如果我使用导入库来实现load-time dynamic linking 与Windows 系统dll,将使用哪个目录搜索顺序?

它最终是否等同于LoadLibrary("Iphlpapi.dll")?它会使用完全限定的路径(即LoadLibrary("C:\\windows\\system32\\Iphlpapi.dll")

一些常用的 dll ("known dlls") 显然得到了特殊处理,但其他系统 dll如 Iphlapi.dll 呢?

它是否容易受到DLL preloading attack 的攻击?

【问题讨论】:

  • 据我所知,系统 DLL(例如 kernel32)受到预加载攻击的保护。如果您的问题实际上适用于其他 DLL(例如 Visual C 运行时库),您可能需要选择不同的示例。
  • @HarryJohnston:我说的是 Windows 提供的 dll。但由于我看到“已知 DLL”(其中 kernel32.dll 是其中之一)受到特殊处理,因此我用一个更好的例子修改了这个问题。
  • 在没有文档支持的规范答案的情况下,也许你可以试试看?将有问题的 DLL 移出 system32 并进入当前目录,然后查看您的应用程序是否仍在运行。

标签: windows visual-studio dll


【解决方案1】:

它应该使用完全限定的路径,即 ("C:\windows\system32\kernel.dll")...

【讨论】:

  • kernel.dll 不存在。 :-)
  • 也被这个发现了:kernel32.dll?
【解决方案2】:

从您提到的 URL 来看,您使用的是静态版本的动态链接库机制!这意味着您的应用程序必须使用 DLL 的相应 LIB 构建(请参阅此 URL 中的说明),并且应用程序将期望 DLL 在启动时存在。如果缺少此 DLL,您的应用程序将无法启动(这就是为什么此机制称为“使用加载时动态链接 ")。您不能也不必调用 LoadLibrary。这将由加载程序自动完成(因为您的应用程序和 DLL 之间的依赖关系)已放入应用程序的所谓导入地址表(IAT)中.

【讨论】:

  • 是的,这种机制非常适合 DLL 预加载攻击!
  • 为了更好地控制这一点,您应该更好地使用 LoadLibrary 和 GetProcAddress API(与前面提到的机制相比,这是一个真正的运行时动态链接库 - 也称为绑定)。
  • 您提到的网址(msdn.microsoft.com/en-us/library/windows/desktop/ms686923.aspx)中描述的机制是通用的。在 Windows 系统 DLL 的情况下,您实际上对搜索顺序的控制和灵活性较低。
  • 根据您使用的系统 DLL 类型和操作系统的 32/64 位版本,系统将使用 \system32 或其他位置(msdn.microsoft.com/en-us/library/7d83bc18(v=vs.80).aspx)
  • 对于系统 DLL,您不需要指定完整路径。加载程序将找到正确的 Dll。对于某些系统 Dll(并排),系统将在 \Windows\winsxs 目录下查找正确的版本。在这个位置,相同 Dll 的不同版本可以共存。
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 2016-07-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多