我正在构建一个游戏,每个玩家都必须对他的僵尸程序进行编程。关键的想法是播放器将使用C(或C ++,或任何兼容的语言)编程,构建DLL并将此DLL发送到服务器,以便没有人可以获取他的代码。问题是:如何确保他没有调用任何非法功能?就像创建文件或打开套接字一样。 DLL将加载LoadLibrary并将调用一个函数。所有交互都将在回调函数中发生。一个可能的解决方案是放置一个空的kernel32.dll(和其他),以便所有winapi调用都将失败。这样安全,适用于所有情况吗?有没有更好的方法呢?
请注意,播放器线程(称为dll的那个)必须仍然能够与游戏通信,可能还有一个打开的套接字。在Linux上,可以使用seccomp
轻松完成。
答案 0 :(得分:11)
最好的办法是创建一个权限降低的用户,这样可以非常轻松地控制文件访问,并在以该用户身份运行的子流程中运行bot代码。
如果您还想限制网络连接,也可以轻松设置防火墙,以便上述进程无权连接到外部主机。
如果您需要更多地控制允许或不允许的API调用,有一种称为“通过DLL重定向进行API拦截”的技术,例如:
http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf
(通过谷歌找到)
答案 1 :(得分:9)
如果没有在加载之前完全分析所有DLL(这基本上是不可能的),或者在与seccomp
相同的级别上创建某种魔法,这将无效。如果您采取任何限制其访问的措施,例如创建虚拟kernel32.dll
,则用户提交的DLL可以采取对策,例如加载您未考虑的DLL,调用由主机进程加载的DLL(可能通过主机应用程序中的函数!),或直接提交Windows系统调用。
一个选项可能是利用Google安全令牌功能,Google Chrome使用该功能来“沙盒化”网络渲染器进程。不过,这是令人难以置信的神秘的东西,它涉及到在单独的进程中运行DLL。如果您仍然感兴趣,可以阅读the Windows Chrome sandbox design documents。但请记住,Google花了很多开发时间让沙盒“正确”,但仍然有一些高调的妥协 - 你有可能在你的沙盒上做同样的事情。自己很苗条,特别是没有广泛的Windows安全经验。
答案 2 :(得分:1)
也许我的回答不是很有帮助,但我认为使用DLL或包含机器代码的任何其他可执行文件是不安全的,即使它是作为有限的用户运行,甚至在虚拟机中它仍然打开攻击向量。首先想到的是使用现成的解释器并使用它来编译自己的字节码。但是,如果您坚持使用DLL,则可以编辑DLL导入地址表并删除不需要的功能。听起来很复杂,有library for this
答案 3 :(得分:0)
本地防火墙可以解决网络问题 - 但我认为问题的其他部分没有简单的防弹解决方案。 我也相信放置一个“空”的kernel32和ntdll可能会给许多合法的进程带来一些严重的问题。