0

各位开发者您好,

我正在尝试在 Windows 上映射一个可执行的二进制文件,然后执行映射的文件。

到目前为止,我使用CreateFileMapping和管理映射MapViewOfFile。这些函数给了我一个映射文件的句柄和一个指向映射数据的指针,但我不知道如何执行映射的二进制文件。我想我应该使用这个CreateProcess函数,但它应该作为参数给出什么?

char *binaryPath = "C:/MyExecutable.exe";

// Get the binary size
std::fstream stream(binaryPath, std::ios::in | std::ios::binary);
stream.seekg(0, std::ios::end);
unsigned int size = stream.tellg();

// Create a mapped file in the paging file system
HANDLE mappedFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_EXECUTE_READ, 0, size, NULL);

// Put the executable data into the mapped file
void* mappedData = MapViewOfFile(mappedFile, FILE_MAP_READ | FILE_MAP_EXECUTE, 0, 0, size);

stream.read((char*)mapping, size);
stream.close();

// What should I do now ?
4

1 回答 1

0

没有本地方法可以运行驻留在内存中的原始可执行映像。 CreateProcess()是运行可执行映像的官方方式,但该映像必须驻留在文件系统上。操作系统将图像加载到内存中,然后根据需要对其进行修补(解析 DLL 引用等),以便它实际上可以正确运行。

话虽如此,我看到第三方代码漂浮在周围,复制了操作系统在将可执行映像加载到内存时所做的事情。但我只见过与 DLL 一起使用(因此代码不必使用LoadLibrary/Ex()内存中的 DLL),而不是与 EXE 一起使用。

于 2013-02-13T14:52:06.923 回答