我正在构建一个游戏,每个玩家都必须为自己的机器人编程。关键思想是玩家将使用 C(或 C++,或任何兼容语言)进行编程,构建一个 DLL 并将此 DLL 发送到服务器,这样就没有人可以得到他的代码。问题是:如何确定他没有调用任何非法函数?就像创建文件或打开套接字一样。 DLL 将使用 LoadLibrary 加载并调用一个函数。所有交互都将通过回调函数进行。一个可能的解决方案是放置一个空的 kernel32.dll(和其他),这样所有的 winapi 调用都会失败。这是否安全并且适用于所有情况?有更好的方法吗?
请注意,玩家线程(也就是所谓的 dll)必须仍然能够与游戏进行通信,也许是通过一个打开的套接字。在 Linux 上,这可以通过 seccomp
轻松完成。 .
最佳答案
最好的办法是创建一个权限较低的用户,这样您就可以很容易地控制文件访问,并在以该用户身份运行的子进程中运行机器人代码。
如果你也想限制网络连接,也很容易设置防火墙,使上述进程无权连接到外部主机。
如果您需要更多地控制允许或不允许哪些 API 调用,可以使用一种称为“通过 DLL 重定向进行 API 拦截”的技术,例如在此处进行说明:
http://109.163.225.194/download/files/other/DLL_Redirection_en.pdf
(通过谷歌找到)
关于c - 禁用 WinAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12320763/