cocos2d-x 3.6 lua 文件加密
这里没有采用通用的加密方法,使用了类似于图片加密的方法,对文件中的每个字符进行加密,读取的时候,根据加密的key值进行解密。
@H_404_14@if (chunk != NULL&&chunkSize > 0)
{
@H_404_14@for (@H_404_14@int i = 0; i < chunkSize; i++)
{
chunk[i] = chunk[i] - 99;//99是用来加密的key值
}
}
更改后的源码
#include "Cocos2dxLuaLoader.h"
#include <string>
#include <algorithm>
#include "CCLuaStack.h"
#include "CCLuaEngine.h"
@H_404_14@using @H_404_14@namespace cocos2d;
@H_404_14@extern "C"
{
@H_404_14@int cocos2dx_lua_loader(lua_State *L)
{
@H_404_14@static @H_404_14@const std::string BYTECODE_FILE_EXT = ".luac";
@H_404_14@static @H_404_14@const std::string NOT_BYTECODE_FILE_EXT = ".lua";
std::string filename(luaL_checkstring(L,1));
size_t pos = filename.rfind(BYTECODE_FILE_EXT);
@H_404_14@if (pos != std::string::npos)
{
filename = filename.substr(0,pos);
}
@H_404_14@else
{
pos = filename.rfind(NOT_BYTECODE_FILE_EXT);
@H_404_14@if (pos == filename.length() - NOT_BYTECODE_FILE_EXT.length())
{
filename = filename.substr(0,pos);
}
}
pos = filename.find_first_of(".");
@H_404_14@while (pos != std::string::npos)
{
filename.replace(pos,1,"/");
pos = filename.find_first_of(".");
}
// search file in package.path
@H_404_14@unsigned @H_404_14@char* chunk = @H_404_14@nullptr;
ssize_t chunkSize = 0;
std::string chunkName;
FileUtils* utils = FileUtils::getInstance();
lua_getglobal(L,"package");
lua_getfield(L,-1,"path");
std::string searchpath(lua_tostring(L,-1));
lua_pop(L,1);
size_t begin = 0;
size_t next = searchpath.find_first_of(";",0);
@H_404_14@do
{
@H_404_14@if (next == std::string::npos)
next = searchpath.length();
std::string prefix = searchpath.substr(begin,next);
@H_404_14@if (prefix[0] == '.' && prefix[1] == '/')
{
prefix = prefix.substr(2);
}
pos = prefix.find("?.lua");
chunkName = prefix.substr(0,pos) + filename + BYTECODE_FILE_EXT;
@H_404_14@if (utils->isFileExist(chunkName))
{
chunk = utils->getFileData(chunkName.c_str(),"rb",&chunkSize);
@H_404_14@if (chunk != NULL&&chunkSize > 0)
{
@H_404_14@for (@H_404_14@int i = 0; i < chunkSize; i++)
{
chunk[i] = chunk[i] - 99;//99是用来加密的key值
}
}
@H_404_14@break;
}
@H_404_14@else
{
chunkName = prefix.substr(0,pos) + filename + NOT_BYTECODE_FILE_EXT;
@H_404_14@if (utils->isFileExist(chunkName))
{
chunk = utils->getFileData(chunkName.c_str(),&chunkSize);
@H_404_14@if (chunk != NULL&&chunkSize > 0)
{
@H_404_14@for (@H_404_14@int i = 0; i < chunkSize; i++)
{
chunk[i] = chunk[i] - 99;//99是用来加密的key值
}
}
@H_404_14@break;
}
}
begin = next + 1;
next = searchpath.find_first_of(";",begin);
} @H_404_14@while (begin < (@H_404_14@int)searchpath.length());
@H_404_14@if (chunk)
{
LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
stack->luaLoadBuffer(L,(@H_404_14@char*)chunk,(@H_404_14@int)chunkSize,chunkName.c_str());
free(chunk);
}
@H_404_14@else
{
CCLOG("can not get file data of %s",chunkName.c_str());
@H_404_14@return 0;
}
@H_404_14@return 1;
}
}
注:测试ios,android,win32能正常使用。但是,不要对main.lua进行加密哦,他的载入,不是通过这里的代码的,在AppDelegate.cpp中能找到。
总结:
这里只是实现了简单的加密,真正的使用,不应该只是用一个Key,应该有多个key(我用的有将近20个),这样的话被破解的可能性应该会低一些。