cocos lua 加密方案
cocos2d使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以直接用luac法编译出来的bytecode脚本无法在cocos2d中使用。
目前所指的解决方案有2个:
A.luajit加密:
1、官网下载luajit(http://luajit.org/luajit.html),解压,目录如下

2、在命令行中使用cd 进入luajit下src的目录,然后执行输入msvcbuild.bat,执行此批处理文件,编译出luajit.exe
3、接下来就可以使用luajit.exe编译lua脚本的bytecode了:luajit -b [脚本名] [编译后的脚本名],执行完后会在src目录下生成一个已经编译成bytecode的lua文件
此时即使把此路径加入环境变量是没用的,进行luajit加密命令的时候必须使用cd进入此目录(C:\Users\hengjingjing\Desktop\LuaJIT-2.0.4\src),因为luajit加密,必须是luajit.exe和src下的jit文件夹配合使用才管用!
如果unity项目用的是基于ulua扩展的其他lua版本(cstolua、slua),或者本身用的就是ulua,那么要用luajit加密方式,因为ulua底层就是用的luajit.可以看出:Luajit跨平台,满足于32位和64位(64位并不是所有平台),并且加密后的bytecode比luac生成的bytecode至少小40%,速度也是它的10倍多,总之luajit就是比lua原生的好.
此处提供了一个批处理工具实现快速的编译,来源于https://blog.csdn.net/st_darkmoon/article/details/53168652 实现能够灵活指定输出目录,并且输出后按照源目录结构保存。这样除了拖动指定两次目录基本无需任何操作了。
@echo off
if exist out rd /s /q out
mkdir out setlocal enabledelayedexpansion cls
:input
set input=:
set /p input= 拖入要编译的lua文件夹:
if "%input%"==":" goto input
if not exist "%input%" goto input
set "input=%input:"=%" :output
set output=:
set /p output= 拖入要编译后输出的目标文件夹: if "%output%"==":" goto output
if not exist "%output%" goto output for %%i in ("%input%") do if /i "%%~di"==%%i goto input
pushd %cd%
cd /d "%input%">nul >nul || echo cmd was runing error
set cur_dir=%cd%
popd
set /a num =
echo 正在目标文件夹中创建对应目录结构:
for /r %input% %%a in (*) do xcopy %%a %output% /t /s
echo 创建完成,开始编译lua代码:
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do (set /a num +=
set pt=%%~fi & set "pt=!pt:%input%=%output%!"
luajit -b %%~fi !pt!
echo 编译后: !pt!)
echo 编译脚本数量:%num%
ATTRIB %output%/*.* +R
echo 编译完成,开始删除空白文件夹:
for /f "delims=" %%i in ('dir /b /ad /s "%output%"') do (echo 删除空白目录信息: %%i & rd %%i /q)
pause
B.XXTEA代码加密:
这种只是代码加密,由于luajit编译的字节码仅支持32位,所以此方案在IOS上是个不错的选择。cocos已经自带此加密功能了。
命令格式:
usage: cocos luacompile [-h] [-v] [-s SRC_DIR_ARR] [-d DST_DIR] [-e]
[-k ENCRYPTKEY] [-b ENCRYPTSIGN] [--disable-compile] 对 lua 文件进行加密和编译为字节码的处理。 optional arguments:
-h, --help show this help message and exit
-v, --verbose 更多输出信息。
-s SRC_DIR_ARR, --src SRC_DIR_ARR
指定需要编译的 lua
文件路径,支持指定多个路径。
-d DST_DIR, --dst DST_DIR
指定输出文件的路径。
-e, --encrypt 开启 XXTEA 加密功能。
-k ENCRYPTKEY, --encryptkey ENCRYPTKEY
指定 XXTEA 加密功能的 key 字段。
-b ENCRYPTSIGN, --encryptsign ENCRYPTSIGN
指定 XXTEA 加密功能的 sign 字段。
--disable-compile 关闭编译为字节码的功能。
我们主要用到-s,-d,-e,-k,-b以及--disable-compile这几个参数:
-s就是你需要加密的lua脚本所在的目录。
-d就是逆需要将加密后的lua脚本放置的目录。
-e是开启XXTEA加密功能,如果不用这个参数,后面的也就不用了,这样子做是编译为字节码。
-k是在-e开启的情况下使用,XXTEA加密算法的key字段,这个自己定,不要太长,但越复杂越好。
-b是在-e开启的情况下使用,XXTEA加密算法的sign字段,这个自己定,不要太长,但越复杂越好。
--disable-compile是关闭字节码编译。为什么要加这个?因为现有的cocos引擎使用的是luajit来编译字节码,它仅支持32位,不支持64位的机子(截止至2017.01数据),而苹果官方要求上传的app必须兼容arm64的机子,因此只能选择XXTEA加密,这种加密方式也是很不错的,算法小巧,在没有key和sign的情况下不易被破解,兼容32和64位,是目前用cocos开发唯一可取的加密方式。
这个命令举个例子:
cocos luacompile -s /Users/xxx/src -d /Users/xxx/src0 -e -k testkey -b testSignment --disable-compile
这条demo就是对src的所有lua脚本做key=testtt,sign=signnn的XXTEA加密,并关闭字节码编译。请注意,如果项目中除了lua脚本外,还有其他一些文件,比如plist,json,xml这些,是不会被编译的,实际跑的时候记得拷贝过去,保持源文件和目标文件具有一致性,否则会有问题的。

cocos lua 加密方案的更多相关文章
- cocos lua 加密与解密 混淆 (版本号cocos3.4)
cocos luacompile cocos luacompile Overview Usage Available Arguments Samples Overview Compile the .l ...
- lua 代码加密方案
require 实现 require函数在实现上是依次调用package.searchers(lua51中是package.loaders)中的载入函数,成功后返回.在loadlib.c文件里有四个载 ...
- Cocos2d-x--iOS平台lua加密成luac资源方法和Jsc文件<MAC平台开发试用--windows平台暂未研究>
首先要说.近期真的是太忙了.好久没写博客了,今天正好有空,就写一下近期在写游戏中的一些发现: 话说,基于Cocos2dx 引擎 + 脚本写游戏,至今的感触就是能够进行增量更新和即时编译 ...
- 一个异或加密方案--C语言实现
核心代码: char encrypt( char f , char c) { return f^c; } int OutEncrypt( char *FilePath, char *SecretWor ...
- (原创)cocos lua 热更新从零开始(一)最简单demo
开发环境:WIN7 + cocos2dx 3.10 lua版本 0.学习这篇内容的基础是你要会创建并运行一个cocos lua项目 1.热更新的思想所谓的热更新,就是在线更新代码和资源.热更新的过程首 ...
- C# .net 语言加密方案
C# .net 语言加密方案 方案背景 当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码.桌面应用程序的 winform .Unity3d 的逻辑脚本都在使用.C# .net ...
- 【转】UNITY之LUA加密
来自:Lua加密 两种方式:一种用luac,一种用luajit luac加密: 1.lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,去官网下载Lua源代码包(http:/ ...
- 基于HTTP在互联网传输敏感数据的消息摘要、签名与加密方案
基于HTTP在互联网传输敏感数据的消息摘要.签名与加密方案 博客分类: 信息安全 Java 签名加密AESMD5HTTPS 一.关键词 HTTP,HTTPS,AES,SHA-1,MD5,消息摘要,数 ...
- [原创]aaencode等类似js加密方案破解方法
受http://tieba.baidu.com/p/4104806767 2L启发,不过他说的方法,我没有尝试成功,自己摸索出了一个新方法,在这里分享下. 首先拿aaencode官网的加密字符串作为例 ...
随机推荐
- 【翻译】Android多线程下安全访问数据库
为了记录如何线程安全地访问你的Android数据库实例,我写下了这篇小小札记.文章中引用的项目代码请点击这里 假设你已编写了自己的 SQLiteOpenHelper. publicclas ...
- Python 列表 max() 方法
描述 Python 列表 max() 方法返回列表元素中的最大值. 语法 max() 方法语法: max(L) 参数 L -- 要返回最大值的列表. 返回值 返回列表元素中的最大值. 实例 以下实例展 ...
- ItelliJ项目打jar包
不是Eclipse里方便的export...了. 一.配置 . 点击View->Open Module Settings(快捷键是F4) . 在弹出的对话框中,点击最左侧树的Artifacts ...
- css语法和JS语法的对比
CSS语法(不区分大小写) JavaScript语法(区分大小写) border border border-bottom borderBottom border-bottom-color bor ...
- Proguard语法及常用proguard.cfg代码段
本文主要ProGuard常用语法.标准proguard.cfg文件内容.常用proguard.cfg代码段及proguard与log level结合解决debug模式日志问题. 1.ProGuard的 ...
- 关于64位 windows&linux双系统引导问题
换了台本子win7 64位,抽空做个双系统,装了下linux. 遇到开机问题:进linux可以正常使用,进win7花屏死机,初步估计是grub(此时的boot sector位grub)的问题,启动器被 ...
- maven 中使用jstl 错误解决
maven 中使用jstl表达式中出现如上错误.原因: 导入jstl 的jar包,却没有在pom文件中添加jstl相关的jar依赖项. <!--jstl表达式--> <depende ...
- malloc,我误解你了
malloc用于动态申请内存,这个学过C语言的都知道.忘记了在哪本书上看到,malloc申请的内存不一定是连续,于是一直记住了.这句话有错吗?没有!但是当时只是记住了这个知识点,而没有深入的思考.直到 ...
- cocos2dx3.2升级Android5的坑
虽然已经转到服务端,但是对客户端的事情,偶尔还看看.公司的游戏用的是cocos2dx 3.2的版本, 然而在Android 5 上却无法运行. 先是没有触摸事件. 在stackoverflow上看到, ...
- alsamixer 在音频子系统的使用
alsamixer是Linux 音频架构ALSA工具的其中一个,用于配置音频的各个参数. alsamixer是基于文本下的图形界面的,可以通过键盘的上下键,左右键等,很方便地设置需要的音量,开关某个s ...