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