Cocos2d-x Lua/Javascript脚本代码加密实现例子【转】

前端之家收集整理的这篇文章主要介绍了Cocos2d-x Lua/Javascript脚本代码加密实现例子【转】前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_0@

@H_301_0@http://www.111cn.net/sj/iOS/75513.htm

@H_301_0@

@H_301_0@下文为各位介绍一个Cocos2d-x Lua/Javascript脚本代码加密实现例子,有需要的朋友可进入参考。

在游戏开发中,脚本作为一种资源文件,就像图片视频一样,被引擎所引用,使用脚本做游戏的好处就在于可以在线patch更新,特别对于苹果App Store审核期很长的情况。

如果不对脚本进行加密,不怀好意的人松松解压出脚本文件,给你瞬间复制一个游戏出来。

1.异或加密解密

最简单的一种加密方式,虽然简单,但是也比较实用。但是防破解方面确实一般,如果你有其他严格的仿破解需求,可以将这部分加密算法换成你自己的复杂算法,不过保证解密效率。下面是采用C++简单实现的对文件进行加密之后保存到原文件中(注意对原始未加密文件进行备份)

@H_301_0@代码如下

@H_301_0@复制代码

@H_301_0@#include"stdafx.h"

@H_301_0@#include<iostream>

@H_301_0@#include<ctime>

@H_301_0@#include<fstream>

@H_301_0@using namespace std;

@H_301_0@void Makecode(char *pstr,int *pkey);

@H_301_0@void Cutecode(char *pstr,int *pkey);

@H_301_0@void encode_file(char *f);

@H_301_0@int _tmain(int argc,_TCHAR* argv[])

@H_301_0@{

@H_301_0@encode_file("e:/src/ResultScene.lua");

@H_301_0@/*

@H_301_0@encode_file("e:/src/ReadyScene.lua");

@H_301_0@encode_file("e:/src/GameScene.lua");

@H_301_0@encode_file("e:/src/PutHeadScene.lua");

@H_301_0@encode_file("e:/src/TutorialsScene.lua");

@H_301_0@encode_file("e:/src/WordsCategoryScene.lua");

@H_301_0@encode_file("e:/src/common/DictHelper.lua");

@H_301_0@encode_file("e:/src/common/LJ.lua");

@H_301_0@encode_file("e:/src/common/DQueue.lua");

@H_301_0@encode_file("e:/src/common/UIHelper.lua");

@H_301_0@*/

@H_301_0@ int c;

@H_301_0@ cin>>c;

@H_301_0@ return 0;

@H_301_0@}

@H_301_0@void encode_file(char *f)

@H_301_0@{

@H_301_0@FILE *fp = NULL;

@H_301_0@fopen_s(&fp,f,"rb");

@H_301_0@fseek(fp,SEEK_END); //定位到文件

@H_301_0@int nFileLen = ftell(fp); //文件长度

@H_301_0@cout << "file len = " << nFileLen << endl;

@H_301_0@fseek(fp,SEEK_SET);

@H_301_0@char *fileContent = NULL;

@H_301_0@fileContent = (char *) malloc ((nFileLen + 1) * sizeof(char));//增加一位

@H_301_0@memset(fileContent,nFileLen + 1);

@H_301_0@fileContent[nFileLen] = '';//最后一位置为结束位

@H_301_0@fread_s(fileContent,nFileLen,1,fp);

@H_301_0@//fread(buf,fp);

@H_301_0@//cout<<"解密前:"<<fileContent<<endl;

@H_301_0@fclose(fp);

@H_301_0@cout<<"文件:"<<f<<endl;

@H_301_0@cout<<"解密前文件大小:"<<strlen(fileContent)<<endl;

@H_301_0@ int key[]={1,2,6,6};//加密字符

@H_301_0@ char *p=fileContent;

@H_301_0@cout<<"====="<<endl;

@H_301_0@ Makecode(fileContent,key);//加密

@H_301_0@ //cout<<"加密后:"<<p<<endl;

@H_301_0@cout<<"加密后文件大小:"<<strlen(fileContent)<<endl;

@H_301_0@FILE *stream = NULL;

@H_301_0@fopen_s(&stream,"wb");

@H_301_0@if (stream == NULL) /* open file TEST.$$$ */

@H_301_0@ {

@H_301_0@ fprintf(stderr,"Cannot open output file.

@H_301_0@");

@H_301_0@ }

@H_301_0@else {

@H_301_0@fwrite(p,stream); /* 写的struct文件*/

@H_301_0@fclose(stream); /*关闭文件*/

@H_301_0@}

@H_301_0@cout<<"====="<<endl;

@H_301_0@ Cutecode(fileContent,key);//解密

@H_301_0@ //cout<<"解密后:"<<fileContent<<endl;

@H_301_0@}

@H_301_0@//单个字符异或运算

@H_301_0@char MakecodeChar(char c,int key){

@H_301_0@ return c=c^key;

@H_301_0@}

@H_301_0@//单个字符解密

@H_301_0@char CutcodeChar(char c,int key){

@H_301_0@ return c^key;

@H_301_0@}

@H_301_0@//加密

@H_301_0@void Makecode(char *pstr,int *pkey){

@H_301_0@ int len=strlen(pstr);//获取长度

@H_301_0@ for(int i=0;i<len;i++)

@H_301_0@ *(pstr+i)=MakecodeChar(*(pstr+i),pkey[i%5]);

@H_301_0@}

@H_301_0@//解密

@H_301_0@void Cutecode(char *pstr,int *pkey){

@H_301_0@ int len=strlen(pstr);

@H_301_0@ for(int i=0;i<len;i++)

@H_301_0@ *(pstr+i)=CutcodeChar(*(pstr+i),pkey[i%5]);

@H_301_0@}

2.修改Cocos2d-x引擎中加载lua脚本文件(或者js文件)的入口,在加载的时候对其进行解密。可能不同版本引擎有不同的入口文件,在Cocos2d-x3.0中,对应的是文件Cocos2dxLuaLoader.cpp文件中的int cocos2dx_lua_loader(lua_State *L)方法,对其进行修改成如下:

@H_301_0@代码如下

@H_301_0@复制代码

@H_301_0@#include "Cocos2dxLuaLoader.h"

@H_301_0@#include <string>

@H_301_0@#include <algorithm>

@H_301_0@#include<iostream>

@H_301_0@using namespace cocos2d;

@H_301_0@extern "C"

@H_301_0@{

@H_301_0@ //单个字符异或运算

@H_301_0@ char MakecodeChar(char c,int key){

@H_301_0@ return c=c^key;

@H_301_0@ }

@H_301_0@ //单个字符解密

@H_301_0@ char CutcodeChar(char c,int key){

@H_301_0@ return c^key;

@H_301_0@ }

@H_301_0@ //加密

@H_301_0@ void Makecode(char *pstr,pkey[i%5]);

@H_301_0@ }

@H_301_0@ //解密

@H_301_0@ void Cutecode(char *pstr,pkey[i%5]);

@H_301_0@ }

@H_301_0@ int cocos2dx_lua_loader(lua_State *L)

@H_301_0@ {

@H_301_0@ std::string filename(luaL_checkstring(L,1));

@H_301_0@ size_t pos = filename.rfind(".lua");

@H_301_0@ if (pos != std::string::npos)

@H_301_0@ {

@H_301_0@ filename = filename.substr(0,pos);

@H_301_0@ }

@H_301_0@

@H_301_0@ pos = filename.find_first_of(".");

@H_301_0@ while (pos != std::string::npos)

@H_301_0@ {

@H_301_0@ filename.replace(pos,"/");

@H_301_0@ pos = filename.find_first_of(".");

@H_301_0@ }

@H_301_0@ filename.append(".lua");

@H_301_0@

@H_301_0@ Data data = FileUtils::getInstance()->getDataFromFile(filename);

@H_301_0@

@H_301_0@ if (!data.isNull())

@H_301_0@ {

@H_301_0@

@H_301_0@ //====code decode start==================================

@H_301_0@ log("===encode filename:%s===",filename.c_str());

@H_301_0@ //如果filename == 'main.lua',则解密

@H_301_0@ char *fileContent = (char*)data.getBytes();

@H_301_0@ int key[]={1,6};//加密字符

@H_301_0@ char *fileContentDecoded = NULL;

@H_301_0@ if (strcmp(filename.c_str(),"ReadyScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"GameScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"PutHeadScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"TutorialsScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"WordsCategoryScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"DictHelper.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"LJ.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"ResultScene.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"DQueue.lua")==0 ||

@H_301_0@ strcmp(filename.c_str(),"UIHelper.lua")==0 ) {

@H_301_0@ if (data.getSize() < strlen(fileContent)) {

@H_301_0@ fileContentDecoded = (char *) malloc ((data.getSize() + 1) * sizeof(char));//增加一位

@H_301_0@ memset(fileContentDecoded,data.getSize() + 1);

@H_301_0@ fileContentDecoded[data.getSize()] = '';//最后一位置为结束位

@H_301_0@ strncpy(fileContentDecoded,fileContent,data.getSize());

@H_301_0@ fileContent = NULL;

@H_301_0@ }

@H_301_0@ else {

@H_301_0@ fileContentDecoded = fileContent;

@H_301_0@ }

@H_301_0@ Cutecode(fileContentDecoded,key);//解密

@H_301_0@ }

@H_301_0@ else {

@H_301_0@ fileContentDecoded = fileContent;

@H_301_0@ }

@H_301_0@ //====code decode end==================================

@H_301_0@

@H_301_0@ if (luaL_loadbuffer(L,fileContentDecoded,data.getSize(),filename.c_str()) != 0)

@H_301_0@ {

@H_301_0@ luaL_error(L,"error loading module %s from file %s :

@H_301_0@ %s",

@H_301_0@ lua_tostring(L,1),filename.c_str(),lua_tostring(L,-1));

@H_301_0@ }

@H_301_0@ }

@H_301_0@ else

@H_301_0@ {

@H_301_0@ log("can not get file data of %s",filename.c_str());

@H_301_0@ }

@H_301_0@ return 1;

@H_301_0@ }

@H_301_0@}


注意加密解密的key保证一致。

代码注释应该挺完善的,不进行解释了,Enjoy~

原文链接:https://www.f2er.com/cocos2dx/344128.html

猜你在找的Cocos2d-x相关文章