Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密

项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行。
下面是使用原生的lua解释器编译字节码:
1、新建一个名为1.lua的文件,里面只有一句话print(“Hello Lua”),新建一个空的out.lua脚本文件
2、开始–运行–cmd
3、luac -o out.lua 1.lua
注: luac -o 编译后脚本名] 脚本名],必要时带上脚本路径,如:

回车之后,再打开out.lua就可以看到编译好的字节码了

然后实验一下,执行这个字节码脚本,可以看到lua原生的解释器可以直接解析luac编译出来的bytecode脚本,很方便!

重点:
做完了以上的一系列之后,我照着这个方法编译项目中的脚本,然后在cocos2dx环境下使用,发现不行!于是又查了一下资料,发现2dx使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以照着上面方法编译出来的bytecode脚本无法在2dx中使用。
解决这个问题其实很简单,就是用2dx自带的luajit编译lua脚本,下面附上luajit编译bytecode的方法:
1、在cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src目录下有个msvcbuild.bat批处理文件,需要先把luajit.exe这个东西给编译出来。
2、打开visual studio的命令行工具,这个只要装了vs都会有,在安装目录里面可以找到。
3、用vs的命令行工具cd到luajit的src目录
4、执行msvcbuild.bat批处理文件,编译出luajit.exe

编译完成之后,会在src目录下生成一系列文件,其中有一个luajit.exe

接下来就可以使用luajit.exe编译lua脚本的bytecode了:luajit -b 脚本名] 编译后的脚本名],执行完后会在src目录下生成一个已经编译成bytecode的jit.lua文件


下面把编译之后的jit.lua放在2dx中试一下,以HelloLua工程为基础,把jit.lua放到\samples\Lua\HelloLua\Resources下,修改AppDelegate.cpp中的lua调用为std::string path = CCFileUtils::sharedFileUtils()->fullPathForFilename(“jit.lua”);
运行结果为:

至此,luajit编译bytecode加密已完成!

严重注意:例子中,我把编译前后的脚本名字取的不一样,是为了让大家看出差异化来,实际在项目中使用的时候,脚本的名字编译前后最好都一致,不然在脚本中相互require的时候可能会出现问题!

一个一个转换脚太麻烦了,分享一个bat批处理,可以批量转换一个文件夹中的所有lua文件(此文件夹中只能包含lua文件)

@echo off
if exist out rd /s /q out
mkdir out
:input
cls
set input=:
set /p input= 拖入要编译的lua文件夹:
set “input=input:"=
if “input”==":" goto input
if not exist “input” goto input
for %%i in ("input") do if /i “%%~di”==%%i goto input
pushd cd
cd /d “input”>nul 2>nul || exit
set cur_dir=cd
popd
set /a num = 0
for /f “delims=” %%i in (‘dir /b /a-d /s “input”’) do (set /a num += 1 & luajit -b %%~fsi out/%%~nxi & echo %%~nxi)
echo 编译脚本数量:%num%
ATTRIB out/. +R
pause

—将以上代码copy到文本中,后缀改为bat,放到cocos2d-x-2.2.3\scripting\lua\luajit\LuaJIT-2.0.1\src下

编译后,文件夹内所有的lua脚本将被批量编译为字节码,并保存在LuaJIT-2.0.1\src\out目录下!

谢谢楼主分享 楼主这样的好人不多了呀

虽然现在没用上,但,,,,必须顶起啊!

终于找到一编能用的好文章了

好帖,以后会用上的, 果断收了~

楼主知道mac上有相似的方法吗?

呵呵,换用 quick-cocos2d-x 吧,提供现成的工具做这些事情。

论坛板块: http://www.cocoachina.com/bbs/thread.php?fid=56

quick-cocos2d-x

一年前已经实现楼主的需求了 ,而且 实现的更多…

项目用c++版本引擎,已经进入尾声,咋换?:6:

没用过quick,还是c++版本用的顺手。

mac上类似,就是编译luajit.exe的那步有些不一样

酷的,收藏下!

补充下,按照楼主的方法在cocos2d-x3.0中同样适用 :7:

这个必须顶 楼主把批处理都贡献了

好东西,没接触到quick话很好用

THKS FOR ALL !

:2: :2: :2:

mark,备用,谢谢分享了

可以批量转换一个文件夹中的所有lua文件(此文件夹中只能包含lua文件)

请问我的文件夹下有子文件夹,子文件夹下有lua文件,这样的话,这个批处理应该怎样修改呢?

如 文件夹a中有文件 a.lua 和 b文件夹,b文件夹下有b.lua

谢谢分享!