2010-06-04 3 views
15

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

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

+2

Какая программа? –

+0

Допустим, у меня есть простая программа, которая показывает текст «Hello», хранящийся в массиве байтов – DanSpd

+8

Каково содержимое этого массива? Исходный код, исполняемый код? – Ikke

ответ

11

Несомненно.

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

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

+2

+1 простой и понятный! – Kryptic

+0

Возможно, им нужно будет добавить исполняемый заголовок вправо? – m0s

+1

Возможно ли это сделать, но без сохранения байтового массива в exe-файл? Также да, это исполняемый файл. – DanSpd

4

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

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

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

См

Отражение Assembly.Load Применение домена

15

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

11

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

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

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

((MyInterface)instance).methodToInvoke(); 
6

Если массив является сборка .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 }); 
Смежные вопросы