2017-04-11 35 views
0

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

可以这样使用C#和/或C++来实现?

+0

在C++中,这是一个变量编译.NET程序集将是几乎不可能,因为现代的CPU级和操作系统级保护的([来源](http://stackoverflow.com/questions/20233289/execute-instructions-from-the-heap#20233427)) – hlt

+0

我相信这实际上是可能的,但是你可能需要管理员权限和/或一些汇编代码来移动数据和/或相对深入的关于操作系统如何与不同存储类型一起工作的知识(可执行和不可用正exexutable)。 – ForceBru

+0

这就是所谓的过程空心。这是可能的,只是很困难。 – user3104201

回答

1

我不知道机器代码,但是你可以很容易地做到这一点与.NET代码。

有两种方法可以做,以产生在运行时组件。第一个是CodeDom,这是较旧的方法。第二个是通过Microsoft.CodeAnalysis NuGet包使用Roslyn。

这里是一个体面的article,做使用两种编译一个“Hello World”的例子。

当如果从启动程序(无论是作为一个独立的EXE或作为被加载的DLL)将具有相同的访问权限为你的程序创建组件使用此方法的组件。

编辑:如果你已经拥有你想加载存储在你只需要调用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. 
+0

谢谢你的提示! +1 – Artem

1

是的,你可以。它可能通过使用CodeDom,但它不是一个好主意。举例来说,用户可能会构建会损坏硬盘驱动器的字符串。

+0

*“举例来说,用户可能会构建一个会损坏硬盘驱动器的字符串。”*不是,代码会在运行过程中执行,它不能执行任何您的程序无法做到的事情 –

+0

@ScottChamberlain哦,很高兴我学到了新东西。阿尔乔姆,也许你应该看看Reflection.Emit。与CodeDom相比,它有一些优点和缺点。没有时间仔细观察。 – CallMeLeonardo

+0

@CallMeLeonardo,谢谢你的提示! +1 – Artem

相关问题