напрямую выполнять двоичный ресурс - PullRequest
1 голос
/ 20 августа 2010

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);
}

Ответы [ 3 ]

2 голосов
/ 20 августа 2010

Для этого в 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.

1 голос
/ 20 августа 2010

Если ресурс представляет собой PE файл, то это никак не AFAIK. Если это простая скомпилированная процедура, попробуйте хитрость Tim .

Edit: После обновления Tim это самый полный ответ.

0 голосов
/ 20 августа 2010

Вот несколько причин, по которым операционная система должна разрешить это:

  • EXE не может быть просто загружен в память и затем сразу выполнен. Определенные задачи должны быть выполнены до начала выполнения , например, расположение сегментов в памяти (включая настройку стека), затем настройку ссылок на память в машинных инструкциях для конкретных областей памяти (или перемещение), (возможно, даже динамически загружаемые библиотеки DLL) и т. д.

  • В настоящее время формат файла EXE представляет собой множество форматов , которые вы все должны знать и обрабатывать соответствующим образом. Он может содержать исполняемый код для DOS (с заголовком MZ / ZM), для Windows (PE - переносимый исполняемый файл) или для .NET (также PE).

  • Новые процессоры имеют неисполняемый бит (например, Google NX bit, который в основном запрещает выполнение кода, находящегося в сегменте данных. То есть, если вы загружаете свой двоичный ресурс ( который содержит код) в память, он будет находиться в сегменте данных. Если ваш процессор имеет функцию бит NX, и ОС использует его, вы не сможете выполнить этот код.

По всем этим (и, возможно, более) причинам лучше всего, чтобы ОС работала с вашим EXE-файлом. В случае механизма NX (или аналогичного) у вас нет другого выбора, потому что только ОС может настраивать сегменты кода. Таким образом, вы можете избавиться от первых двух проблем, указанных выше, выбирая менее мощный исполняемый формат, такой как .com, но вы просто не можете избавиться от механизма NX внутри работающей программы, которая выполняется в пространстве пользователя.

...