Lua 沙盒 "破解"

所以我使用一款可以用lua脚本编写模组的程序,该lua处于沙盒状态,意味着大多数函数都被阻止了,如IO和OS,我甚至不能使用REQUIRE添加库。 我需要一个解压我的模组文件的函数,但我似乎找不到方法。 有什么办法可以做到吗? 如果没什么容易的方法,可以通过破解程序 .exe 或 dlls 来重新启用这些lua函数吗?

谢谢您提前,敬礼。

点赞
用户5147427
用户5147427

在纯 Lua 中有解压缩库,你可以将其嵌入任何允许加载 Lua 脚本的环境中: http://lua-users.org/wiki/CompressionAndArchiving

如果你无法访问任何文件,可以尝试一个简单的打包程序:

#!/usr/bin/env lua
local files = arg
local w = io.write
local function pack(...) return {...} end

w("files = {\n")
for i, filename in ipairs(arg) do
    w('\t["' ..filename .. '"] = "')
    local file = assert(io.open(filename, "r"), "Can't open file!")
    local data = file:read("*a")
    data = data:gsub("\a", "\\a")
        :gsub("\\", "\\\\")
        :gsub("\f", "\\f")
        :gsub("\n", "\\n")
        :gsub("\r", "\\r")
        :gsub("\t", "\\t")
        :gsub("\v", "\\v")
        :gsub('"', '\\"')
        :gsub("'", "\\'")
    w(data, '",\n')
end
w("}\n")
w([[
function require(path)
    local data = assert(files[path..".lua"], "file not found")
    local func = assert(loadstring(data))
    local _, ret = assert(pcall(func))
    return ret
end
]])
w('require("', arg[1]:match("^(.-)%.lua$"),'")\n')

这将创建一个类似这样的脚本:

$ ./packer.lua init.lua
files = {
    ["init.lua"] = "for k,v in pairs(arg) do\n\tprint(k,v)\nend\n",
}
function require(path)
    local data = assert(files[path..".lua"], "file not found")
    local func = assert(loadstring(data))
    local _, ret = assert(pcall(func))
    return ret
end
require("init")
2017-05-14 00:05:22