我正在考虑编写一个包含超快速汇编的程序,或者因为它不必是人类可读的,所以它可以是 C++ 或 C# 中的机器代码。然而,我还有其他可能更麻烦的要求。
我需要能够:
将机器代码程序存储在普通变量/对象实例中,例如字符串“40 9B 7F 5F ...”以编辑和运行它们。
让程序能够输出数据。我看到一个示例,其中有一个指向它可以使用的 int 的指针。
让程序无法在其他任何地方输出数据。例如,无法执行删除文件、查看系统规范或更改它们所在的 C++ 或 C# 程序的内存状态等操作。
例如,它可能是这样的:
machine n;
n = "40 9B 7F";
n[1] = "5F";
// 'n' is now "40 5F 7F"
unsigned short s = 2;
n.run(&s);
// while 'n' was running it may have changed 's' but would not have been able to
// change anything else anywhere on the system including in this C++ / C# program
根据 Michael Dorgan 发布的 wiki 链接“asm(std::string);”将 String 作为汇编程序运行,并且也很容易从程序的 C++ 部分引用变量。编辑 std::String 很容易,Alex 注意到我可以通过不允许不安全的命令来确保代码安全。
最佳答案
对 native 机器代码进行沙盒处理并非易事。如果你真的想要看看NACL来自谷歌,它为浏览器实现了一个机器代码沙箱。
更实用的是使用 .NET IL 而不是机器代码,并使用沙盒(或托管)AppDomain。由于对机器代码的动态 jit 编译,这更接近并且仍然很快。
另一种方法是使用 Windows 内置权限管理并生成一个具有受限权限的新进程。从来没有这样做过,所以我不知道您是否可以根据需要尽可能多地减少目标进程权限。无论如何,这将是一个仅运行机器代码的纯 win32 进程,因此您将失去在沙盒进程中使用 .NET 的任何能力。
关于C# 或 C++ 沙盒程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8197020/