unluac Lua字节码反编译器:从编译产物恢复可读源码 📅 发布时间:2026/8/21 21:28:58 👁 浏览次数: unluac Lua字节码反编译器从编译产物恢复可读源码【免费下载链接】unluacfork from http://hg.code.sf.net/p/unluac/hgcode项目地址: https://gitcode.com/gh_mirrors/un/unluacunluac是一款命令行 Lua 反编译器输入是 Lua 5.0 至 5.3 的字节码文件.luac输出是可打印的 Lua 源码。适用于第三方插件分析和无源码的遗留 chunk 维护。⚙️ 它是怎么工作的头部解析与版本识别。src/unluac/parse/ 先校验 4 字节签名\x1bLua再读版本字节选中对应版本的解析规则。5.0 到 5.3 的头部格式并不相同比如 5.3 把整数拆成独立字段只有先定位版本才能正确切分常量表、局部变量表和嵌套函数体。操作码映射表。不同版本的指令编码不同5.0 有 35 条指令5.1 为 38 条5.2/5.3 新增了位运算、IDIV 等。decompile 包里的 OpcodeMap 按版本各持一张映射表Decompiler 把指令字解码成 Op 枚举后再分发处理这是多版本兼容的关键。控制流重构。这是反编译器最容易出质量问题的环节。Decompiler 对指令流做两遍扫描第一遍识别 EQ、LT、TEST、JMP 等分支点生成 IfThenElseBlock、WhileBlock、ForBlock、RepeatBlock 等块结构第二遍按序回填表达式和语句用寄存器状态拼回多重赋值与函数调用。if-else、repeat-until、数值 for 和迭代器 for 的重构逻辑都集中在 src/unluac/decompile/block/。变量名直接取自字节码中的调试信息缺失时只能生成占位名。 从零跑通获取代码并构建git clone https://gitcode.com/gh_mirrors/un/unluac cd unluac/src mkdir build javac -d build unluac/*.java需要 JDK 8 及以上构建产物就是 build/ 目录。准备一个字节码输入unluac 的输入必须是标准 Lua 编译器产出的字节码明文 .lua 文件无法直接反编译luac -o demo.luac demo.lua系统里若叫 luac5.1 之类的版本化命令换成对应名称即可。第一次反编译与验证标准java -cp build unluac.Main demo.luac验证标准终端应直接打印还原出的源码语句比如local c a b。若报does not have the signature of a valid Lua file说明输入不是字节码若报can only handle Lua 5.0 - Lua 5.3说明版本不受支持。 两个真实用例用例 A反编译单个文件并比对用仓库自带的测试用例5 分钟内可复现luac -o closure.luac ../test/src/closure.lua java -cp build unluac.Main closure.luac预期输出与原文基本一致f function(a, b) local c a b return c ^ 2 end print(f(3, 4))如果输出里变量名变成_ARG_0_这类占位符说明编译时调试信息被剥离换回默认参数重新编译即可。用例 B分析一个版本未知的第三方插件第一步确认版本字节。od -A n -t x1 -N 5 plugin.luac前 4 字节应为 1b 4c 75 61即\x1bLua签名第 5 字节 0x53 代表 Lua 5.3。为什么需要这一步5.2/5.3 改变了 upvalue 声明编码并引入_ENV表提前确认版本能让你预判输出形态。第二步反编译落盘。java -cp build unluac.Main plugin.luac plugin_out.lua第三步检查全局引用。5.2/5.3 中全局变量经由_ENVupvalue 实现输出里会出现大量_ENV.xxx可按需替换成裸名以提升可读性。第四步核对控制流。若输出是平铺 if 而不是循环对照 test/src 目录里 control 和 report 系列测试用例的形态判断是插件本身写法问题还是重构边界情况。⚠️ 容易踩的坑现象原因处理方式报does not have the signature of a valid Lua file输入是明文 .lua不是字节码先用 luac 编译再反编译报can only handle Lua 5.0 - Lua 5.3头部版本字节超出 5.0-5.3换受支持版本编译或另选工具变量名显示为_ARG_0_占位符编译时剥离了调试信息用标准 luac 重新编译默认保留调试信息循环或分支结构与原文不符跳转目标复杂时分支重构的已知局限对照 test/src 测试用例定位边界情况大文件出现 OutOfMemoryErrorJVM 堆空间不足加java -Xmx512m提高堆上限如果以上都没命中先看 README.md 的说明能稳定复现的问题附带最小字节码和编译命令再去反馈。 深入阅读路线想改源码从 src/unluac/decompile/Decompiler.java 的 processLine 与 handleBranches 两阶段流程读起配合同目录 Function.java想扩展功能关注 src/unluac/Version.java 中的版本抽象新增一个子类再补 OpcodeMap.java 的指令表即可接入新版本想理解边界 case跑 test/src 下的 control01 至 control07、booleanexpression01 至 06覆盖循环嵌套与布尔短路想理解字节码格式读 src/unluac/parse/ 包的 BHeader.java 与 LHeaderType.javaunluac 1.2.2 已长期覆盖 Lua 5.0 至 5.3功能稳定但更新节奏慢。建议先拿一份有源码的 chunk 比对反编译结果校准判断后再分析真实目标。【免费下载链接】unluacfork from http://hg.code.sf.net/p/unluac/hgcode项目地址: https://gitcode.com/gh_mirrors/un/unluac创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考