使用Linux中的Windows DLL

问题描述 投票:19回答:7

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

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

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

提前谢谢了。

linux api dll
7个回答
9
投票

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

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

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

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


7
投票

虽然这个问题相当陈旧,但这个话题显然没有失去意义。如果您可以使用或正在使用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 packagedocumentation

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


3
投票

有时候,选择小型供应商而不是大型供应商会更好,因为您的业务规模会让您更加重视。我们肯定在AV引擎供应商处找到了这个。

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

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

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


1
投票

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


0
投票

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


0
投票

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


0
投票

Tavis Ormandy有一个代码,它能够链接Windows DLL并从Linux可执行文件调用函数。通过在MS Windows Defender上调用mpengine来扫描(恶意软件)文件来演示概念:

https://github.com/taviso/loadlibrary

© www.soinside.com 2019 - 2024. All rights reserved.