是否可以阻止进程进行任何 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
创建一个页面文件支持的内存区域。使用管道或事件来控制通信。
我正在开发一款游戏,并考虑了使它 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
创建一个页面文件支持的内存区域。使用管道或事件来控制通信。