Как загрузить исполняемый файл Win32 и запустить его из памяти?

В случае, если у меня есть исполняемый файл, встроенный в качестве ресурса в процесс, и я хотел бы запустить процесс непосредственно из памяти, не сохраняя его на диске.

static void Main()
{
const string pathOfExecutable = @"C:\WINDOWS\system32\notepad.exe"; //size = 67KB 
// read the bytes from the application EXE file
FileStream fs = new FileStream(pathOfExecutable, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] byteArray = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();


//Process.Start(byteArray) //Cannot use this, any other alternative?

}

person Martin    schedule 17.09.2013    source источник
comment
Вы пытаетесь загрузить notepad.exe как сборку CLR. Блокнот не является приложением .NET, поэтому BadImageFormatException. Решение, на которое вы ссылаетесь, работает только для исполняемых файлов CLR.   -  person Reda    schedule 17.09.2013
comment
Проголосовавшие против, пожалуйста, объясните, почему вы голосуете против.   -  person Martin    schedule 17.09.2013
comment
stackoverflow.com/questions/3553875/   -  person dcaswell    schedule 17.09.2013
comment
Я предполагаю, что отрицательные голоса будут заключаться в отсутствии полного объяснения того, чего вы пытаетесь достичь (описанное здесь не считается), хотя это кажется немного резким.   -  person Richard Tingle    schedule 17.09.2013
comment
На несвязанной ноте; пустые операторы catch - это игра дьявола. Я человек Java, поэтому моя терминология может быть отключена, но подумайте хотя бы об исключении во время выполнения.   -  person Richard Tingle    schedule 17.09.2013
comment
Вопрос отредактирован в соответствии с комментариями   -  person Martin    schedule 17.09.2013


Ответы (3)


Assembly.Load загрузит сборки .net. Блокнот не такая штука. Это простое родное Win32-приложение. То, что вы пытаетесь сделать, невозможно сделать с помощью Assembly.Load.

person David Heffernan    schedule 17.09.2013
comment
Любые идеи о том, как загрузить приложение win32 из памяти? - person Martin; 17.09.2013
comment
Это не поддерживается. Есть много примеров взлома. Вам просто нужно сделать поиск в Интернете, чтобы найти их. - person David Heffernan; 17.09.2013
comment
Запишите исполняемое содержимое во временное место, а затем выполните его. - person ta.speot.is; 17.09.2013

Ваш подход работает только с управляемыми исполняемыми файлами. notepad.exe — это собственный исполняемый файл. Чтобы запустить его, используйте класс Process.

person kol    schedule 17.09.2013
comment
Пробовал Process.start() - person Martin; 17.09.2013
comment
@kol Комментарий, на который я отвечал, был удален. - person ta.speot.is; 17.09.2013
comment
@ta.speot.в порядке. Спасибо, я думал, что есть проблема с моим ответом. - person kol; 17.09.2013

Одним из решений было бы записать содержимое памяти во временный файл (Path.GetTempFileName), а затем запустить его с помощью Process.Start().

person Reda    schedule 17.09.2013
comment
-1 запустить процесс прямо из памяти, не сохраняя его на диске - person IInspectable; 17.09.2013
comment
@IInspectable Вы цитируете правку, сделанную после этого ответа. Во всяком случае, запустить произвольное приложение Win32 из памяти невозможно. Этот ответ - следующая лучшая вещь. - person ta.speot.is; 18.09.2013
comment
@ta Это не невозможно, просто сложная задача. ОС не поддерживает напрямую выполнение собственного двоичного PE-образа из памяти, однако, если вы посмотрите на запущенный процесс, вы увидите именно этот сценарий (игнорируя сопоставление памяти резервного хранилища ради аргумента). Подробный подход описан в разделе Загрузка DLL из памяти. - person IInspectable; 18.09.2013
comment
Невозможно сделать любым поддерживаемым способом. - person ta.speot.is; 18.09.2013
comment
@ta Это очень поддерживается для модулей ядра. - person IInspectable; 18.09.2013
comment
Вопрос не в модулях ядра. - person ta.speot.is; 18.09.2013