【发布时间】:2017-02-17 01:13:51
【问题描述】:
客户要求我将 OpenSSL 添加到他们基于 Windows CE 5.0 的产品中。他们需要 OpenSSL 才能在 FIPS 模式下运行,这需要在编译时为库提供一个已知地址。如果我构建一个 EXE,我没有问题,因为我总是可以依赖 0x10000 的基地址作为 EXE,FIPS 模式检查使用它来验证 EXE。
我遇到的问题是我需要将 OpenSSL 代码构建到一个 DLL 中,该 DLL 从另一个 DLL 调用,该 DLL 由调用其他 DLL 的主应用程序 EXE 调用。那么我如何知道我的 DLL 运行时的地址呢?
我知道如何使所有这些工作的唯一方法是,如果有问题的 DLL 弹出一个消息框或将其中一个函数的地址写入磁盘,然后我可以将其与映射文件中的偏移量进行比较我构建了那个 DLL 并获得了 DLL 的基地址。然后我可以用那个地址返回,重建 OpenSSL 的东西,然后重建我的 DLL,一切正常。启用 FIPS 模式是因为在编译时指定的地址是使用运行时的地址。
虽然这似乎解决了问题,但我不喜欢如果其他 DLL 发生更改或此 DLL 更改以添加或删除代码,则此基地址可能会更改。但我想只要一切都是静态的,这种方法可能没问题。
我的问题:
有没有办法修复加载运行时的 DLL 的地址?或者 BIB 和 ROM 是我唯一的选择吗?只是想仔细检查一下我是否可以做一些不同的事情。现在,如果我的 EXE 使用的任何 DLL 发生更改,或者我的 EXE 更改为使用更多或更少的 DLL,它可能会更改我的 DLL 的加载地址,这反过来将禁用 FIPS 模式,因此我必须使用重建 OpenSSL 库新的基地址,然后重建我的 DLL 以再次工作。我试图避免这种情况,同时仍然从 DLL 运行 OpenSSL 库代码,但我不确定这是否可能。除了远离 CE 5.0,还有什么建议吗?谢谢。
【问题讨论】:
标签: dll windows-ce offset