Как декомпилировать lua с форматом.c [скомпилировано как C ]
Я пытался отредактировать программу, чтобы сделать ее более гибкой, но есть проблема. Он закодирован как язык LUA и скомпилирован как C.
Сейчас я пытаюсь декомпилировать этот файл и разработать на этом файле. Может кто-нибудь дать какое-нибудь решение? Как я обнаружил, мы можем скомпилировать файлы LUA следующим образом:
cc -o test test.c -Wall -I/usr/include/lua5.1 -llua5.1
Но сейчас я пытаюсь разобрать его. Пожалуйста помоги.
2 ответа
Файл с именем 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
без целой части, загруженной в память одновременно, но это все еще может быть легко обработано.)
Да, это так, но все коды скомпилированы, и когда я загружаю его, это выглядит так:
http://www.upsara.com/images/t0r4_2018-02-21_19-57-20.png
но я знаю, что это Луа, и он содержит ваш код, который вы написали