Запустите Программу от массива байтов

Мне сохранили программу в массиве байтов.

Действительно ли возможно выполнить его в C#?

16
задан Amicable 30 April 2014 в 15:11
поделиться

5 ответов

Конечно.

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

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

12
ответ дан 30 November 2019 в 15:38
поделиться

Если массив байтов является сборкой .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 });
8
ответ дан 30 November 2019 в 15:38
поделиться

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

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

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

См.

Reflection Assembly.Load Application Domain

4
ответ дан 30 November 2019 в 15:38
поделиться

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

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

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

 ((MyInterface)instance).methodToInvoke();
11
ответ дан 30 November 2019 в 15:38
поделиться

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

16
ответ дан 30 November 2019 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: