我正面临着lua的问题,
每次我执行一个函数/命令甚至定义一个变量时,一切都会作为字符串存储在内存中。
它可以通过Cheat Engine或HxD
等程序读取例如
x = 'Test'
如果我搜索字符串x =' 我将能够从内存中添加整个命令。 功能相同
function Test()
print(1);
end
搜索Test()将允许我获取整个函数脚本。
这是一个示例图片 http://i40.tinypic.com/6oh281.png
你可以在Memory Viewer窗口的底部看到,它是整个功能信息。
现在我怎么能阻止lua在内存中创建脚本的'额外'副本? Garbagecollector不会擦除它。
任何解决方案或想法都会受到欢迎。
答案 0 :(得分:2)
我不确定你的意思,但尝试luaL_loadbuffer(L,script,strlen(script),”=noname”)
加载脚本。如果您使用luaL_dostring
,则整个脚本将保存为自己的名称。
另请注意,您可以加载一次脚本并多次运行,而无需再次加载。
答案 1 :(得分:0)
您根本不需要加载脚本的Lua源。使用luac -s
预编译脚本。当然,Lua字节码和字符串仍然可以在内存中访问,也很容易找到。
luac的输出是二进制形式的脚本。像Lua脚本一样使用它。您可以将其与loadstring
,loadfile
等一起使用。
制作你的test.lua:
print("testing")
测试:
luac -o test.lub -s test.lua
lua test.lua
lua test.lub
要了解你所暴露的与Lua来源的对比:
luac -l test.lub
答案 2 :(得分:0)
默认情况下,lua将键(x
)存储为字符串,将值作为对象存储在内存中。除了管理脚本和仅将值存储在块中之外,您无法使用它。尽管如此,这种方式可以被作弊引擎检测到,但它比默认更安全。
safe.lua:
local protected = {}
protected.x = "Test"
safe = {}
function safe.Get(pass, val)
if pass == "0x012345" then
if not protected[val] then return nil end
return protected[val]
end
return nil
end
function safe.Set(pass, val, key)
if not pass == "0x012345" then return end
protected[val] = key
end
function safe.Remove(pass, val)
if not pass == "0x012345" then return end
if not protected[val] then return end
protected[val] = nil
end
test.lua:
safe.Set("0x012345", "b", {C = "111"})
print(safe.Get("0x012345", "b").C)
如果您想为每个密钥使用自定义传递,请使用此safe.lua:
local protected = {}
safe = {}
function safe.Get(pass, val)
if protected[val] then
if not protected[val][pass] then return nil end
return protected[val][pass]
end
return nil
end
function safe.Set(pass, val, key)
protected[val] = {}
protected[val][pass] = key
end
function safe.Remove(pass, val)
if not protected[val] then return end
if not protected[val][pass] then return end
protected[val][pass] = nil
end
和test.lua:
safe.Set("tsting", "x", "keey")
print(safe.Get("tsting", "x"))
print(safe.Get("testing", "x"))