Файл с именем test.c
, который вы можете передать в качестве входных данных для cc
, является исходным файлом C. Вы можете открыть его в текстовом редакторе и прочитать.
В этом случае это звучит так, как будто в исходный код C встроен фрагмент Lua. Код C может связываться с библиотекой Lua и использовать ее для загрузки и выполнения фрагмента Lua.
Такой файл C может выглядеть примерно так:
// Disclaimer: tested with Lua 5.3 (64-bit)
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#define CODE "print(\"hello world\")\n";
// Or, if the chunk is compiled:
// #define CODE "\x1b\x4c\x75\x61\x53\x00\x19\x93\x0d\x0a\x1a\x0a\x04\x08\x04\x08\x08\x78\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x77\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x04\x00\x00\x00\x06\x00\x40\x00\x41\x40\x00\x00\x24\x40\x00\x01\x26\x00\x80\x00\x02\x00\x00\x00\x04\x06\x70\x72\x69\x6e\x74\x04\x0c\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
int main(int argc, char **argv) {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_loadbuffer(L, CODE, sizeof(CODE) - 1, NULL);
lua_call(L, 0, 0);
lua_close(L);
return 0;
}
Фрагмент Lua внутри исходного файла C может быть скомпилирован, а может и не скомпилирован. В любом случае не составит труда преобразовать его обратно в текстовый или двоичный файл Lua.
Например, в Lua (если двоичный файл закодирован, как в моем примере, со всеми байтами в виде двухзначного шестнадцатеричного перехода):
-- note: replaces file "out.lua" without asking
local binary = [[\x1b\x4c\x75\x61\x53\x00\x19\x93\x0d\x0a\x1a\x0a\x04\x08\x04\x08\x08\x78\x56\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x28\x77\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x04\x00\x00\x00\x06\x00\x40\x00\x41\x40\x00\x00\x24\x40\x00\x01\x26\x00\x80\x00\x02\x00\x00\x00\x04\x06\x70\x72\x69\x6e\x74\x04\x0c\x68\x65\x6c\x6c\x6f\x20\x77\x6f\x72\x6c\x64\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00]]
binary = binary:gsub("..(..)", function(n)
return string.char(tonumber(n, 16))
end)
local f = assert(io.open("out.lua", "wb"))
assert(f:write(binary))
assert(f:close())
Если фрагмент Lua не был скомпилирован с самого начала, нет необходимости его декомпилировать. Если он был скомпилирован, бинарный файл Lua можно дизассемблировать или декомпилировать или даже загрузить в совместимый интерпретатор Lua как обычно.
Существуют дополнительные сложности, которые могут возникнуть в файле C. Может быть несколько кусков Lua. В этом случае вам, возможно, придется иметь дело с каждым из них в отдельности. Также может быть некоторая дополнительная обфускация (например, сжатие). Тем не менее, программа C должна в конечном итоге преобразовать данные в настоящий фрагмент Lua, прежде чем передать их библиотеке Lua, поэтому должна быть возможность получить нужные данные в момент передачи. (Исходный код C или Lua может быть изменен для записи данных вместо или в дополнение к их загрузке, или данные могут быть выгружены непосредственно из памяти, возможно, в отладчике. В худшем случае данные передаются в lua_load
без весь фрагмент когда-либо загружается в память одновременно, но с этим все еще можно легко справиться.)
person
tehtmi
schedule
21.02.2018
>we can compile the LUA files like this
, Нет, таким образом вы компилируете родной хост, который может быть написан на C или нет. Этот хост будет запускать виртуальную машину Lua, которая, в свою очередь, будет запускать код Lua. Вы не компилируете файлы Lua таким образом. - person Vlad   schedule 20.02.2018test.c
. Аргумент командной строки-I/usr/include/lua5.1
указывает компилятору искать в каталоге /usr/include/lua5.1#include
заголовочных файлов (.h
файлов), а аргумент-llua5.1
указывает ему связать программу с собственной библиотекой с именемliblua5.1
. Это похоже на попытку встроить интерпретатор Lua в программуtest
. - person Solomon Slow   schedule 20.02.2018