使用Linux中的Windows DLL

时间:2008-12-17 10:20:54

标签: linux api dll

我们需要与第三方应用程序接口,但应用程序背后的公司不会透露消息协议,并且只提供Windows DLL接口。

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

您是否了解任何允许从Linux上的C app调用Windows DDL函数的解决方案?它可以使用Wine或单独的Windows PC - 无所谓。

非常感谢提前。

8 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:6)

虽然这个问题相当陈旧,但这个话题显然没有失去意义。如果您可以使用或正在使用Python ......这是我的解决方案。

我写了一个小的Python模块,用于在Linux上从Python调用Windows DLL。它基于IPC在常规Linux / Unix Python进程和基于Wine的Python进程之间。因为我自己在太多不同的用例/场景中需要它,所以我将其设计为"泛型" 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 :(得分:3)

有时最好选择小型供应商而不是大型供应商,因为您的业务规模会给您带来更多的权重。我们确实在AV引擎供应商处找到了这个。

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

否则你将不得不使用RPC在循环中运行Windows框,正如其他人所指出的那样,这可能非常不方便,特别是如果你的其余整个基础架构运行Linux的话。

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

答案 3 :(得分:3)

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

https://github.com/taviso/loadlibrary

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

<块引用>

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

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

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

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

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

答案 4 :(得分:1)

调用DLL的功能本身当然只是冰山一角。如果DLL调用Win32怎么办,那么你就会遇到相当大的链接问题。我想Wine可以帮助你,不确定他们是否提供解决方案。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

问题问题已经过了几年,但这是另一种方法。使用objdump -d反汇编DLL。您可能会得到纯粹的,未经过混淆的垃圾,或者充满Windows调用的代码,或两者兼而有之。函数通常由一系列push指令分隔,并以ret指令结束。

答案 7 :(得分:0)

Tavis Ormandy的代码可以链接Windows DLL并从Linux可执行文件调用函数。通过在MS Windows Defender上调用mpengine进行扫描(恶意软件)文件,可以证明这一概念:

https://github.com/taviso/loadlibrary