是否可以在一个字节数组中存储一个程序(一个.NET目标机器或纯机器代码),然后将其直接存入内存并执行它(即创建一个新进程)?程序是否必须具有内核访问权限,还是可以在用户模式下运行?是否可以执行存储在变量中的机器代码?
可以这样使用C#和/或C++来实现?
是否可以在一个字节数组中存储一个程序(一个.NET目标机器或纯机器代码),然后将其直接存入内存并执行它(即创建一个新进程)?程序是否必须具有内核访问权限,还是可以在用户模式下运行?是否可以执行存储在变量中的机器代码?
可以这样使用C#和/或C++来实现?
我不知道机器代码,但是你可以很容易地做到这一点与.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.
谢谢你的提示! +1 – Artem
是的,你可以。它可能通过使用CodeDom,但它不是一个好主意。举例来说,用户可能会构建会损坏硬盘驱动器的字符串。
*“举例来说,用户可能会构建一个会损坏硬盘驱动器的字符串。”*不是,代码会在运行过程中执行,它不能执行任何您的程序无法做到的事情 –
@ScottChamberlain哦,很高兴我学到了新东西。阿尔乔姆,也许你应该看看Reflection.Emit。与CodeDom相比,它有一些优点和缺点。没有时间仔细观察。 – CallMeLeonardo
@CallMeLeonardo,谢谢你的提示! +1 – Artem
在C++中,这是一个变量编译.NET程序集将是几乎不可能,因为现代的CPU级和操作系统级保护的([来源](http://stackoverflow.com/questions/20233289/execute-instructions-from-the-heap#20233427)) – hlt
我相信这实际上是可能的,但是你可能需要管理员权限和/或一些汇编代码来移动数据和/或相对深入的关于操作系统如何与不同存储类型一起工作的知识(可执行和不可用正exexutable)。 – ForceBru
这就是所谓的过程空心。这是可能的,只是很困难。 – user3104201