lua代码加密,以前服务器的加密方式是以下几种相结合:
1.修改文件头(luaU_header、LUA_SIGNATURE)
2.修改function结构顺序(lundump.c和ldump.c, LoadFunction和DumpFunction)
3.打乱opcode顺序(lopcodes.h和lopcodes.c)
4.字符转义(lundump.c和ldump.c, LoadString和DumpString)
更换luajit后,luajit编译的bytecode会比luac编译出来的更为紧凑,结构也改变了,opcode从原来的40个左右增加到97个,所以实现也要跟着调整:
1.修改文件头(lj_bcdump.h BCDUMP_HEAD1、BCDUMP_HEAD2、BCDUMP_HEAD3和BCDUMP_VERSION)
2.修改proto结构顺序(lj_bcwrite.c和lj_bcread.c bcwrite_proto和lj_bcread_proto)
3.打乱opcode (lj_bc.h 我尝试过打乱,但是遇到同样的问题 LuaJIT 攻防起步)
4.字符转义(lj_load.c和lib_string.c)
最后采用的方案:
原本打算同样使用以上四种方案组合来加密,但是因为方案3遇到问题受阻,所以暂时不对opcode调整,而是直接采用“编译bytecode后再整个文件加密”。
加密算法:
1.全部字节取反
2.再32个密码数组循环对文件前256个字节进行加密
3.文件结尾追加qgnb标识符(奇哥的庇佑)
这样的做法会把对luajit源码修改比较小,修改两处,分别在lj_load.c的reader_file和lib_string.c的string_dump。
而且因为字节取反和加解密并不需要重新申请内存,所以实现上性能比旧方案更优。
工程上使用宏XS_ENCRYPT进行开关。
后面可以根据需要把修改文件头和修改proto结构顺序加上。