Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以执行存储在变量中的机器代码?_C#_C++_.net - Fatal编程技术网

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

C# 是否可以执行存储在变量中的机器代码?,c#,c++,.net,C#,C++,.net,是否可以将程序(无论是.NET目标还是纯机器代码)存储在字节数组中,然后将其直接放入内存并执行(即通过创建新进程)?程序必须具有内核访问权限,还是可以在用户模式下运行 这可以用C和/或C++实现吗?< /P> < P >是的,你可以。可以使用,但这不是一个好主意。例如,用户可能会生成一个会损坏硬盘的字符串。是的,您可以。可以使用,但这不是一个好主意。例如,用户可能会生成一个会损坏硬盘的字符串。我不确定机器代码,但您可以使用.NET代码轻松地完成此操作 有两种方法可以在运行时生成程序集。第一个问题

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


这可以用C和/或C++实现吗?< /P> < P >是的,你可以。可以使用,但这不是一个好主意。例如,用户可能会生成一个会损坏硬盘的字符串。

是的,您可以。可以使用,但这不是一个好主意。例如,用户可能会生成一个会损坏硬盘的字符串。

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

有两种方法可以在运行时生成程序集。第一个问题是,哪种方法比较老。第二种是通过NuGet包使用Roslyn

下面是一个体面的例子,它使用这两个编译器做了一个“helloworld”示例

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

编辑:如果您已经有一个要加载的已编译.net程序集,它存储在一个变量中,您只需调用并传入字节数组即可

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.

我不确定机器代码,但是你可以用.NET代码轻松地做到这一点

有两种方法可以在运行时生成程序集。第一个问题是,哪种方法比较老。第二种是通过NuGet包使用Roslyn

下面是一个体面的例子,它使用这两个编译器做了一个“helloworld”示例

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

编辑:如果您已经有一个要加载的已编译.net程序集,它存储在一个变量中,您只需调用并传入字节数组即可

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.

在C++中,这将是几乎不可能的,因为现代CPU级别和OS级保护()我相信这是可能的,但是您可能需要管理员特权和/或一些汇编代码来移动数据和/或相对深度的知识,关于操作系统是如何与不同的存储类型一起工作的(可执行的和不可扩展的)。.这叫过程空心化。在C++中,这是不可能的,因为现代CPU级别和OS级保护()我相信这是可能的,但是你可能需要管理员特权和/或一些汇编代码来移动数据和/或相对深度的知识,关于OS如何使用不同的存储类型。(可执行和不可执行)。这称为进程空洞化。这是可能的,只是很难。“举个例子,用户可以构建一个字符串,这会损坏你的硬盘。”不是真的,代码会在进程中运行,它不能做程序不能做的任何事情already@ScottChamberlain哦,很高兴我学到了一些新东西。阿泰姆,也许你应该看看Reflection.Emit。它与CodeDom相比有一些优点和缺点。没有时间仔细看看。@CallMeLeonardo,谢谢你的提示!+1“举例来说,用户可以创建一个会损坏硬盘的字符串。”不是真的,代码会在进程中运行,它不能做程序不能做的任何事情already@ScottChamberlain哦,很高兴我学到了一些新东西。阿泰姆,也许你应该看看Reflection.Emit。它与CodeDom相比有一些优点和缺点。没有时间仔细看看。@CallMeLeonardo,谢谢你的提示!+1谢谢你的提示!+1谢谢你的提示!+1