是否可以阻止进程进行任何 Windows API 调用?

Is it possible to prevent a process from making any Windows API calls?

我正在开发一款游戏,并考虑了使它 mod 可行的方法。通常,引擎出于各种原因使用脚本语言。其中之一是引擎可以控制 mod 看到的内容,并且可以为用户提供一定程度的安全性,例如不允许文件访问或网络访问,或以某种方式对其进行限制。

对于我的游戏,我想深入研究提供 mods 作为已编译 DLL 的可能性。从安全角度来看,这里的问题是 dll 当然可以包含任何代码,所以我完全无法控制 files/network 等。dll 代码也可能破坏游戏的内存。解决此问题的一种方法是创建第二个进程,该进程无权访问 disk/network 并且只能使用主游戏进程提供的 API。内存可以在进程之间共享,但在切换到 mods 进程之前,页面可以标记为只读,因此没有机会破坏内存。

是否可以创建这样一个基本上无法访问系统或可控子集的进程?我正在考虑为 windows API 创建一个白名单,例如允许分配但不允许文件访问。我能找到的所有关于安全的文档都是关于其他人可以做什么 to/with 这个过程,而不是这个过程本身被允许做什么。

使用受限的 child 流程绝对是正确的方法,但没有一个 API 可以调用来完成这项工作。

您可能应该从 CreateRestrictedToken 开始并尽可能限制令牌。如果您是从头开始设计的,您也许可以使用 SaferComputeTokenFromLevel 创建一个 SAFER_LEVELID_UNTRUSTED 或更低的令牌,但并非一切都适用于此级别。

设置UACintegrity level to Low (or lower) (TokenIntegrityLevel). Ideally you would use an AppContainer但是API这方面的文档不是很好。 Google Chrome 可能会这样做,所以您可以看看他们是如何做到的。

您现在应该创建一个 job object 并至少使用 JobObjectBasicUIRestrictions 设置限制。

现在是启动因 CreateProcessAsUser 挂起的进程的时候了。

将进程添加到作业并恢复其执行。

新进程应该做的第一件事是调用SetProcessMitigationPolicy

您如何与 child 交流是它自己的主题。也许 CreateFileMapping 创建一个页面文件支持的内存区域。使用管道或事件来控制通信。