【问题标题】:Writing a DLL that loads msvcr80.dll and exposes the free()-function编写一个加载 msvcr80.dll 并公开 free() 函数的 DLL
【发布时间】:2011-09-14 16:14:44
【问题描述】:

我有一个第三方 DLL,它依赖于 MSVCR80 并分配了我需要清理的资源。该库确实公开了一个free-函数来执行此操作。相反,我需要加载相同的运行时库并手动调用free 函数。

作为一种解决方法,我正在尝试编写一个“包装器”DLL,以加载正确的运行时并公开free 函数。此 DLL 是使用 Visual Studio 2010 创建的,并且依赖于单独的运行时库。执行 LoadLibrary("msvcr80.dll") 失败并出现错误 R6034,我猜这是因为清单问题。

甚至可以使用LoadLibrary 加载 msvcr80.dll 吗?我是否需要创建一个清单,将其嵌入到 DLL 中并将 msvcr80.dll 存储在与我的包装 DLL 相同的目录中?

我意识到这是第三方库中的一个缺陷,但我几乎被这个版本所困扰。让供应商解决这个问题很可能不是一种选择。

【问题讨论】:

  • 将激活上下文 api 与恶意 dll 使用的相同清单资源一起使用。这将使 LoadLibray 调用工作。
  • 您需要 GetModuleHandle() 代替,因为 DLL 已经加载。然后GetProcAddress()获取_free函数的地址。
  • @hans 问题是传递什么作为模块名称。这就是可爱的 SxS 东西。请参阅上一个问题。
  • @David - 只有 SxS 目录名称很复杂,这是 LoadLibrary 的问题。不适用于 GetModuleHandle,模块名称只是“msvcr80”。

标签: c++ winapi dll manifest msvcrt


【解决方案1】:

可能有更好的解决方案,但如果其他一切都失败了,你可以在某个地方找到一份 VC++ 2005 速成版(=免费,不需要盗版 @987654322 @ ),它使用 8.0 版的编译器,因此与有缺陷的 dll 的运行时间相同。

然后您将使用它构建您的包装器 dll,它只会调用其 CRT 提供的free(仔细检查您使用的是 dll 版本!)。

【讨论】:

  • VC++ 2005 Express 只有在您直接从 Microsoft 获得时才免费,而且我认为他们不再提供。仅仅因为它是免费的并不意味着它没有版权,并且没有其他人有权分发它。
  • 我不知道那个许可限制,8.0 编译器仍然应该存在于 MS 站点上仍然可用的各种包中(我记得它在最后一个 DDK 中使用,然后它们被重命名为 WDK) .
  • 好主意,如果我没有找到解决我最初问题的另一种解决方案,我可能最终会这样做(类似的事情)(有关我遇到的问题+解决方案的详细信息,请参阅stackoverflow.com/questions/7399774/…合作)。
猜你喜欢
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 2013-08-10
  • 2011-05-03
相关资源
最近更新 更多