lua作为嵌入式脚本语言,在项目开发中的积极作用毋庸置疑。虽然便捷,但随lua使用者的数量增多,lua暴露出来的项目核心代码的问题的越来越明显。随着官方提供的luac的解释器,能够给lua明文代码做简单的加密。文章主要正对字节码的序列化和反序列化进行分析。
luac.c文件就是luac.exe的实现部分。
ldump.c和lundump.c 分别是lua的保存和读取字节码的实现部分。
luaU_dump作为dump的函数入口,声明如下:
int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip)
Proto类型是lua中一段chunk的原型,在lobject.h中声明,是不对外公开的内部类型,lua把任何一段可执行的脚本都看成一个Proto,Proto包含了函数原型的字节码,函数引用的常量表,debug信息(包括行号),本地变量,upvalue。由于Proto保存了相当完整的debug信息,所以如果在compile的时候把这些debug信息输出,是非常有利于反编译的。
实际上Proto就是一个闭包实现,而在lua中你可以把一个lua文件看成一个闭包。所以就很容易理解,lua语言结构其实就是递归包含闭包的关系。
从DumpFunction函数的实现可以就能看出这层关系,子闭包作为一个常量在DumpConstants函数中dump了。
static void DumpFunction(