我想编写一个沙箱虚拟机来执行已编译的程序。我的目标是将该程序与操作系统的其余部分隔离并控制其执行,以便它不会对主机做出任何有害的事情。
我假设:
- 执行的程序被编译为可移植可执行格式,并且是机器代码,而不是任何类型的字节代码或 CLR,
- 执行的程序不允许与打印机、扫描仪等外围设备通信,并且不使用任何GUI,
- 执行的程序的主要任务是处理本地文件中存储的一些数据(例如计算),并将其结果放入另一个本地文件中,
- 执行的程序不应该能够直接与操作系统通信,每个请求都应该由虚拟机处理,任何可能对操作系统造成损害的请求都应该被阻止。
我对沙箱虚拟机的架构和运行的概念:
- 应用程序由多个模拟对象组成:处理器、内存、文件的 I/O 操作、
- 有一个模块读取编译文件并将可执行代码加载到虚拟内存中,
- 然后虚拟处理器从第一个字节开始处理,读取操作码、参数,如果需要的话从内存加载它们,执行命令并将结果放在适当的位置,如果需要设置虚拟标志,然后读取下一个命令,直到程序执行完毕到最后。
您觉得怎么样:这是一个好概念吗?你会改变什么来改进它?
模拟完整的机器似乎是执行本机代码的一种非常慢的方法。仅针对单个本机指令进行大量加载、查找、执行、存储等操作。
我会尝试本地执行至少一些代码块。想想下面的代码。
int sum = 0;
for (int i = 0; i < 10; i++)
{
sum += i;
}
该代码可以完全安全地在虚拟机中本地执行。只需确保向虚拟机代码注入返回调用即可。
但我会尝试更进一步,本地执行除库/操作系统调用之外的所有代码。在加载沙盒应用程序之前,扫描文件并将所有“危险”调用替换为对虚拟机中处理程序的调用。
代码
printf("Hello World\n");
将被替换为对您的图书馆的调用
myVM_printf("Hello World\n");
然后,您可以以本机速度执行整个程序,并且仍然能够处理虚拟机中的所有危险代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)