【问题标题】:Fixed address is occupied in .NET固定地址在.NET中被占用
【发布时间】:2015-06-22 07:15:42
【问题描述】:

支持 FIPS 的 OpenSSL 有一个限制 - 它必须在固定地址加载 libeay32.dll,如果在任何其他地址加载,初始化检查失败,因此不能在 FIPS 模式下使用。

所以我们根据微软的建议选择了地址,并且在一些机器上,地址不时被其他各种库占用——比如MSVCR120_CLR0400.dllmscorlib.ni.dllclr.dll,你明白了。

有什么方法可以检查是否占用了某个固定地址 + 长度并要求操作系统为我释放那部分内存,比如将这些 dll 重新设置为其他内存部分或类似的东西?

更新:

我从 20 个使用 ListDLLs 的设备收集了信息,并且有一些模式加载到哪里,但它远未明确定义。所以我进行了一些数学运算,发现最大的差距,在我拥有的那 20 条日志中没有加载任何内容,将 libeay32 基地址更改为该差距中的某个地方(差距比 dll 大约 6 倍,所以我选择了~中间)并且仍然在几个尝试之后应用程序设法在 libeay32 之前的那个间隙中加载一些东西(具体来说 - clrjit.dll,它的基地址为 0x10000000,我认为这是默认的),尽管在应用程序中我尝试加载 libeay32尽快。

【问题讨论】:

  • 这个问题是在 openssl 的邮件列表中提出的:groups.google.com/forum/#!topic/mailing.openssl.users/…。使用 /FIXED 重新编译 dll 或将地址放入 0x50000000 到 0x6FFF0000 的可能解决方案
  • 我使用那个空间的地址,它改善了情况,但没有完全解决。我使用 0x64880000 作为 libeay32.dll 的固定地址。
  • @xanatos - OpenSSL 安全策略是否允许您按照 Bohm 的建议更改地址?我认为你应该寻找 Steve Marquess 或 Dr. Henson 的答案。

标签: c# c++ .net windows dll


【解决方案1】:

你为什么不结合给出的提示:

  • 在链接程序时使用 /INCLUDE 和来自 libeay.dll 的符号以强制对该库建立静态依赖关系。
  • /FIXED 编译libeay32.dll,这样它不能重新定位。

因此,它是在加载可执行文件时加载的,在任何托管代码运行之前,而不是稍后动态加载,因此所有那些可重定位的 dll 还不存在,并且不能妨碍。

【讨论】:

  • 我找不到 msbuild 的 /INCLUDE 选项,我猜它不适用于 .NET?
  • 这是 msbuild 调用的链接器的一个选项。
  • 根据 msdn:C# 编译器和 C++ 编译器输出的区别:没有由于调用 C# 编译器而创建的对象 (.obj) 文件;输出文件是直接创建的。因此,C# 编译器不需要链接器。
  • 编译成.netmodules,然后链接它们。 blogs.msdn.com/b/texblog/archive/2007/04/05/…
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2022-01-14
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多