Запустить программу из массива байтов

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

Можно ли запустить его внутри С#?

Ответ 1

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

Ответ 2

Конечно.

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

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

Ответ 3

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

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

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

 ((MyInterface)instance).methodToInvoke();

Ответ 4

Если массив байтов является .Net-сборкой с EntryPoint (основным методом), вы можете просто сделать это. В большинстве случаев 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 });

Ответ 5

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

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

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

См.

Отражение Assembly.Load Область приложения