从字节数组运行程序
Posted
技术标签:
【中文标题】从字节数组运行程序【英文标题】:Run Program from byte array 【发布时间】:2011-02-27 23:03:16 【问题描述】:我有一个程序存储在字节数组中。
是否可以在 C# 中运行它?
【问题讨论】:
假设我有一个简单的程序,显示存储在字节数组中的文本“Hello” 那个数组的内容是什么?源代码,可执行代码? 【参考方案1】:是的。 This answer 表明您可以直接执行字节数组的内容。基本上,您使用VirtualAlloc
在堆上分配一个具有已知地址(IntPtr
)的可执行区域。然后使用Marshal.Copy
将字节数组复制到该地址。您将指针转换为 GetDelegateForFunctionPointer
的委托,最后将其作为普通委托调用。
【讨论】:
【参考方案2】:当然。
-
将字节数组保存到
.exe
文件中。
使用Process
类来执行文件。
注意:这是假设您的字节数组是可执行代码,而不是源代码。这也假设您有一个有效的 PE 标头或知道如何制作。
【讨论】:
是否可以做到这一点,但实际上没有将字节数组保存到 exe 文件中?也是的,它是可执行的。 @DanSpd,没有。操作系统不允许您从内存中的可执行文件执行单独的进程。您可以通过足够的魔法在自己的自己的进程空间中执行内存中的代码,但强烈不推荐这样做。而且它会让你的程序在许多扫描仪看来像恶意软件,因为这种技术经常被病毒和其他不受欢迎的人使用。 您可能无法在第二个进程中生成它,但您可以在新的应用程序域中运行它。【参考方案3】:假设字节数组包含一个 .net 程序集(.exe 或 .dll):
Assembly assembly = AppDomain.Load(yourByteArray)
Type typeToExecute = assembly.GetType("ClassName");
Object instance = Activator.CreateInstance(typeToExecute);
现在,如果 typeToExecute 实现了调用程序已知的接口,则可以将其强制转换为该接口并在其上调用方法:
((MyInterface)instance).methodToInvoke();
【讨论】:
【参考方案4】:如果字节数组是带有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 );
【讨论】:
【参考方案5】:您可以创建虚拟机并执行代码,或者您可以使用反射和动态类型来创建动态程序集。您可以动态加载程序集。
http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx
因此,您也许可以用它做点什么。如果我的记忆对我有用,尽管有一些限制。
见
反射 装配.加载 应用领域
【讨论】:
以上是关于从字节数组运行程序的主要内容,如果未能解决你的问题,请参考以下文章