禁用WinAPI

5
我正在制作一个游戏,每个玩家都必须编写自己的机器人程序。关键思想是,玩家将用C(或C ++或任何兼容的语言)编写程序,构建一个DLL并将其发送到服务器,以便没有人可以获取他的代码。问题是:如何确保他不调用任何非法函数?例如创建文件或打开套接字。 DLL将使用LoadLibrary加载,并调用一个函数。所有交互都将通过回调函数进行。可能的解决方案是放置一个空的kernel32.dll(和其他文件),以使所有winapi调用失败。这样安全吗?在所有情况下都有效吗?有更好的方法吗?
请注意,玩家线程(调用dll的线程)仍然必须能够与游戏通信,可能是通过打开套接字。在Linux上,这可以通过seccomp轻松完成。

2
你有没有考虑过脚本引擎? - jrok
这可能是一个选项。但我仍然想知道是否可以使用C语言实现。因为我可以在Linux上做到这一点,所以我希望Windows也能够做类似的事情。 - Guilherme Bernal
谷歌在 Chrome 中使用原生客户端(NaCl)实现了这一点。不容易... - ixe013
Detours - Win32函数的二进制拦截 - RonTLV
4个回答

11

最好的方法是创建一个权限较低的用户,这样您可以轻松控制文件访问,并将机器人代码作为该用户的子进程运行。

如果您还想限制网络连接,也很容易设置防火墙,以便上述进程没有权利连接到外部主机。

如果您需要更多的控制来允许或拒绝哪些API调用,可以使用一种称为“通过DLL重定向进行API截获”的技术,例如在此处进行了解:

http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf
< p >(通过Google找到)< /p >

1
使用API拦截来禁用所有功能非常困难,但使用非常有限的用户帐户可能是可行的方法! - TCS
2
我无法访问那个链接,但 DLL 重定向对程序员没有帮助,因为程序员可以自己执行系统调用。 - Mike Vine

9

如果不对所有DLL进行全面分析(这基本上是不可能的),或者创建与seccomp同级别的某种魔法,它就无法正常工作。无论你采取什么措施来限制它们的访问,比如创建一个虚假的kernel32.dll,用户提交的DLL都可以采取反制措施,比如加载你没有考虑到的DLL、调用由主机进程加载的DLL(可能通过主机应用程序中的函数!)或直接提交Windows系统调用。

一个选项可能是利用Windows安全标记功能,谷歌Chrome使用它来“沙盒”Web渲染器进程。然而,这是一些非常晦涩的东西,它无论如何都需要在一个单独的进程中运行DLL。如果你还感兴趣,可以阅读Windows Chrome沙盒设计文档。但请记住,谷歌花费了大量开发时间来完善沙盒,尽管仍然存在一些备受关注的妥协——你能够在自己的设备上做到同样的事情的几率很小,特别是没有丰富的Windows安全经验。


1
也许我的答案不是很有帮助,但我认为使用DLL或任何包含机器代码的可执行文件都是不安全的,即使它被限制用户或在虚拟机中运行,它仍然会打开攻击向量。首先想到的是使用现成的解释器,并使用它来编译自己的字节码。但是,如果您坚持使用DLL,可以编辑DLL导入地址表并放弃不需要的函数。尽管这听起来很复杂,但有适用于此的库

0
一个本地防火墙可能可以解决网络方面的问题,但我并没有看到其他部分有简单且万无一失的解决方案。 我也认为放置“空”的kernel32和ntdll可能会对许多合法进程造成严重问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接