在上一篇文章中,我已经开始着手写自己的模块,也就是fw部分.其中上一篇文章中完成的是lua部分的配置解析部分,涉及一点点平台方面的封装.这一片文章我来说明一下我是如何处理cocos2dx资源加密的.首先需要说明白的是,资源是什么?资源分为哪几类?
在选择使用lua脚本开发后,包括lua文件,游戏美术资源,游戏的配置,我都统称为游戏资源,所以我期望的加密是能够加密所有这些东西.quick提供了xxtea,而cocos2dx也在luastack中整合了xxtea,我稍微做了一些修改.主要的修改思路是:首先要知道lua文件,游戏资源文件的加载入口在哪里.也许很多人听到我这么说会觉得很怪,不过这确实是解决这个问题的根本出发点.只要找到了加载入口才能做出合适的解决方案.
通过查看源码,我发现lua_loader加载lua文件的入口其实就是fileutils中的接口,然后使用vs的debug,又定位到fileutils中的文件Io读取接口.这样子就知道我们需要手动操作的接口了。我们就看其中一个接口就好了.
CCFileUtils-win32.cpp
1 static Data getData(const std::string& filename, bool forString) 2 { 3 if (filename.empty()) 4 { 5 return Data::Null; 6 } 7 8 unsigned char *buffer = nullptr; 9 10 size_t size = 0; 11 do 12 { 13 // read the file from hardware 14 std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename); 15 16 WCHAR wszBuf[CC_MAX_PATH] = {0}; 17 MultiByteToWideChar(CP_UTF8, 0, fullPath.c_str(), -1, wszBuf, sizeof(wszBuf)/sizeof(wszBuf[0])); 18 19 HANDLE fileHandle = ::CreateFileW(wszBuf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL, nullptr); 20 CC_BREAK_IF(fileHandle == INVALID_HANDLE_VALUE); 21 22 size = ::GetFileSize(fileHandle, nullptr); 23 24 if (forString) 25 { 26 buffer = (unsigned char*) malloc(size + 1); 27 buffer[size] = '