从字节数组运行程序

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

是否有可能在C#中运行它?

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

当然。

  1. 将字节数组保存为.exe文件。
  2. 使用Process类来执行该文件。

注意 :这是假设您的字节数组是可执行代码,而不是源代码。 这也假定您有一个有效的PE标头或知道如何制作一个。

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

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

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

  ((MyInterface)instance).methodToInvoke(); 

如果字节数组是带有EntryPoint (主方法)的.Net程序集,则可以执行此操作。 大多数时候returnValue将为null 。 如果您想提供命令行参数,可以将它们放在commandArgs列出的commandArgs字符串中。

 var assembly = Assembly.Load(assemblyBuffer); var entryPoint = assembly.EntryPoint; var commandArgs = new string[0]; var returnValue = entryPoint.Invoke(null, new object[] { commandArgs }); 

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

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

因此,你可以做一些事情。 如果我的记忆对我有用,虽然有一些限制。

看到

反思Assembly.Load应用程序域