固定地址在 .NET 中占用

Fixed address is occupied in .NET

本文关键字:NET 地址      更新时间:2023-10-16

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

因此,我们根据Microsoft的建议选择了地址,并且在一些不时地址的计算机上被其他各种库占用 - 例如MSVCR120_CLR0400.dllmscorlib.ni.dllclr.dll,您明白了。

有没有办法检查是否占用了一些固定地址+长度,并要求操作系统为我释放这部分内存,例如将这些dll变基到其他内存部分或类似的东西?

更新:

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

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

  • 链接程序时,将/INCLUDElibeay.dll中的符号一起使用,以强制对该库进行静态依赖。
  • 使用 /FIXED 编译libeay32.dll,使其无法重新定位。
因此,

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