2016-12-27 6 views
2

Итак, я использую программу, в которой я создаю скрипты в lua, lua находится в состоянии песочницы, то есть большинство функций блокируются как IO и OS, я даже не могу использовать REQUIRE для добавления libs. Мне нужна функция, которая распаковывает файлы в одном из моих модов, и я, похоже, не нашел способ. Есть ли все-таки сделать это? Если это невозможно в простой форме, можно ли взломать программу .exe или dll для повторного включения этих функций в lua?Lua Sandbox «hacking»

Спасибо заранее, С уважением

+0

Если ваш .exe использует Lua как DLL, вы, вероятно, можете заменить DLL полнофункциональной Lua DLL. – lhf

+0

Это было то, о чем я думал, но он не использует lua dll, каковы другие варианты? он встроен в .exe или в любую другую DLL? если это все еще выполнимо? – user572420

+0

Это взломанный способ, но вы можете попытаться использовать программу (в частности, с помощью DLL-инъекции с C++) – devRicher

ответ

1

Есть декомпрессионных Librarys в чистом 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")