【问题标题】:Using Windows DLL from Linux从 Linux 使用 Windows DLL
【发布时间】:2008-12-17 10:20:53
【问题描述】:

我们需要连接到第 3 方应用程序,但应用程序背后的公司不公开消息协议,只提供 Windows DLL 来连接。

我们的应用程序是基于 Linux 的,因此我无法直接与 DLL 通信。我找不到任何现有的解决方案,所以我正在考虑在 Linux 和 Windows 之间编写基于套接字的桥接器,但我确信这不是一个独特的问题,应该有人以前做过。

您是否知道任何允许在 Linux 上从 C 应用程序调用 Windows DDL 函数的解决方案?它可以使用 Wine 或单独的 Windows PC - 没关系。

非常感谢。

【问题讨论】:

    标签: dll linux api


    【解决方案1】:

    我编写了一个小的 Python 模块,用于在 Linux 上从 Python 调用 Windows DLL。它基于常规 Linux/Unix Python 进程和基于 Wine 的 Python 进程之间的 IPC。因为我自己在太多不同的用例/场景中都需要它,所以我将它设计为“通用”ctypes module 替代品,它会在后台自动完成大部分所需的管道。

    示例:假设您在 Linux 上使用 Python,您已经安装了 Wine,并且您想要调用 msvcrt.dll(Microsoft C 运行时库)。您可以执行以下操作:

    import zugbruecke as ctypes
    dll_pow = ctypes.cdll.msvcrt.pow
    dll_pow.argtypes = (ctypes.c_double, ctypes.c_double)
    dll_pow.restype = ctypes.c_double
    print('You should expect "1024.0" to show up here: "%.1f".' % dll_pow(2.0, 10.0))
    

    Source code (LGPL), PyPI package & documentation.

    它的边缘仍然有点粗糙(即 alpha 和不安全),但它确实可以处理大多数类型的参数(包括指针)。

    【讨论】:

      【解决方案2】:

      任何解决方案都需要在“类 Windows”环境中运行的 DLL 和您的 linux 应用程序之间建立一个基于 TCP/IP 的“远程处理”层。

      您需要编写一个简单的 PC 应用程序来公开 DLL 函数,可以使用自制协议,也可以使用 XML-RPC、SOAP 或 JSON 协议。 RemObjects SDK 可能会对您有所帮助 - 但可能有点矫枉过正。

      我会坚持使用“真实”或虚拟化 PC。如果您使用 Wine,DLL 开发人员不太可能提供任何支持。

      MONO 也不太可能有任何帮助,因为您的 DLL 可能不是 .NET 程序集。

      【讨论】:

        【解决方案3】:

        有时选择小供应商比选择大供应商更好,因为您的业务规模会给您更多的权重。我们肯定在 AV 引擎供应商那里发现了这一点。

        如果您对他们足够重要,他们应该提供文档化的、受支持的协议、库的 Linux 版本或库的源代码。

        否则,您将不得不使用 RPC 在循环中运行 Windows 机器,正如其他人所指出的那样,这可能非常不方便,尤其是当您的基础架构的其余部分都运行 Linux 时。

        供应商是否支持在 Windows VM 中使用他们的库?如果性能不重要,您也许可以这样做。

        【讨论】:

          【解决方案4】:

          这是一个常见问题。幸运的是,它现在有一个解决方案。认识由 Tavis Ormandy 开发的 LoadLibrary:

          https://github.com/taviso/loadlibrary

          我第一次偶然发现 LoadLibrary 是在 an article on Phoronix by Michael Larabel

          一位 Google 研究人员一直在开发“LoadLibrary”作为 能够依次加载 Windows 动态链接库 (DLL) 可以被原生 Linux 代码使用。

          LoadLibrary 不是 Wine 等的替代品,而是旨在 允许加载然后可以访问的 Windows DLL 库 通过本机 Linux 代码,而不是试图运行 Windows 程序等 在 Linux 上,但只需加载库。

          这个项目由著名的谷歌公司 Tavis Ormandy 开发 员工专注于漏洞研究。他从事定制工作 PE/COFF 加载器基于旧的 ndiswrapper 代码,该项目是 关于允许 Windows 网络驱动程序在 Linux 上运行。 LoadLibrary 将处理重定位和导入并提供 API 灵感来自 dlopen。此阶段的 LoadLibrary 似乎正在工作 与独立的 Windows 库很好,Tavis 正在使用 该项目部分用于在 Linux 上对 Windows 库进行模糊测试。

          Tavis 指出,“Windows 上的分布式、可扩展的模糊测试可以 具有挑战性且效率低下。对于端点尤其如此 安全产品,它们使用复杂的互连组件 跨越内核和用户空间。这通常需要旋转 整个虚拟化 Windows 环境对它们进行模糊测试或收集 覆盖数据。这在 Linux 上不是问题,我发现 将 Windows 防病毒产品的组件移植到 Linux 通常是 可能的。这使我能够以最少的速度运行我正在测试的代码 容器开销很小,并且可以轻松扩展测试。”

          有关 LoadLibrary 的更多详细信息,用于在 Linux 上通过以下方式加载 Windows DLL GitHub 他还演示了移植 Windows Defender 库 到 Linux。

          【讨论】:

            【解决方案5】:

            自己调用 DLL 的函数当然只是冰山一角。如果 DLL 调用 Win32 怎么办,那么你会有一个相当大的链接问题。我想 Wine 可以帮助你,但不确定他们是否提供了解决方案。

            【讨论】:

            • 上次我检查时,WINE 只能用于托管进程,而不是非 WINE 进程中的单个 DLL。
            【解决方案6】:

            IMO,最好的选择是使用套接字。我以前做过这个,它就像一个魅力。

            【讨论】:

            • 这是我最初的想法。看来这就是我必须走的路。
            【解决方案7】:

            另一种方法是使用objdump -d 反汇编DLL,然后重新编译/重新汇编它。不要期望能够重新编译未经编辑的代码。您可能会得到纯粹的、纯粹的垃圾,或充满 Windows 调用的代码,或两者兼而有之。寻找个别功能。函数通常由一系列push 指令分隔,并以ret 指令结束。

            【讨论】:

            • 如果您的目标是对其行为进行逆向工程,反汇编 DLL 会很有帮助。但是,不要期望能够反汇编 Windows DLL 并将其重新组装为功能性 Linux 共享对象。
            猜你喜欢
            • 1970-01-01
            • 2022-06-12
            • 2016-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            相关资源
            最近更新 更多