如何使用.c格式反编译lua [编译为C]

时间:2018-02-20 08:27:23

标签: lua compilation luac

我正在尝试编辑程序,使其具有我自己的灵活性,但存在问题。它被编码为LUA语言,编译为 C

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

Faulting application name: w3wp.exe, version: 8.5.9600.16384, time stamp: 0x52157ba0 Faulting module name: clr.dll, version: 4.7.2117.0, time stamp: 0x59cf5105 Exception code: 0xc00000fd Fault offset: 0x00451a8d Faulting process id: 0xe10 Faulting application start time: 0x01d3a9f540d7b456 Faulting application path: C:\Windows\SysWOW64\inetsrv\w3wp.exe Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Report Id: 83502af2-15e8-11e8-80ee-005056b72cd8 Faulting package full name: Faulting package-relative application ID:

但现在我正在尝试解决它。 请帮忙。

Compiled lua as .C file's photo

2 个答案:

答案 0 :(得分:0)

您可以将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源来代替加载或者加载数据,或者可以直接从内存中转储数据,可能是在调试器中。最坏的情况是数据是否流式传输到{{ 1}}没有将整个块同时加载到内存中,但仍然可以轻松处理。)

答案 1 :(得分:0)

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

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

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