FIPS 验证的 OpenSSL 库必须在固定地址加载 libeay32.dll。例如,这表明在:.NET 中已占用固定地址
使用以下描述的技术:IIS7 App Pool can't load library with Fixed Base Address和 How do you disable ASLR (address space layout randomization) on Windows 7 x64? ,以及 如何在不链接 kernel32.dll 和 ntdll.dll 的情况下运行 PE 映像,我已经尽可能早地强制加载 FIPS DLL。
对于 64 位进程,从 ListDLLs 输出中,我看到加载顺序为:
E:\my\my64.exe
C:\Windows\SYSTEM32\ntdll.dll
C:\Windows\system32\kernel32.dll
C:\Windows\system32\KERNELBASE.dll
E:\my\LIBEAY_FIPS32.dll
...
对于 32 位进程,还有一些额外的“哇”的废话,即:
E:\my\my32.exe
C:\Windows\SYSTEM32\ntdll.dll
C:\Windows\SYSTEM32\wow64.dll
C:\Windows\SYSTEM32\wow64win.dll
C:\Windows\SYSTEM32\wow64cpu.dll
C:\Windows\SysWOW64\ntdll.dll
C:\Windows\syswow64\kernel32.dll
C:\Windows\syswow64\KERNELBASE.dll
E:\my\LIBEAY_FIPS32.dll
...
现在,这与我一开始的情况相比有了巨大的改进,现在出现“0xc0000018 无法在 FIXED 地址加载错误”的机会比 LIBEAY_FIPS32.dll 在加载到进程中的第 25 个 DLL 左右时要低得多。
但是,考虑到这些系统 DLL 是可重定位的并且可能会受到 ASLR 的影响,我预计仍然可能出现加载失败。
虽然我不想关闭 Windows ASLR,但我想以某种方式告诉 ASLR“请避免使用以下 FIXED 地址范围,因为我确实需要在该地址加载 FIXED DLL”。有没有办法做到这一点?
或者某种方式来控制一个或多个的加载地址:ntdll.dll、kernel32.dll、kernelbase.dll?
如果做不到这一点,是否有任何方法可以强制 FIPS openssl dll 在以下一项或多项之前加载到进程中:ntdll.dll、kernel32.dll、kernelbase.dll?