cocos2d-x 对引擎修改,以实现加密资源
2015-08-14 14:55
465 查看
说点啥呢,直接进入主题吧~
1、首先声音文件是不能加密的,为什么呢?研究发现android端对它的调用是直接取的地址,不是数据内容,所以懒得进一步做平台适应了。
2、其次,别的都是可以加密的。至于怎么加密嘛?网上一大堆算法,这里就不提了。我第一版采用的是最简单是字节位加密,原理就是对字节进行一次换算加密,例如
: string a = "1234"; a[0]^=0x11;那么字符串中的1就被加密了,解密就是再执行一次a[0]^=0x11;具体就不多说了,自行百度一下更清楚。
3、接下来最重要的当然是怎么对cocos2dx修改了。这里暂时对2.x的版本进行修改说明,至于3.x也是一样的原理,大家自行修改说明吧。打开CCFileUtils.h文件,在类内加入
CCDictionary * m_pResData;
public:
void initReadRes(const std::string& file);
这段代码,然后打开CCFileUtils.cpp文件,加入
bool CCFileUtils::init()
{
m_searchPathArray.push_back(m_strDefaultResRootPath);
m_searchResolutionsOrderArray.push_back("");
m_pResData = CCDictionary::create();
m_pResData->retain();
return true;
}
void CCFileUtils::initReadRes(const std::string& file)
{
CCString *pTemp =NULL;
这里是对file文件进行解密,并将对应的文件路径名(完整路径)与文件内容存入字典m_pResData中
m_pResData->setObject(pTemp, key.c_str());
}
打开cocos2dx\platform\android下的CCFileUtilsAndroid.cpp,增加android 端的设配,这里只对两个函数进行处理doGetFileData跟isFileExist,
在doGetFileData修改为
string fullPath = fullPathForFilename(pszFileName);
CCString * pData1 = (CCString *)m_pResData->objectForKey(fullPath);
if (pData1)
{
*pSize = pData1->length();
pData = new unsigned char[*pSize];
memcpy(pData, pData1->getCString(), *pSize);
}
else if (fullPath[0] != '/')
{
打开cocos2dx\platform\ios下的打开CCFileUtilsIOS.cpp,增加IOS端的设配,这里只对1个函数进行处理sFileExist,
在isFileExist内修改为
CCString * pData1 = (CCString *)m_pResData->objectForKey(strFilePath);
if (pData1)
{
bFound = true;
}
else if (strFilePath[0] != '/')
{
这里的修改就完成了
4、使用时,在资源加载的地方加入CCFileUtils::sharedFileUtils()->initReadRes("code.dat");这样使用时,如果有解密后的数据,那么引擎优先读取的就是你解密数据了。我这里是将所有的资源压入一个文件内,并设置好了对应的文件路径。
5、结尾,其实对应真正会破解的人,这并没什么卵用,所以,只是防止一些低手而已。
1、首先声音文件是不能加密的,为什么呢?研究发现android端对它的调用是直接取的地址,不是数据内容,所以懒得进一步做平台适应了。
2、其次,别的都是可以加密的。至于怎么加密嘛?网上一大堆算法,这里就不提了。我第一版采用的是最简单是字节位加密,原理就是对字节进行一次换算加密,例如
: string a = "1234"; a[0]^=0x11;那么字符串中的1就被加密了,解密就是再执行一次a[0]^=0x11;具体就不多说了,自行百度一下更清楚。
3、接下来最重要的当然是怎么对cocos2dx修改了。这里暂时对2.x的版本进行修改说明,至于3.x也是一样的原理,大家自行修改说明吧。打开CCFileUtils.h文件,在类内加入
CCDictionary * m_pResData;
public:
void initReadRes(const std::string& file);
这段代码,然后打开CCFileUtils.cpp文件,加入
bool CCFileUtils::init()
{
m_searchPathArray.push_back(m_strDefaultResRootPath);
m_searchResolutionsOrderArray.push_back("");
m_pResData = CCDictionary::create();
m_pResData->retain();
return true;
}
void CCFileUtils::initReadRes(const std::string& file)
{
CCString *pTemp =NULL;
这里是对file文件进行解密,并将对应的文件路径名(完整路径)与文件内容存入字典m_pResData中
m_pResData->setObject(pTemp, key.c_str());
}
打开cocos2dx\platform\android下的CCFileUtilsAndroid.cpp,增加android 端的设配,这里只对两个函数进行处理doGetFileData跟isFileExist,
在doGetFileData修改为
string fullPath = fullPathForFilename(pszFileName);
CCString * pData1 = (CCString *)m_pResData->objectForKey(fullPath);
if (pData1)
{
*pSize = pData1->length();
pData = new unsigned char[*pSize];
memcpy(pData, pData1->getCString(), *pSize);
}
else if (fullPath[0] != '/')
{
打开cocos2dx\platform\ios下的打开CCFileUtilsIOS.cpp,增加IOS端的设配,这里只对1个函数进行处理sFileExist,
在isFileExist内修改为
CCString * pData1 = (CCString *)m_pResData->objectForKey(strFilePath);
if (pData1)
{
bFound = true;
}
else if (strFilePath[0] != '/')
{
这里的修改就完成了
4、使用时,在资源加载的地方加入CCFileUtils::sharedFileUtils()->initReadRes("code.dat");这样使用时,如果有解密后的数据,那么引擎优先读取的就是你解密数据了。我这里是将所有的资源压入一个文件内,并设置好了对应的文件路径。
5、结尾,其实对应真正会破解的人,这并没什么卵用,所以,只是防止一些低手而已。
相关文章推荐
- 让cocos2dx支持并通过arm64 编译
- Cocos2d-x 完美适配iphone、ipad(包括retina模式)
- cocos2d-x-3.4 无法打开包含文件extensions/ExtensionExport.h
- 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二节:Cocos引擎开发环境搭建与项目创建!
- cocos2d-x《农场模拟经营养成》游戏完整源码
- cocos2d 帮助
- cocos2dx关于size的知识
- 如何用Cocos2d-JS制作一个《你是我的小羊驼》游戏
- cocos2dx源码之 引用计数及自动释放
- Cocos2d-x学习笔记(九)—— 地图系统(地图编辑器,事件响应)
- cocos2dx 3.3 scrollView lua 版本幻灯片效果
- cocos2d-x 3.0 示例代码分析3:BaseTest
- Cocos2d-x移植到Android平台编译的两个文件Android.mk和Application.mk
- 如何使用Cocos2d-x 3.0制作基于tilemap的游戏:第三部分(完)
- cocos2dx源码之 选择器
- cocos2dx 做test遇到一个问题,记录下来
- 我所理解的cocos2dx自适配屏幕大小方案
- cocos2d-x之retain与release
- cocos2d-x由Jni实现Java与C++打电话给对方
- cocos2-d-x之runAction与clone的不解之缘