我们需要与第三方应用程序接口,但应用程序背后的公司不会泄露消息协议,只提供Windows DLL接口。
我们的应用程序是基于Linux的,所以我不能直接与DLL通信。我找不到任何现有的解决方案,所以我正在考虑在Linux和Windows之间编写基于套接字的桥接器,但是我确信它不是一个独特的问题,有人应该先做过。
你知道任何允许从Linux上的C app调用Windows DDL函数的解决方案吗?它可以使用Wine或单独的Windows PC - 无所谓。
提前谢谢了。
任何解决方案都需要在“类似Windows的”环境中运行的DLL与您的Linux应用程序之间的基于TCP / IP的“远程处理”层。
您需要编写一个简单的PC应用程序来公开DLL函数,使用自制程序协议,或者XML-RPC,SOAP或JSON协议。 RemObjects SDK可能会帮助你 - 但可能有点矫枉过正。
我坚持使用“真正的”或虚拟化的PC。如果您使用Wine,DLL开发人员不太可能提供任何支持。
MONO也不太可能有任何帮助,因为你的DLL可能不是.NET程序集。
虽然这个问题相当陈旧,但这个话题显然没有失去意义。如果您可以使用或正在使用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和不安全),但它确实处理大多数类型的参数(包括指针)。
有时候,选择小型供应商而不是大型供应商会更好,因为您的业务规模会让您更加重视。我们肯定在AV引擎供应商处找到了这个。
如果您对它们足够重要,它们应该提供文档化的,受支持的协议,库的Linux构建或库的源代码。
否则你将不得不使用RPC在循环中运行Windows框,正如其他人所指出的那样,这可能非常不方便,特别是如果整个基础架构运行Linux。
供应商是否支持在Windows VM中使用其库?如果性能不重要,您可以这样做。
调用DLL的功能本身当然只是冰山一角。如果DLL调用Win32怎么办,那么你就会遇到相当大的链接问题。我想Wine可以帮助你,不确定他们是否提供了解决方案。
IMO,最好的选择是使用套接字。我以前做过这个,它就像一个魅力。
问题问题已经过去几年了,但这是另一种方法。使用objdump -d
来反汇编DLL。您可能会得到纯粹的,未经过混淆的垃圾,或者充满Windows调用的代码,或两者兼而有之。函数通常由一系列push
指令分隔,并以ret
指令结束。
Tavis Ormandy有一个代码,它能够链接Windows DLL并从Linux可执行文件调用函数。通过在MS Windows Defender上调用mpengine来扫描(恶意软件)文件来演示概念: