温馨提示  2024年 6月我们已经停止开发者板块文章内容更新,谢谢来访。存档数据
知识 2023-11-28 24 次阅读

如何在 DLL 中封装并运行 EXE?疑问解答。

在 DLL 中封装 EXE 并运行 EXE 是一种常常出现在大家视野里的编程技术,可以将复杂的代码封装在 DLL 中,以实现代码复用和模块化开发。以下是一篇关于如何封装 EXE 并运行 EXE 的短文:
将 EXE 封装到 DLL 并运行 EXE ====================
将 EXE 文件封装到 DLL 是一个常常出现在大家视野里的技术,可以帮助你复用代码并提高可维护性。通过在 DLL 中封装 EXE,你可以在多个项目中重用相同的代码,同时减少了文件大小并提高了性能。
如果要实现这一目标,首先需如果要把 EXE 编译成 DLL。可以使用编译器(如 Microsoft Visual Studio 或 C++)来完成这一步骤。确保将 EXE 代码封装在一个可再分发的库中,并遵循最佳实践以确保库的兼容性和安全性。
一旦你有了 DLL,你可以使用程序集加载器(如 .NET Framework 的 AppDomain 或 Windows 服务的控制台应用程序)来运行 DLL 中的代码。使用 DLL 中的方法调用运行 EXE 并控制其输出,你可以创建交互式界面或触发自定义行为。
在编写代码时,请务必注意不同寻常处理和错误检查,以确保程序的安全性和稳定性。通过将复杂的代码封装在 DLL 中,你可以实现代码复用并简化项目结构。除此之外,考虑在代码中使用面向对象编程(OOP)方法来增强代码的可维护性和可重用性。
总的来说,封装 EXE 并运行 EXE 的最佳实践是创建一个可重用的库,其中包含可以执行任务的代码,而无需从头开始编写相同的代码。这样可以减少项目的大小,提高性能,并增加代码的可维护性。

在 Windows 操作系统中,DLL(Dynamic Link Library,动态链接库)是一种存储可被多个程序同时使用的代码和数据的库。EXE(可执行文件)是 Windows 中直接运行的程序。尽管它们有许多相似之处,但有时我们希望在 DLL 中封装一个 EXE 文件,并在需要的时候启动该 EXE。这篇简明教程将带你了解怎样达成封装及运行的过程。

原理

1. 封装 EXE如果要把一个 EXE 文件封装到一个 DLL 中,首先需如果要把 EXE 文件作为资源添加到 DLL 工程中。接着,通过调用资源 API 函数(例如 LoadResource 和 LockResource),可以在运行时从 DLL 中提取 EXE 文件。

2. 运行 EXE一旦从 DLL 中提取出 EXE 文件,就可以把它写入临时文件并运行。这可以借助使用函数(如 CreateFile、WriteFile 和 CreateProcess)实现。

以下是实现 EXE 封装和运行的详细步骤

步骤 1创建 DLL 工程

在 Visual Studio 或其他您喜欢的 C/C++ 编译环境中创建一个新的 DLL 工程。

步骤 2将 EXE 文件添加为资源

1. 在工程资源文件中创建一个新的资源类型(比如,使用标识符 “BIN”)。

2. 将 EXE 文件添加为新资源类型的实例。

3. 为该资源分配唯独的资源 ID(比如,“IDR,EXE1”)。

步骤 3从 DLL 提取 EXE 文件

1. 调用 `FindResource` 函数来定位 EXE 资源。

2. 使用 `LoadResource` 函数加载 EXE 资源。

3. 使用 `LockResource` 函数获取 EXE 数据的指针。

4. 使用 `SizeofResource` 函数获取 EXE 数据的大小。

步骤 4将 EXE 保存到临时文件

1. 使用 `GetTempPath` 和 `GetTempFileName` 函数创建一个临时文件。

2. 使用 `CreateFile` 函数创建(或覆盖)该临时文件。

3. 将从 DLL 中提取的 EXE 数据写入临时文件。

4. 使用 `CloseHandle` 函数关闭临时文件。

步骤 5运行临时 EXE 文件

1. 使用 `CreateProcess` 函数创建一个新的进程来运行临时 EXE 文件。

2. 等待新进程结束。可以选择性地设置一段过时时间,以防 EXE 文件运行过久。

3. 使用 `CloseHandle` 函数清理进程和线程句柄。

以下是一个简化的代码实例

```cpp

#include

#include

#include resource.h

bool ExtractAndRunEXE()

{

HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR,EXE1), ,T(BIN));

if (!hRes)

return false;

HGLOBAL hResData = LoadResource(NULL, hRes);

if (!hResData)

return false;

LPVOID pExeData = LockResource(hResData);

DWORD dwExeSize = SizeofResource(NULL, hRes);

TCHAR szTempPath[MAX,PATH];

TCHAR szTempFile[MAX,PATH];

GetTempPath(MAX,PATH, szTempPath);

GetTempFileName(szTempPath, ,T(DLL,EXE), 0, szTempFile);

HANDLE hFile = CreateFile(szTempFile, GENERIC,WRITE, 0, NULL, CREATE,ALWAYS, FILE,ATTRIBUTE,NORMAL, NULL);

if (hFile == INVALID,HANDLE,VALUE)

return false;

DWORD dwWritten = 0;

WriteFile(hFile, pExeData, dwExeSize, &dwWritten, NULL);

CloseHandle(hFile);

STARTUPINFO si = { 0 };

PROCESS,INFORMATION pi = { 0 };

si.cb = sizeof(si);

CreateProcess(szTempFile, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);

WaitForSingleObject(pi.hProcess, INFINITE);

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

DeleteFile(szTempFile);

return true;

}

```

当需要运行封装的 EXE 时,只需从外部调用 `ExtractAndRunEXE` 函数即可。这样的方法可以隐藏 EXE 的位置和名称,使得潜在的恶意软件更难以找到和利用这些可执行文件。

注意本方法用于合法的目的,例如在多程序共用的情况下优化代码资源。对于恶意用途(如隐藏病毒程序)的行为,本文作者概不负责。谢谢!