C# 或 C++ 沙盒程序集

标签 c# c++ assembly sandbox

我正在考虑编写一个包含超快速汇编的程序,或者因为它不必是人类可读的,所以它可以是 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/

相关文章:

c# - WPF:是否有资源更改触发的事件

c# - 如何在 C# 中将数组放入结构中?

c# - .NET 中的 DeflateStream 4GB 限制

c++ - 视差着色器

c# - WPF DataTrigger/DataBinding 失败?

c++ - Netbeans C++ 应用程序无法构建

使用 -O1 编译时 C++ regex_search 中断

ios - 在 iOS 上将 x86 asm 代码转换为 arm 代码

assembly - 汇编中main函数开头的栈内存操作

linux - gdb 不接受输入重定向