从字节数组运行程序

时间:2010-06-04 19:24:49

标签: c# arrays byte

我有一个以字节数组存储的程序。

是否可以在C#中运行它?

5 个答案:

答案 0 :(得分:16)

是。 This answer表明您可以直接执行字节数组的内容。基本上,您使用VirtualAlloc在堆上分配一个具有已知地址(IntPtr)的可执行区域。然后使用Marshal.Copy将字节数组复制到该地址。您将指针转换为具有GetDelegateForFunctionPointer的委托,最后将其称为普通委托。

答案 1 :(得分:12)

不确定

  1. 将字节数组保存到.exe文件。
  2. 使用Process类执行文件。
  3. 注意:这假设您的字节数组是可执行代码,而不是源代码。这也假设您有一个有效的PE头或知道如何制作一个。

答案 2 :(得分:11)

假设字节数组包含.net程序集(.exe或.dll):

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

现在,如果typeToExecute实现了调用程序已知的接口,则可以将其强制转换为此接口并在其上调用方法:

 ((MyInterface)instance).methodToInvoke();

答案 3 :(得分:8)

如果字节数组是带有EntryPoint(主方法)的.Net程序集,则可以执行此操作。大部分时间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 });

答案 4 :(得分:4)

您可以创建虚拟机并执行代码,也可以使用反射和动态类型来创建动态程序集。您可以动态加载程序集。

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

你也许可以做点什么。如果我的记忆对我有用,虽然有一些限制。

反射 Assembly.Load 应用领域