我一直在尝试反编译Lua字节码,发现了有用的工具,例如unluac和LuaAssemblyTools。 Unluac似乎可以用luac编译的lua脚本解决问题,它几乎提供了确切的源代码,但是当我使用以下代码将lua脚本转换为字节码时:得到的输出与luac的输出不同,但是它们非常相似,只是在(很多)不同的地方多了一个字节。现在,这个新文件将为我提供来自unluac的IllegalState exception,当我尝试使用-l选项在luac中运行字节码文件(由上述代码行创建)时,我得到: >
因此string.dump和luac之间显然存在区别,即使在此处建议这样做:http://lua-users.org/wiki/LuaCompilerInLua可以将string.dump用作luac的仿真器。

谁能向我解释差异,并建议我如何解决string.dump“已编译”脚本的问题?

#1 楼

loadfileluac发出的字节码之间几乎没有区别。
出现错误的唯一可能原因是您以文本模式打开文件stringdumped.txt。尝试以下代码,看看是否存在任何错误

f = io.open("stringdumped.txt", "wb") --Note that file is opened in binary mode
f:write(string.dump(loadfile("sample.lua")))
f:close()


由于没有区别,输出文件stringdumped.txt都可以由lua解释器运行由于不安而反编译。反转步骤也与您使用任何其他已编译的lua脚本完全相似。

评论


啊哈,但是如何反汇编string.dump的输出呢?包装loadstring或loadfile只会给出加载文件名或字节字符串的指令。

– Dennefyren
2014年7月12日11:12

@Dennefyren忘记上一个答案,请参阅更新的答案。

– 0xec
2014年7月12日在18:22

哦,我真是个白痴!没意识到我需要二进制模式。谢谢!

– Dennefyren
14年7月13日在23:56