【问题标题】:windows ce 5.0 dll - Can it be fixed address?windows ce 5.0 dll - 它可以是固定地址吗?
【发布时间】: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


    【解决方案1】:

    你应该可以使用the /BASE linker option:

    /BASE 设置程序的基地址,覆盖默认位置 对于(...)一个 DLL(在 0x10000000)。操作系统首先尝试在其指定的或默认的基地址加载程序。如果那里没有足够的可用空间,系统会重新定位程序。要防止重定位,请使用 /FIXED 选项。

    如果由于某种原因 /BASE 选项不起作用,另一种方法是实现单独的 OpenSSL exe,并提供代理 dll 以使客户端能够与 OpenSSL 进程通信。

    【讨论】:

    • 谢谢。我已经尝试过这些选项,但地址仍然发生变化。我希望避免使用代理方法,但我想这可能是我的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2015-10-04
    • 2015-05-26
    • 1970-01-01
    相关资源
    最近更新 更多