Lua中能否阻止loadstring被赋值为print以避免脚本源码泄露?
Lua混淆器防loadstring篡改可用方案
以下是几种可落地的实现方式:
- 优先使用局部变量缓存原生
loadstring
在混淆器生成的代码最开头就把原生loadstring存到局部变量,后续所有代码里的loadstring调用全部替换为这个局部变量。全局loadstring被篡改不会影响局部变量的指向,示例逻辑:local raw_loadstring = loadstring -- 后续所有loadstring调用都替换为raw_loadstring raw_loadstring("print('Hello')")() - 锁定全局
loadstring禁止修改
可以通过修改_G的元表拦截对loadstring的赋值操作,攻击者无法覆盖全局的原生函数:setmetatable(_G, { __newindex = function(t, key, value) if key == "loadstring" then return end rawset(t, key, value) end }) - 替换
loadstring调用入口
可以把所有loadstring调用替换为等价的底层接口,比如Lua 5.2+可用load函数直接处理字符串输入,LuaJIT环境还可以通过ffi直接调用C层的luaL_loadstring接口,完全绕开Lua层的全局函数暴露。
额外注意:缓存原生函数的局部变量不要泄露到全局作用域,避免被攻击者定位覆盖。
内容的提问来源于stack exchange,提问作者cheat central
相关产品推荐
相关产品推荐

