当前位置: 首页 > news >正文

33、Lua Cocos2d-x使用Luajit实现加密

项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行。下面是使用原生的lua解释器编译字节码:

  1. 新建一个名为1.lua的文件,里面只有一句话print(“HelloLua”),新建一个空的out.lua脚本文件;

  2. 开始–运行–cmd3、luac-oout.lua1.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. 打开visualstudio的命令行工具,这个只要装了vs都会有,在安装目录里面可以找到;

  3. 用vs的命令行工具cd到luajit的src目录;

  4. 执行msvcbuild.bat批处理文件,编译出luajit.exe;

  5. 将生成的luajit.exe、lua51.dll、jit复制到打包工具的相对目录下,这样在工具中就可以直接调用luajit–bsource_fileout_file(一般都是lua后缀,代码不用改动);

在这里插入图片描述
至此,luajit编译bytecode加密已完成!

严重注意: 例子中,我把编译前后的脚本名字取的不一样,是为了让大家看出差异化来,实际在项目中使用的时候,脚本的名字编译前后最好都一致,不然在脚本中相互require的时候可能会出现问题!一个一个转换脚太麻烦了,分享一个bat批处理,可以批量转换一个文件夹中的所有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

编译后,文件夹内所有的lua脚本将被批量编译为字节码,并保存在xxx\out目录下,如:

在这里插入图片描述
注:XXX为打包加密文件路径
还有小提示:ios64目前只支持lua,不支持用luajit生成二进制*.lua

http://www.lryc.cn/news/341100.html

相关文章:

  • spring 集成 mybatis
  • rtpengine 的端点学习模式
  • Windows 安装 A UDP/TCP Assistant 网络调试助手
  • web自动化系列-selenium的3种等待方式(十一)
  • 每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)
  • web项目中jsp页面不识别el表达式
  • 【Python基础】字典
  • 2024HW --> 安全产品 Powershell无文件落地攻击
  • 力扣哈哈哈哈
  • RUM 最佳实践-视觉稳定性的探索与实践
  • PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑
  • 爬虫开发教程
  • 【Python】高级进阶(专版提升3)
  • LeetCode 1378、1277、2944
  • 【缓存常见问题】
  • Python爬取猫眼电影票房 + 数据可视化
  • Spring Boot深度解析:是什么、为何使用及其优势所在
  • 面向对象——类与对象
  • Golang的[]interface{}为什么不能接收[]int?
  • 重启服务器或重启docker,导致emqx的Dashboard的密码重置为public
  • 就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色
  • 常用的过滤网站扫描网站攻击的路径是那些,比如:/etc/passwd等
  • 考研数学|《1800》《660》《880》如何选择和搭配?(附资料分享)
  • 论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?
  • C语言 | Leetcode C语言题解之第28题找出字符串中第一个匹配项的下标
  • 「Python大数据」数据采集-某东产品数据评论获取
  • ORACLE错误提示概述
  • 2024年4月13日美团春招实习试题【第一题:好子矩阵】-题目+题解+在线评测【模拟】
  • ssm057学生公寓管理中心系统的设计与实现+jsp
  • 循环神经网络(RNN):概念、挑战与应用