如何阻止Lua中loadstring函数被覆写?保障客户端代码安全
问题1:如何阻止loadstring被修改拦截
要保障loadstring不被篡改,核心思路是绕开全局环境的依赖,或者限制全局变量的修改:
优先使用局部变量缓存原生函数
在你的代码最开始就把原生loadstring存到局部变量里,之后全程只用这个局部变量执行代码:-- 最顶部执行,缓存原生loadstring local raw_loadstring = loadstring -- 后续解密代码后,用这个局部变量执行 local decrypted_code = 你的解密逻辑() raw_loadstring(decrypted_code)()局部变量属于当前作用域,其他脚本无法访问或修改,完全不受全局
loadstring被篡改的影响,这是最安全的方案。拦截全局loadstring的修改(非绝对安全)
通过给全局环境_G设置元表,拦截对loadstring的赋值操作,但这种方法挡不住用rawset强制修改的情况:setmetatable(_G, { __newindex = function(t, key, val) if key == "loadstring" then error("不允许修改loadstring") else rawset(t, key, val) end end })
问题2:替代方案中调用的loadstring是原生的吗?
你写的这段代码里,最后一行调用的loadstring是自定义的版本,不是原生函数。
因为你已经把全局变量loadstring覆盖成了自己定义的函数,当执行loadstring('print("Hello World!")')时,会优先使用全局的新函数。如果要确保调用原生loadstring,需要直接用你之前缓存的_loadstring,把最后一行改成:
_loadstring('print("Hello World!")')
内容的提问来源于stack exchange,提问作者kaleb sociais
相关产品推荐
相关产品推荐

