【问题标题】:Execute a mapped file on Windows在 Windows 上执行映射文件
【发布时间】:2013-01-29 02:41:30
【问题描述】:

各位开发者您好,

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

到目前为止,我使用CreateFileMappingMapViewOfFile 管理映射。 这些函数给了我一个映射文件的句柄和一个指向映射数据的指针,但我不知道如何执行映射的二进制文件。 我想我应该使用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 ?

【问题讨论】:

  • 你不能这样做(理论上可能有一些类似于你的问题但仍然不是你想要的东西)。在不映射文件的情况下执行文件有什么问题,例如CreateProcess?
  • 我尝试了here 描述的方法(在 Windows 上分叉),但从未成功。 “仅从文件”执行有什么问题?没什么,但我觉得这是一个有趣的主题^^
  • 如果可执行数据被映射,Windows不应该将其视为常规文件,因此可以“像文件一样”执行吗?
  • @Jelly:不。为了在内存中实际运行可执行文件,必须解析各种引用(DLL 引用、查找表等),然后可执行文件才能正常工作。您不能只是将图像加载到内存中并按原样运行。这就是操作系统开始使用 .exe 加载程序的原因。
  • 我同意所说的,但我认为映射的 file 可以被操作系统用作常规文件,尽管它存储在 RAM 中。那么CreateFileMapping 函数可用的PAGE_EXECUTE_READSEC_IMAGE 选项有什么用?

标签: c winapi createprocess file-mapping


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 2021-06-09
    • 2010-11-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2022-12-14
    • 2021-02-14
    相关资源
    最近更新 更多