как декомпилировать lua с форматом .c [скомпилировано как C]

Я пытался отредактировать программу, чтобы сделать ее гибкой, но возникла проблема. Он закодирован как язык LUA и скомпилирован как C.

Теперь я пытаюсь декомпилировать этот файл и развиваться на этом файле. Может кто-нибудь дать какое-нибудь решение? Как я обнаружил, мы можем скомпилировать файлы LUA следующим образом:

cc -o test test.c -Wall -I/usr/include/lua5.1 -llua5.1

Но теперь я пытаюсь его ДЕКОМПИЛИЗИРОВАТЬ. Пожалуйста помоги.

Скомпилированный lua как фотография файла .C


person mr.creed    schedule 20.02.2018    source источник
comment
>we can compile the LUA files like this , Нет, таким образом вы компилируете родной хост, который может быть написан на C или нет. Этот хост будет запускать виртуальную машину Lua, которая, в свою очередь, будет запускать код Lua. Вы не компилируете файлы Lua таким образом.   -  person Vlad    schedule 20.02.2018
comment
Командная строка, которую вы показываете, компилирует файл исходного кода C, test.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
comment
Что означает декомпилировать этот файл и разработать этот файл? О каком файле вы спрашиваете? Что в нем есть? Что оно делает? и что вы хотите, чтобы он делал по-другому?   -  person Solomon Slow    schedule 20.02.2018
comment
Я пытаюсь декомпилировать исходный код lua, чтобы использовать его в своей программе, и я не могу этого сделать. я просто хочу решение.   -  person mr.creed    schedule 21.02.2018


Ответы (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 без весь фрагмент когда-либо загружается в память одновременно, но с этим все еще можно легко справиться.)

person tehtmi    schedule 21.02.2018
comment
Пожалуйста, посмотрите последний пост, который я написал под вашим именем - person mr.creed; 21.02.2018

да, это так, но все коды скомпилированы, и когда я загружаю его, он выглядит так:

http://www.upsara.com/images/t0r4_2018-02-21_19-57-20.png

но я знаю, что это lua, и он содержит ваш код, который вы написали

person mr.creed    schedule 21.02.2018
comment
Да, это скомпилированный файл Lua (скорее, несколько файлов, скомпилированных в один, но это не имеет значения). Вы можете попробовать декомпилировать его напрямую с помощью декомпилятора. Похоже, что у него все еще есть отладочная информация, так что это может работать хорошо. Если это не работает, вы всегда можете дизассемблировать, чтобы получить листинг байт-кода. Не уверен, что понимаю, так как раньше этот вопрос касался C, которого здесь нет. Похоже, у вас есть обычный файл Lua. - person tehtmi; 21.02.2018
comment
Это не ответ, и вместо этого его нужно было отредактировать в вашем вопросе. - person Joseph Sible-Reinstate Monica; 30.05.2020