У меня есть программа, хранящаяся в массиве байтов.
Можно ли запустить его внутри С#?
У меня есть программа, хранящаяся в массиве байтов.
Можно ли запустить его внутри С#?
Да. Этот ответ показывает, что вы можете напрямую выполнять содержимое массива байтов. В принципе, вы используете VirtualAlloc
для выделения исполняемого региона в куче с известным адресом (IntPtr
). Затем вы копируете массив байтов в этот адрес с помощью Marshal.Copy
. Вы конвертируете указатель в делегат с GetDelegateForFunctionPointer
и, наконец, называете его нормальным делегатом.
Конечно.
.exe
.Process
для выполнения файла.Примечание: предполагается, что ваш байтовый массив является исполняемым кодом, а не исходным кодом. Это также предполагает, что у вас есть допустимый PE-заголовок или знаете, как его создать.
Предполагая, что массив байтов содержит .net-сборку (.exe или .dll):
Assembly assembly = AppDomain.Load(yourByteArray)
Type typeToExecute = assembly.GetType("ClassName");
Object instance = Activator.CreateInstance(typeToExecute);
Теперь, если typeToExecute реализует интерфейс, известный вашей вызывающей программе, вы можете применить его к этому интерфейсу и вызвать на нем методы:
((MyInterface)instance).methodToInvoke();
Если массив байтов является .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 });
Вы можете создать виртуальную машину и выполнить код ИЛИ использовать потенциальные отражения и динамические типы для создания динамической сборки. Вы можете динамически загружать сборку.
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx
Таким образом, вы могли бы что-то сделать с этим. Если моя память служит мне, хотя есть некоторые ограничения.
См.
Отражение Assembly.Load Область приложения