Lua - 如何在不更改的情况下欺骗 GetFenv 函数?



我有一些代码,我想在其中找到漏洞,我对其进行了编码,如果您能帮助我在其中找到任何内容,我将不胜感激。

我唯一担心的是getfenv可能会以某种方式被欺骗。

coroutine.wrap(function()
while wait() do
for i, v in func_table.pairs(func_table) do
if func_table.getfenv()[i] ~= v then
return ban_func(10, 23)
end
end
end
end)()    

需要明确的是,ban_func在func_table内部,这将自动检测其数据变化并相应地禁止。我认为他们作为剥削者/作弊者能够改变任何事情的唯一方法是欺骗getfenv。

如果您能向我解释如何欺骗这样的函数和/或如何修补该功能的欺骗,所有这些都无需更改其自己的任何数据,我将非常高兴!

我假设这段代码在利用者/作弊者机器上运行。从根本上说,没有办法保证客户端代码的安全性。可以删除您的支票,也可以删除您的支票支票。甚至Lua二进制文件本身也可以在内部更改,并且getfenv可以更改以执行除其功能之外的任何事情。在服务器和客户端逻辑之间实现强边界是保护应用程序的唯一真正方法。

在这种情况下,一种可能的攻击是,客户端在设置func_table之前以同一lua_State运行 Lua 代码。在这种情况下,他们可以像我在这里找到的lua沙盒实现一样对你进行沙盒处理。

另一种攻击是利用元方法使func_table.getfenv()[i] ~= v返回 true。这可以通过使用 rawequal、检查func_table.getfenv()[i]的类型或使用原始函数作为真值表中的键并检查键func_table.getfenv()[i]处的表是否为真来检测。

另一种攻击是同时编辑全局状态和表。在更改函数的地址时,通常会在 ram 中更改对该地址的所有引用,这将包括表中的内部引用。

由于您正在使用wait()因此我假设您正在 Roblox 中运行此代码。在这种情况下,正如我在他们的开发者论坛上强调的那样,experimental mode(以前filtering enabled(设置是保护您的游戏免受攻击者攻击的唯一方法。这样可以防止客户端在大部分时间编辑游戏。他们仍然可以完全控制自己的角色位置,其他几种实例类型(我相信是 Hats(,可以要求服务器通过 RemoteEvent 和 RemoteFunction 实例进行更改,以及 wall hack(设置墙壁透明度((为了解决这个问题,只发送它可以看到的客户端部分(。

相关内容

  • 没有找到相关文章

最新更新