几个月前闲着无聊解开了"武侠Q传"这款手机游戏的apk看了下,竟然是用pvr.ccz格式的图片,后来用TexturePacker附带的一个pvr.ccz的图片浏览工具打开发现被加密了.因为这款游戏是用的开源引擎cocos2dx做的,而自己对cocos2dx也还算比较熟悉,所以打算试下破解它的密码. - - 在这里我只说下自己的想法,虽然说是想法,但是绝对是没有问题的,因为在几个月前我已经实现过,只不过现在很久了找不到当时的源码.
pvr.ccz的加密方式可以看这里:
https://www.codeandweb.com/texturepacker/contentprotection,其实是自己写的一种加密方式,它不会改变数据长度.里面涉及到一个128位的密码.该密码是全局的,也就是所有pvr.ccz都是用的同一个密码,所以我们只要获取到其中一张pvr.ccz的正常图片数据,然后再根据正常图片数据与加密图片数据反推即可,反推很简单,大家可以下看到上面链接里面有两个源码可以下载 ZipUtils.h ZipUtils.m它这个是用于oc,网上已经可以下到很多的C++版本.(最新版本的cocos2dx 已经将该算法集成至ZipUtils.h和ZipUtils.cpp中,所以最简单就是下个最新的cocos2dx),下面是加密算法的核心部分:
// encrypt first part completely
for(; i < len && i < securelen; i++)
{
data[i] ^= s_uEncryptionKey[b++];
if(b >= enclen)
{
b = 0;
}
}
// encrypt second section partially
for(; i < len; i += distance)
{
data[i] ^= s_uEncryptionKey[b++];
if(b >= enclen)
{
b = 0;
}
}
其实就是一个^操作,直接用&即可还原.
那如何获取正常的没加密的pvr.ccz 图片数据呢,同样非常简单,通过查看cocos2dx的pvr.ccz图片加载流程,发现它最终会调用ccInflateCCZFile来解压ccz.pvr图片(其实pvr.ccz就是一种压缩图片格式),在该函数里面如果检测到是加密版本的pvr.ccz 图片就会调用ccDecodeEncodedPvr解密,然后再调用 libz.so 中的uncompress函数解压.so 看到这里大家应该也明白了,直接hook uncompress即可得到完整的解密后的数据.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!