从字节数组运行程序

Dan*_*Spd 16 c# arrays byte

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

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

Mat*_*hen 16

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


JSB*_*ոգչ 12

当然.

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

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

  • @DanSpd,没有.操作系统不允许您从内存中的可执行文件执行单独的进程.您可以使用足够的魔法在您自己的*进程空间内执行内存中的代码,但强烈建议不要这样做.它会使你的程序看起来像许多扫描仪的恶意软件,因为这种技术经常被病毒和其他不受欢迎的人使用. (5认同)

cka*_*ras 11

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

 Assembly assembly = AppDomain.Load(yourByteArray)
 Type typeToExecute = assembly.GetType("ClassName");
 Object instance = Activator.CreateInstance(typeToExecute);
Run Code Online (Sandbox Code Playgroud)

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

 ((MyInterface)instance).methodToInvoke();
Run Code Online (Sandbox Code Playgroud)


Mat*_*ted 8

如果字节数组是带有EntryPoint(Main方法)的.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 });
Run Code Online (Sandbox Code Playgroud)