【问题标题】:Lua Sandbox "hacking"Lua 沙盒“黑客”
【发布时间】:2017-05-12 02:35:48
【问题描述】:

所以我使用了一个程序,在 lua 中编写 mods,lua 处于沙盒状态,这意味着大多数功能都像 IO 和 OS 一样被阻止,我什至不能使用 REQUIRE 添加库。 我需要一个在我的一个模组中解压缩文件的功能,但我似乎没有找到办法。 有什么办法吗? 如果不能以简单的方式实现,是否可以破解程序 .exe 或 dll 以在 lua 中重新启用这些功能?

提前谢谢你,问候

【问题讨论】:

  • 如果您的 .exe 使用 Lua 作为 DLL,您可以将 DLL 替换为功能齐全的 Lua DLL。
  • 这就是我的想法,但它不使用 lua dll,其他选项是什么?它是嵌入在 .exe 还是任何其他 dll 上?如果是,它仍然可行吗?
  • 这是一种 hacky 方式,但您可以尝试利用该程序(特别是通过 C++ 的 DLL 注入)

标签: lua sandbox


【解决方案1】:

纯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")

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2020-03-10
    • 2016-04-21
    相关资源
    最近更新 更多