加密就不用说了,看上一篇2.X加密的方式,怎么弄都可以。的保证解密规则就行;

现在重点说3.X解密:

在新的3.X引擎中官方整合了大部分获取资源的方法,最终合成一个getdata;

可以从源码,和堆栈调用中看到:

CCFileUtils.cpp:

Data FileUtils::getDataFromFile(const std::string& filename)
{
return getData(filename, false);
}

getDataFromFile目前只调用getData(filename,false);

Data getData(const std::string& filename, bool forString)

这个函数是一个非类成员静态函数。

forString是用来标识是否是一个文本文件,如果是那么buffer需要多一个字节。

这个其实不重要,因为我们处理的最终buffer是获取完全的

所以直接改代码:

static Data getData(const std::string& filename, bool forString)
{
if (filename.empty())
{
return Data::Null;
} Data ret;
unsigned char* buffer = nullptr;
size_t size = ;
size_t readsize;
const char* mode = nullptr; if (forString)
mode = "rt";
else
mode = "rb"; std::string lastname = FileUtils::getInstance()->fullPathForFilename(filename);
lastname = lastname.substr(lastname.length()-5,lastname.length()); do
{
// Read the file from hardware
std::string fullPath = FileUtils::getInstance()->fullPathForFilename(filename);
FILE *fp = fopen(fullPath.c_str(), mode);
CC_BREAK_IF(!fp);
fseek(fp,,SEEK_END);
size = ftell(fp);
fseek(fp,,SEEK_SET); if (forString)
{
buffer = (unsigned char*)malloc(sizeof(unsigned char) * (size + ));
buffer[size] = '\0';
}
else
{
buffer = (unsigned char*)malloc(sizeof(unsigned char) * size);
} readsize = fread(buffer, sizeof(unsigned char), size, fp);
fclose(fp); if (forString && readsize < size)
{
buffer[readsize] = '\0';
}
} while (); if (nullptr == buffer || == readsize)
{
std::string msg = "Get data from file(";
msg.append(filename).append(") failed!");
CCLOG("%s", msg.c_str());
}
else
{
if(lastname == "_jm.d")
{
for (int i = 0; i<readsize; i++) {
buffer[i]=MD5(buffer[i]);
}
buffer[readsize]=buffer[readsize]-MD5size;
}
ret.fastSet(buffer, readsize);
} return ret;
}

红色代码是我们自定义加密的文件解密,不管你用什么加密,或者修改地址扰码,只要保证加密解密格式相同;

OK,解密就算完成了,但是注意还有资源类型需要判断,在2.X中,处理了EImageFormat的判断,可以定义资源类型

但是还是建议还是不要去大改源码,3.2以上版本已经非常简洁强大了

3.X中整合了Format后,也有资源类型另外一种方式定义_fileType = detectFormat(unpackedData, unpackedLen);

我们解密后的资源类型在3.X中是行不通的,是Format::UNKOWN;

那么就在不大改的情况下重载函数方式解决这个问题:

重载initWithImageData,在CCImage.h中CCImage.cpp中

.h添加:

/*
jmflag 加密标识
*/
bool initWithImageData(const unsigned char * data, ssize_t dataLen,bool jmflag);

.cpp添加:

bool Image::initWithImageData(const unsigned char * data, ssize_t dataLen,bool jmflag)
{
bool ret = false; do
{
CC_BREAK_IF(! data || dataLen <= ); unsigned char* unpackedData = nullptr;
ssize_t unpackedLen = ; //detecgt and unzip the compress file
if (ZipUtils::isCCZBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateCCZBuffer(data, dataLen, &unpackedData);
}
else if (ZipUtils::isGZipBuffer(data, dataLen))
{
unpackedLen = ZipUtils::inflateMemory(const_cast<unsigned char*>(data), dataLen, &unpackedData);
}
else
{
unpackedData = const_cast<unsigned char*>(data);
unpackedLen = dataLen;
} if(jmflag == true)
{
_fileType=Format::PNG;
} ret = initWithPngData(unpackedData, unpackedLen); if(unpackedData != data)
{
free(unpackedData);
}
} while (); return ret;
}

另外在initWithImageFile函数中得修改调用方法

CCImage.cpp:

Data data = FileUtils::getInstance()->getDataFromFile(_filePath);

    if (!data.isNull())
{
std::string lastname = _filePath;
lastname = lastname.substr(lastname.length()-,lastname.length());
if(lastname=="_jm.d")
{
ret = initWithImageData(data.getBytes(), data.getSize(),true);
}
else
{
ret = initWithImageData(data.getBytes(), data.getSize());
}
}

OK,自定义类型的资源解密就搞定了,但这只处理了PNG图片类型的加密,其他图片类型资源可以按照这种方式处理。

好了,那么有同学问,那么JS,Lua脚本的解密呢?

看这里

ScirptingCore.cpp:

  // Check whether '.jsc' files exist to avoid outputing log which says 'couldn't find .jsc file'.
CCLOG("byteCodePath > %s",byteCodePath.c_str());
if (futil->isFileExist(byteCodePath))
{
Data data = futil->getDataFromFile(byteCodePath);
if (!data.isNull())
{
script = JS_DecodeScript(cx, data.getBytes(), static_cast<uint32_t>(data.getSize()), nullptr, nullptr);
}
}

Data data = futil->getDataFromFile(byteCodePath);

对于脚本语言的加载读取还是上面我们已经改过的getDataFromFile方法噢!

但是还有一点

script = JS_DecodeScript(cx, data.getBytes(), static_cast<uint32_t>(data.getSize()), nullptr, nullptr);

这样是直接拿不到script的,JS_DecodeScript只是处理.jsc的,那么怎么给script复制呢?

代码修改如下:

        //只解密scr下面目录文件
if(jmflag==true)
{
if (futil->isFileExist(jmfullPath))
{
Data data = futil->getDataFromFile(jmfullPath,true);
if (!data.isNull())
{
script = JS::Compile(cx, obj, options, (const char*)data.getBytes(), data.getSize());
}
}
}
else
{
script = JS::Compile(cx, obj, options, fullPath.c_str());
}

script = JS::Compile(cx, obj, options, (const char*)data.getBytes(), data.getSize());

用Compile的这个重载函数赋值就全部搞定了;Lua和JS的脚本代码解密也一样非常简单!

大功告成,再见!

PS一下广告时间:

我目前在录制cocos2dx-3.X系列的实战项目视频,可以完全来说是商业项目视频讲解,让你爱上更有趣的游戏开发方式;

9秒课堂会第一时间上线我们的实战视频!

可以让大家更快速的掌握cocos2dx-Js的游戏实战开发!现在用脚本做游戏已然成为一个大的趋势;

而且在手游游戏行业飞速发展的今天,如果不用一种快速上手的脚本语言做游戏开发岂不是会Out了

另外希望大家支持我们的游戏开发群:【41131516】

 
 
 
 
 
 
 
 

【Cocos2d-x 3.X 资源及脚本解密】的更多相关文章

  1. 小白读iOS冗余资源扫描脚本

    随着公司项目的不断功能迭代,项目的体积越来越大,各种瘦身策略迫在眉睫.由于平时使用Linux高级命令和 shell脚本的机会不多,之前学的知识一下子想起来很难.所有趁着这次看脚本,重新温习一下. 本文 ...

  2. iOS项目冗余资源扫描脚本

    iOS项目冗余资源扫描脚本 随着iOS项目的版本不断迭代,app中冗余文件会越来越多,app size也持续增加,是时候需要对app冗余资源进行检测,对app进行瘦身. 使用方法: 1. 运行环境为m ...

  3. cocos2dx资源和脚本加密quick-lua3.3final

    一.资源加密 版本号:Quick-Cocos2d-x 3.3 Final 调试工具:xCode 工程创建的时候选择的拷贝源码. 项目结构如图: 这个功能七月大神在很早之前就已经实现了,但是在3.3版本 ...

  4. 使用KRPano资源分析工具解密被加密的XML

    软件交流群:571171251(软件免费版本在群内提供) krpano技术交流群:551278936(软件免费版本在群内提供) 最新博客地址:blog.turenlong.com 限时下载地址:htt ...

  5. cocos2d&amp;cocos2dx学习资源

    汇总一下自己学习Cocos2d和cocos2dx认为比較好的一些资源: 书籍: <iPhone&iPad cocos2d游戏开发实战> Steffen Itterheim < ...

  6. 通过apache的mod_status 统计占资源的脚本

    apache的mod_status模块,提供了对apache运行时的一些统计信息,对apache的管理员来说很有意义. 一.加载apache的mod_status模块 各种系统下,加载apache模块 ...

  7. 提取Unity游戏资源和脚本

    UnityStudio UnityStudio可以直接在自己的软件上查看图片.shader.文本.还能直接播放音频.甚至还能看场景Hierarchy视图的树状结构.强烈推荐用UnityStudio. ...

  8. 【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-c ...

  9. 利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)

    转自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括, ...

随机推荐

  1. 时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell

    时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell opensuse 一些常用命令:    service xxx start/s ...

  2. apt-get程序和系统管理

    检查更新:apt-get update 系统升级:apt-get upgrade 移除软件:apt-get remove xxx 自动移除旧的软件包:apt-get autoremove 完全移除软件 ...

  3. Asp.Net Web API 2第四课——HttpClient消息处理器

    Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web A ...

  4. 让ASP.NET Web API支持POST纯文本格式(text/plain)的数据

    今天在web api中遇到了这样一个问题,虽然api的参数类型是string,但只能接收post body中json格式的string,不能接收原始string. web api是这样定义的: pub ...

  5. 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问

    简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL S ...

  6. 记一次在StackOverFlow上问问题的经历

    最近一直在做测试方面的事情,被测的一些功能需要连接到FTP服务器上.而我在做本地测试时为了方便,就使用java写了一个简单的ftp服务器,可以在命令行下直接启动运行. 当时在main函数里是这样写的. ...

  7. AngularJS应用页面切换优化方案

    葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的Wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如本篇的在页面切换的过程中优化方案,欢迎大家跟 ...

  8. C# 两行代码实现 延迟加载的单例模式(线程安全)

    关键代码第4,5行. 很简单的原理不解释:readonly + Lazy(.Net 4.0 + 的新特性) public class LazySingleton { //Lazy singleton ...

  9. C++数组和指针

    <C++ Primer 4th>读书摘要 与 vector 类型相似,数组也可以保存某种类型的一组对象:而它们的区别在于,数组的长度是固定的.数组一经创建,就不允许添加新的元素.指针则可以 ...

  10. 股市T+0技巧

    虽然现在股票不能t+0交易了,不过通过股票t+0技巧可以变相的实现t+0交易,尤其在主力方面应用股票t+0技巧更为明显.主力资金一旦介入某股,肯定会建立很大的仓位作为主仓,然后长线持有.然而为了推动股 ...