是否可以执行存储在变量中的机器代码?

时间:2017-04-11 12:11:23

标签: c# c++ .net

是否可以将程序(.NET目标或纯机器代码)存储在字节数组中,然后将其直接放入内存并执行它(即通过创建新进程)?程序是否必须具有内核访问权限,还是可以在用户模式下运行?

可以使用C#和/或C ++实现吗?

2 个答案:

答案 0 :(得分:1)

是的,你可以。使用CodeDom可以实现,但这不是一个好主意。例如,用户可以构建一个会损坏硬盘的字符串。

答案 1 :(得分:1)

我不确定机器代码,但您可以使用.NET代码轻松完成此操作。

在运行时可以使用两种方法生成程序集。第一个是CodeDom,这是做旧的方法。第二种是通过Microsoft.CodeAnalysis NuGet包使用Roslyn。

这是一个体面的article,使用两个编译器执行“Hello World”示例。

使用此方法创建程序集时,程序集如果从程序启动(作为独立的exe程序或作为加载的dll)将具有与程序相同的访问权限。

编辑:如果您已经有一个已编译的.net程序集,您希望加载它存储在一个变量中,您只需要调用Assembly.Load(byte[])并传入您的字节数组

byte[] data = //...
var assembly = Assembly.Load(data);
dynamic instance = assembly.CreateInstance("YourNamespace.SomeClass"); //assuming the constructor "public SomeClass()" exists.
intance.Run(); //assuming the function "public void SomeClass.Run()" exists.