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