shellus
2023-02-15 10:17:46 +08:00
一种可能的方法:
使用 Visual Studio 创建一个空的 DLL 项目。在该项目中添加一个新的资源文件,将其类型设置为“二进制”,并将要嵌入的 exe 文件添加到该资源文件中。
编写一个导出函数,该函数将加载并释放嵌入的 exe 文件。例如,下面是一个 C++ 的示例代码:
```c++
#include <windows.h>
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
return TRUE;
}
extern "C" __declspec(dllexport) int ExecuteEmbeddedFile() {
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE_FILE), RT_RCDATA);
HGLOBAL hResData = LoadResource(NULL, hRes);
LPVOID lpResData = LockResource(hResData);
DWORD dwResSize = SizeofResource(NULL, hRes);
WCHAR szTempPath[MAX_PATH];
GetTempPath(MAX_PATH, szTempPath);
WCHAR szTempFileName[MAX_PATH];
GetTempFileName(szTempPath, L"exe", 0, szTempFileName);
HANDLE hTempFile = CreateFile(szTempFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hTempFile == INVALID_HANDLE_VALUE) {
return GetLastError();
}
DWORD dwBytesWritten;
if (!WriteFile(hTempFile, lpResData, dwResSize, &dwBytesWritten, NULL)) {
CloseHandle(hTempFile);
return GetLastError();
}
CloseHandle(hTempFile);
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(szTempFileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
return GetLastError();
}
return 0;
}
```
该函数将在 DLL 中导出,它会在 DLL 被加载时执行。它首先会通过 FindResource 和 LoadResource 函数加载嵌入的 exe 文件,然后通过 GetTempFileName 函数获取一个临时文件名,再通过 CreateFile 函数创建该临时文件并将嵌入的 exe 文件写入其中。最后,它调用 CreateProcess 函数启动该临时文件并执行嵌入的 exe 文件。