如何使用 .c 格式反编译 lua 文件 [编译为 C 语言]
2018-2-20 10:7:57
收藏:0
阅读:107
评论:2
我正在尝试编辑一个用于适应自己需要的程序,但遇到了问题,它使用 LUA 语言编写并且编译成了 C.
现在我正在尝试对这个文件进行反编译并在其上开发。 有人能提供任何解决方案吗? 据我所知,我们可以像这样编译 LUA 文件:
cc -o test test.c -Wall -I/usr/include/lua5.1 -llua5.1
但现在我正在尝试反编译它。 请帮帮我。
点赞
用户8213021
是的,就像这样,但所有代码都已编译,当我加载它时,它看起来像这样:

但我知道这是 Lua,并且它包含了你编写的代码。
2018-02-21 16:34:48
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

一个名为
test.c的文件可以用作cc的输入,该文件是一个 C 代码文件。你可以在文本编辑器中打开它并阅读它。在这种情况下,C 代码中似乎嵌入了一个 Lua 块。C 代码可以链接 Lua 库并使用它来加载和执行 Lua 块。
这样的 C 文件可能看起来像这样:
// 免责声明:已在 Lua 5.3 (64 位) 上测试 #include "lua.h" #include "lualib.h" #include "lauxlib.h" #define CODE "print(\"hello world\")\n"; // 或者,如果块已编译: // #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 中(如果二进制文件以所有字节都转换为两位十六进制转义的形式编码):
-- 注意:不经过询问替换文件 "out.lua" 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\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”流式传输,而整个块从未同时加载到内存中,但这仍然可以轻松处理。)