Подтвердить что ты не робот

Запустите сборку .exe из буфера в C

Я работаю над проектом, связанным с технологиями песочницы.

В настоящее время я пишу программу на C, которая получает небольшую сборку .exe binary (.NET) с удаленного веб-сервера. Этот двоичный файл хранится в памяти (никогда не касайтесь диска), и я намерен запустить этот двоичный файл из памяти. Если мой клиент был создан в .NET, у меня не возникло бы проблемы с этой сборкой из памяти (на самом деле, это много разных способов получить это), но, конечно, это невозможно с помощью C (не совсем уверен).

Мои вопросы: наличие этой сборки .exe в адресном пространстве моей программы C, есть ли способ ее запускать? Есть ли способ разрешить CLR запустить его? Сначала я решил вызвать powershell, чтобы запустить его оттуда (используя Reflection.Assembly), но в этом случае нужно записать сборку на диск.

В любом случае, без сомнения, лучший и эффективный способ получить это - с помощью клиента .NET.

4b9b3361

Ответ 1

Если это exe. построить из .net, тогда это возможно, отметьте http://www.codeproject.com/Articles/13897/Load-an-EXE-File-and-Run-It-from-Memory

Если это неуправляемый двоичный файл, то я не знаю, как это сделать. Если вы не можете сохранить его на HDD, даже во временную папку вы можете попробовать какой-то ramdrive. Выполнение выполняется с помощью следующего кода:

        //this is using imports from System.Diagnostics and System.IO

        byte[] exeBytes = GetBytesFromStream(stream); // Get the .exe file from a webstream or something
        string tmpFilename = Path.GetFileNameWithoutExtension(Path.GetTempFileName()) + ".exe";
        string tmpFilePath = Path.Combine(Path.GetTempPath, tmpFilename);

        File.WriteAllBytes(tmpFilePath, exeBytes);

        Process.Start(tmpFilePath);

Ответ 2

Так как .exe будет иметь IL, вместо фактических машинных инструкций вы не сможете запустить его напрямую. Лучше всего использовать CLR hosting api, и даже тогда я не уверен, что вы можете работать, не касаясь диска. Конечно, любой .NET-код, который выполняется в результате выполнения кода сборки, в конечном итоге загрузит сборки CLR с диска.

Ответ 3

Если вы загрузили exe файл в память и у вас есть его виртуальный адрес (в виртуальном пространстве вашего приложения), возможно, вы можете использовать команды сборки, такие как jump, или какой-либо метод, например DLL-инъекции для запуска другой exe.