Запустить программу из байтового массива - PullRequest
16 голосов
/ 04 июня 2010

У меня есть программа, хранящаяся в байтовом массиве.

Возможно ли запустить его внутри C #?

Ответы [ 5 ]

16 голосов
/ 04 июня 2010

Да. Этот ответ показывает, что вы можете напрямую выполнять содержимое байтового массива. По сути, вы используете VirtualAlloc для выделения исполняемой области в куче с известным адресом (IntPtr). Затем вы копируете свой байтовый массив по этому адресу с помощью Marshal.Copy. Вы преобразуете указатель в делегат с помощью GetDelegateForFunctionPointer и, наконец, вызываете его как обычный делегат.

12 голосов
/ 04 июня 2010

Конечно.

  1. Сохранить байтовый массив в файл .exe.
  2. Используйте класс Process для запуска файла.

Примечание : это предполагает, что ваш байтовый массив является исполняемым кодом, а не исходным кодом. Это также предполагает, что у вас есть действительный PE-заголовок или вы знаете, как его создать.

11 голосов
/ 04 июня 2010

Предполагается, что байтовый массив содержит сборку .net (.exe или .dll):

 Assembly assembly = AppDomain.Load(yourByteArray)
 Type typeToExecute = assembly.GetType("ClassName");
 Object instance = Activator.CreateInstance(typeToExecute);

Теперь, если typeToExecute реализует интерфейс, известный вашей вызывающей программе, вы можете привести его к этому интерфейсу и вызвать методы для него:

 ((MyInterface)instance).methodToInvoke();
8 голосов
/ 05 июня 2010

Если байтовый массив представляет собой сборку .Net с EntryPoint (метод Main), вы можете просто сделать это. Большую часть времени returnValue будет null. И если вы хотите предоставить аргументы командной строки, вы можете поместить их в строку commandArgs, указанную ниже.

var assembly = Assembly.Load(assemblyBuffer);
var entryPoint = assembly.EntryPoint;
var commandArgs = new string[0];
var returnValue = entryPoint.Invoke(null, new object[] { commandArgs });
4 голосов
/ 04 июня 2010

Вы можете создать виртуальную машину и выполнить код, ИЛИ вы можете использовать отражения и динамические типы для создания динамической сборки. Вы можете динамически загрузить сборку.

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

Таким образом, вы могли бы что-то сделать с этим. Если мне не изменяет память, хотя есть некоторые ограничения.

См.

Отражение Assembly.Load Домен приложения

...