Запустите сборку .exe из буфера в C
Я работаю над проектом, связанным с технологиями песочницы.
В настоящее время я пишу программу на C, которая получает небольшую сборку .exe
binary (.NET)
с удаленного веб-сервера. Этот двоичный файл хранится в памяти (никогда не касайтесь диска), и я намерен запустить этот двоичный файл из памяти. Если мой клиент был создан в .NET
, у меня не возникло бы проблемы с этой сборкой из памяти (на самом деле, это много разных способов получить это), но, конечно, это невозможно с помощью C
(не совсем уверен).
Мои вопросы: наличие этой сборки .exe
в адресном пространстве моей программы C
, есть ли способ ее запускать? Есть ли способ разрешить CLR
запустить его? Сначала я решил вызвать powershell, чтобы запустить его оттуда (используя Reflection.Assembly), но в этом случае нужно записать сборку на диск.
В любом случае, без сомнения, лучший и эффективный способ получить это - с помощью клиента .NET
.
Ответы
Ответ 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.