【问题标题】:directly execute binary resource直接执行二进制资源
【发布时间】:2010-08-20 07:51:49
【问题描述】:

lpBuffer 是指向(二进制)资源第一个字节的指针。如何在不将其转储到临时文件的情况下立即执行它?

HMODULE hLibrary;
HRSRC hResource;
HGLOBAL hResourceLoaded;
LPBYTE lpBuffer;

hLibrary = LoadLibrary("C:\\xyz.exe");
if (NULL != hLibrary)
{
    hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA);
    if (NULL != hResource)
    {
        hResourceLoaded = LoadResource(hLibrary, hResource);
        if (NULL != hResourceLoaded)        
        {
            lpBuffer = (LPBYTE) LockResource(hResourceLoaded);            
            if (NULL != lpBuffer)            
            {                
                // do something with lpBuffer here            
            }
        }    
    }
    FreeLibrary(hLibrary);
}

【问题讨论】:

    标签: c resources executable portability


    【解决方案1】:

    Windows 中没有为此内置的功能;你唯一的选择是CreateProcess,它需要一个EXE文件。

    可以自己解析可执行文件格式。您实际上是在重新创建 LoadLibrary 函数的功能。

    下面是关于如何加载 DLL 并在其中调用函数的说明:http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/。为了适应您的 EXE,您将遵循相同的重定位和导入步骤。完成后,您将调用 EXE 的入口点。 (本教程解释了如何调用 DLL 的导出函数。)

    根据 EXE 中的内容,您可能无法将其直接加载到现有进程中。例如,您自己的 EXE 执行各种 Win32 和 C 初始化代码,而嵌入式 EXE 可能会尝试再次执行相同的初始化。如果这成为一个问题,您的替代方法是将嵌入式 EXE 放在自己的进程中;然后,您将返回创建临时文件并调用CreateProcess

    【讨论】:

    • 事情不是这样的。您不能只执行已作为资源加载的代码。必须进行搬迁。必须解决导入问题。
    • 事情可以这样工作,因此我的“你的格式是什么”的问题。 OP 没有提及二进制资源中的内容。
    • @wj32 @Bubblegun 我已经根据这些新信息重写了我的答案
    • 感谢您的意见。我去看看教程
    【解决方案2】:

    如果资源是PE 文件,那么就没有办法 AFAIK。如果它是一个简单的编译过程,请尝试Tim 的技巧。

    编辑: Tim的答案更新后,是最完整的答案。

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 2015-04-08
      • 2017-11-16
      • 2010-12-17
      • 2012-08-24
      • 2019-09-10
      相关资源
      最近更新 更多