c - 仅使用 C 安全地执行任意 Lua 代码

标签 c lua

我知道你可以 safely execute arbitrary code from Lua通过使用 Lua 函数 setfenv 将安全的东西列入白名单。但是,如果我通过脚本执行此操作,它不仅不整洁,而且(用户可修改的游戏)安装模组的毫无戒心的用户可以在将模组安装到文件夹时单击“全部替换”或其他内容,而无需考虑任何事情.我敢肯定还有其他方法也可以非常轻松地绕过它。

总的来说,最安全的方法应该是使用直接 C 调用来执行此操作,在设置沙箱时不涉及 Lua 代码/字符串。我该怎么做?

最佳答案

您在 Lua 脚本中编写的任何代码也可以通过 Lua C API 在 C 中执行。但是在 C 中比等效的 Lua 脚本更难理解。当我想为主机程序提供一些 protected Lua 脚本时,我做了一些事情,例如:

  • 将它们放在一个单独的目录中。
  • 将它们加密到只有我的 C 程序知道私钥的文件中。
  • 将它们作为多行字符串嵌入到 C 源代码中。
  • 将编译后的脚本作为二进制字符串嵌入到我的 C 源代码中,这样它们就不会通过对程序的 exe 进行二进制编辑而轻易破解。 (有时我使用脚本的 SHA 来防止它们在 exe 中被编辑) ...等等。

您肯定希望通过使用沙盒来保护运行游戏的计算机免受恶意脚本的侵害。例如,没有文件系统访问权限。但请注意,为了保护您的主机程序免受各种形式的恶意脚本(例如,通过 while 1 循环挂起游戏的 Lua 实例线程;或大量内存使用,例如复杂的 string.match 调用),您必须做更复杂的工作并为赋予 mod 脚本的环境添加更多约束。

例如即使 while 1 do end 仍会挂起 WOW UI。

希望对您有所帮助。

关于c - 仅使用 C 安全地执行任意 Lua 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48040206/

相关文章:

c - 使用 memcpy 和 void* 交换函数

c - `uint_fast32_t` 是否保证至少与 `int` 一样宽?

regex - 在lua中使用指定的分隔符分割字符串

class - 在Lua中,每个 "object"都必须有自己的方法副本吗?

c++ - Lua C API : Retrieve values from Lua function returning a table in C code

lua - lua __pairs 的实际实现是什么?

c++ - 设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()

c - 具有C API和开放源代码的键值数据库

c++ - 如果变量的值发生变化,则恢复程序

lua - 在协议(protocol)字段创建中发出 'attempt to index global ' base''