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

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

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

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

Но сейчас я пытаюсь разобрать его. Пожалуйста помоги.

Скомпилированный Луа как фото файла.C

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

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

Другие вопросы по тегам