У меня есть программа, хранящаяся в массиве байтов.Запуск программы из байтового массива
Можно ли запустить его внутри C#?
У меня есть программа, хранящаяся в массиве байтов.Запуск программы из байтового массива
Можно ли запустить его внутри C#?
Несомненно.
.exe
.Process
для выполнения файла.Примечание: это при условии, что ваш массив байт исполняемый код, а не исходный код. Это также предполагает, что у вас есть допустимый PE-заголовок или знаете, как его создать.
Вы можете создать виртуальную машину и выполнить код ИЛИ вы могли бы использовать отражение и динамические типы для создания динамической сборки, потенциально. Вы можете динамически загружать сборку.
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx
Вы могли бы, таким образом, возможно, что-то делать с этим. Если моя память служит мне, хотя есть некоторые ограничения.
См
Отражение Assembly.Load Применение домена
Да. This answer показывает, что вы можете напрямую выполнять содержимое массива байтов. В принципе, вы используете VirtualAlloc
для выделения исполняемого региона в куче с известным адресом (a IntPtr
). Затем вы копируете массив байтов по этому адресу с помощью Marshal.Copy
. Вы конвертируете указатель в делегат с GetDelegateForFunctionPointer
и, наконец, называете его нормальным делегатом.
Предполагая, что массив содержит сборку .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 });
Какая программа? –
Допустим, у меня есть простая программа, которая показывает текст «Hello», хранящийся в массиве байтов – DanSpd
Каково содержимое этого массива? Исходный код, исполняемый код? – Ikke