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(const Proto* f, const TString* p, DumpState* D)
{
DumpString((f->source==p || D->str

本文探讨了Lua作为嵌入式脚本语言在项目开发中的应用,以及随着使用者增加,代码保护的重要性。文章重点分析了lua字节码的序列化和反序列化过程,涉及luac.c、ldump.c和lundump.c文件。通过luaU_dump函数,展示了Proto类型的结构,它是lua中chunk的原型,包含字节码、常量表和debug信息等。为了增强字节码的安全性,提出了通过对DumpBlock和LoadBlock函数进行修改,对字节码进行简单加密的方法,甚至可以通过重写DumpFunction来混淆闭包成员的dump顺序,以提高静态分析的破解难度。
最低0.47元/天 解锁文章
2186

被折叠的 条评论
为什么被折叠?



