如何反编译LuaJIT二进制字节码并还原为可编辑Lua脚本?
LuaJIT 字节码读取与反编译方案
核心原因说明
普通Lua反编译器仅支持标准Lua(5.1/5.2/5.4等版本)的字节码解析,LuaJIT采用独立设计的字节码规范,和标准Lua字节码格式完全不兼容,因此会出现无法识别的提示。
操作步骤
1. 匹配对应LuaJIT版本
首先从你Android应用的lib目录导出对应架构的libluajit.so,确认其使用的LuaJIT版本(常见为2.0、2.1正式版或2.1滚动开发版),不同版本的LuaJIT字节码存在少量差异,版本不匹配会导致解析失败。
2. 读取字节码原始内容
你可以使用LuaJIT官方自带的字节码dump工具读取结构化的字节码信息:
- 编译和目标
libluajit.so版本一致的LuaJIT,编译时开启LUAJIT_ENABLE_BDUMP编译选项 - 执行命令
./luajit -b -l [你的字节码文件路径],即可输出可读的字节码指令列表、常量池、原型函数结构等信息,如果字节码携带调试信息还会输出行号、变量名映射。
3. 反编译为Lua源码
选用专门适配LuaJIT的反编译工具即可将字节码还原为Lua脚本:
- 未加密的普通LuaJIT字节码可直接使用
luajit-decompiler工具,适配2.0和2.1全版本,运行后直接输入字节码路径即可输出还原后的Lua源码,如果原始字节码被剥离了调试信息,还原后的代码会丢失变量、函数的自定义命名,需要结合业务逻辑手动补全 - 如果字节码经过简单混淆、或者修改了默认opcode映射,可使用
JitDec工具,对Android端常见的自定义LuaJIT字节码适配性更好
特殊场景处理
如果应用对LuaJIT字节码做了自定义加密,你可以hook
libluajit.so中的luaL_loadbuffer函数,在字节码加载到内存、完成解密后直接dump内存中的原始字节码,再用上述工具反编译即可。
内容的提问来源于stack exchange,提问作者Darko Milošević
相关产品推荐
相关产品推荐

