Ray-D-Song's Blog

使用Enigma Virtual Box将 exe 和 dll 打包成单个可执行文件

2024-09-12 4min

在 macOS 和 Linux 上,大多数工具都会以单个可执行文件的形式分发。Windows 平台有时会附带.dll文件。

dll 是什么

DLL文件是“动态链接库”(Dynamic Link Library)的缩写,主要用于Windows操作系统。

DLL文件包含了一些可以被多个程序共享的代码和数据。当一个程序需要使用这些代码和数据时,它会动态地加载相应的DLL文件,而不是将这些代码和数据复制到每个程序中。这样可以节省内存空间,并且可以确保多个程序使用的是同一份代码和数据,从而提高系统的稳定性和安全性。

可以将 DLL 简单理解为或者

举个例子,多线程应用移植到 Windows 上会依赖libwinpthread-1.dll
这是一个实现了 POSIX 线程(pthreads)的 DLL 文件,它提供了与 Linux 和 macOS 上的 pthreads 库相同的接口,使得多线程应用可以在 Windows 上运行。

如果没有这样一个 dll 文件,那每个移植到 Windows 上的多线程应用都需要自己实现一套线程管理机制,大大提高了开发难度。

你可以在dll-files.com上找到可用的 dll 文件。

https://www.dll-files.com/libwinpthread-1.dll.html

问题

大多数必要的 DLL 会被集成到系统中,在 Windows 的system32目录下。

如果系统缺少某个 DLL,那程序就会报以下错误:
Couldn't find ****.dll...

一个常见的做法是将 DLL 文件和可执行文件放在同一个目录下,但这样增加了分发的难度。

Engima Virtual Box

Engima Virtual Box 是一个文件封装工具,将可执行文件和配套文件(例如 dll)封装进一个可执行文件中。

你可以在官网上找到 Engima Virtual Box 的下载卡片。

https://enigmaprotector.com/en/downloads.html

安装完成后,打开 Engima Virtual Box:

EVB

原理

原理上其实不难实现,将所有文件全都打包成二进制,运行时塞到内存或者拷贝进临时文件中。

使用 Golang 的 embed 可以轻松实现一个简单的 demo。

https://github.com/Ray-D-Song/go-embed-exec

当然,Engima Virtual Box 为了适配各种情况,肯定包含复杂度更高的操作。