【问题标题】:how to decompile lua with .c format [ compiled as C ]如何用.c格式反编译lua [编译为C]
【发布时间】:2018-07-30 13:08:25
【问题描述】:

我试图编辑一个程序以使其灵活地适应我自己的程序,但出现了问题。它被编码为 LUA 语言,并被编译为 C

现在我正在尝试反编译这个文件并在这个文件上进行开发。 有人可以给出任何解决方案吗? 我发现我们可以像这样编译 LUA 文件:

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

但现在我正在尝试反编译它。 请帮忙。

Compiled lua as .C file's photo

【问题讨论】:

  • >we can compile the LUA files like this ,不,这样你编译本地主机,它可能是用 C 编写的,也可能不是。该主机将运行 Lua 虚拟机,而后者又将实际运行 Lua 代码。你不用这种方式编译 Lua 文件。
  • 您显示的命令行编译 C 源代码文件 test.c。命令行参数-I/usr/include/lua5.1 告诉编译器在目录/usr/include/lua5.1 中搜索#include 头文件(.h 文件),-llua5.1 参数告诉编译器将程序与一个名为 liblua5.1 的本机库。这看起来像是试图在test 程序中嵌入 Lua 解释器。
  • “反编译这个文件并在这个文件上开发”是什么意思?你问的是哪个文件?里边啥啊?它有什么作用?以及您希望它做什么不同的事情?
  • 我正在尝试反编译一个 lua 源代码以在我的程序中使用它,但我做不到。我只是想要一个解决方案。

标签: lua compilation luac


【解决方案1】:

一个名为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;
}

C 源文件中的 Lua 块可能会也可能不会被编译。无论哪种情况,将其转换回文本或二进制 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 源以将数据写出而不是加载它,或者数据可以直接从内存中转储,可能在调试器中。最坏的情况是数据流式传输到 @987654325 @ 不会同时将整个块加载到内存中,但这仍然可以轻松处理。)

【讨论】:

  • 请看我在你下面写的最后一篇文章
【解决方案2】:

是的,它是这样的,但是所有代码都已编译,当我加载它时,它看起来像这样:

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

但我知道它是 lua,它包含您编写的代码

【讨论】:

  • 是的,这是一个编译好的 Lua 文件(更可能是几个文件编译成一个文件,但这不重要)。您可以尝试使用反编译器直接对其进行反编译。看起来它仍然有调试信息,所以它可能工作得很好。如果它不起作用,您可以随时反汇编以获得字节码列表。不确定我是否理解,因为之前这个问题是关于 C 的,这里没有证据。你似乎有一个普通的 Lua 文件。
  • 这不是答案,应该改为编辑到您的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多