最近我们要开一个新项目,UI与交互打算借鉴当前正火的《圣火英雄传》,程序开发为了和美术制作并行,打算用圣火的资源暂代使用。我解压圣火apk,发现用TexturePacker命令行无法把它的pvr.ccz资源文件转成png,稍微了解一下,才知道TP提供了加密功能。我最近做Unity开发,只需要TP最基本的打图集功能,所以一直用v2.4.5,很久没有升级了,out了。

圣火资源加密了,没有密钥无法打开

美术同学可以先截图或画草图给程序用,但是,截图/草图跟原图比:大小规格不对,质量差,图元叠在一起,也会缺漏很多。不说耗费美术大量精力做繁重的体力活,这样做出的东西也会“惨不忍睹”,等正式美术资源来了,所有美术显示也都需要程序重新调整,这是不小的工作量。所以,最好的方法是研究破解圣火的加密资源。工程师的工作就是减小人的劳动,提高生产效率。

动态库注入与API拦截

开始时,我心里一点底儿也没有,因为我是开发游戏的,从来没做过破解。仅有的一点相关经验是几年前看《Windows核心编程》时用DLL注入和API拦截,做过一些游戏的反外挂工作。几年没做PC开发,具体实现早忘光了,只记得大致原理是通过注入自己的DLL到目标进程,劫持某些API,替换成自己的实现。

android内核是基于linux的,我想linux下是否也可以通过注入拦截API呢?只要能劫持API,就能破解。google "linux + inject",linux下果然也可以注入,更进一步发现有人已经开源了自己写的注入库,LibInject,核心的系统API是ptrace,还有几个操作动态链接库的API,dlopen、dlsym、dlclose、dlerror。注入之后,就是劫持,遍历got表,找到接口的地址然后替换成自己写的接口即可。

注入和劫持都ok之后,我试着劫持printf,替换成自己的函数,成功,我心里对破解有底了。下面是一些具体的操作过程。

首先要把手机root,把注入进程和劫持库拷贝到手机上,比如/data目录下,adb push命令。如果提示“Permission Denied”,就先把/data挂载(mount),然后改变文件权限(chmod)。

然后,打开圣火包里面lib目录,发现圣火用的是cocos2d-js v2.2开发,去cocos2d-x官方下载v2.2.5。然后,找到加载pvr.ccz的模块,都在ZipUtils.h/.cpp文件中。

    void ZipUtils::ccSetPvrEncryptionKeyPart(int index, unsigned int value)// 设置密钥的接口int ZipUtils::ccInflateCCZFile(const char *path, unsigned char **out) // 加载ccz文件的接口

我本想劫持设置密钥的用户自定义接口:ccSetPvrEncryptionKeyPart,这样可以直接获取密码。但是,从soinfo->symtab中获取的符号名始终是乱码,目前我还没搞明白原因,请知道的朋友指导。我就转而看ccInflateCCZFile的实现,这个接口会读取ccz文件的二进制数据,然后根据前四个字节判断是否合法的ccz文件(“CCZ!”)或者是否加密的ccz文件(“CCZp”),如果是加密的,就解密。接着,调用了libz的解压缩接口:

    int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);

原来ccz也是一种zip压缩格式。这里需要用到source和destLen这两个参数,source是 解密出来的ccz文件数据,*destLen是 压缩前的大小。既然如此,我只要把uncompress接口劫持了,就可以破解出资源。ps. 除了劫持uncompress,还可以劫持opengl接口,毕竟所有图都要送到opengl绘制。

破解

看看ccz的文件头:

    /** @struct CCZHeader*/struct CCZHeader {unsigned char   sig[4];             // signature. Should be 'CCZ!' 4 bytesunsigned short  compression_type;   // should 0unsigned short  version;            // should be 2 (although version type==1 is also supported)unsigned int    reserved;           // Reserverd for users.unsigned int    len;                // size of the uncompressed file};

source是不包含文件头的,所以需要自己把文件头填充进去。sig是“CCZ!”,compress_type是0,version是2,reserved是0,len是*destLen。创建一个ccz文件,把文件头和source写入。然后,把生成的ccz文件拷回本机,adb pull,“Permission Denied”?chmod。怀着激动地心情用TexturePacker打开,却报告失败。然后用Notepad++的Hex Editor打开,转成16进制,发现文件头的大小端逆序了。比如version,在大端机器上16进制表示是0x00 02,小端机器上是0x02 00。如果是小端,逆序写就可以了。改了之后重新生成ccz,成功打开。

解密出来的圣火资源——Activity.pvr.ccz

文件命名

劫持uncompress是无法知道文件名的。写一个文件扫描圣火资源目录,根据以文件size为key,文件名为value。然后,根据文件size做匹配就可以了。因为文件的size是精确到byte的,一般不会有文件是同样大小。我检查了圣火,211个ccz文件,没有同样大小的。

转png与切图

TexturePacker可以直接命令行把ccz转png,然后再写一个工具,读plist切散图就可以了,可以用CocosStudio,网上也有人用python写的。至此,我们已经完美的破解了圣火所有的资源,获得了所有美术资源。

切出来的圣火美术资源散图

除了《圣火英雄传》,还有很多游戏也是用TexturePacker加密资源,都可以用这个方法破解。为了避免争端,暂不放出工具及代码。

ps. 两篇相关的操作blog:查看android进程信息、使用adb在电脑和手机间传文件

update1 —— 2015.04.07

另外,使用IDA也可以破解,详见博文《破解TexturePacker加密资源——使用IDA》

转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/38392795。作者:夜风。

破解TexturePacker加密资源相关推荐

  1. 破解TexturePacker加密资源,寻找解密Key之旅

    破解TexturePacker加密资源的方式有好多种..最多的是hook uncompress然后获取到内容,加入ccz的文件头写入文件.  例如: http://blog.csdn.net/ynnm ...

  2. Android中IDA分析TexturePacker加密资源寻找加密Key

    一.前言 今天我们来看如何破解分析TexturePacker加密资源的加密Key.根据经验目前常用的方法有以下三种:直接hook uncompress函数,得到资源数据内容并保存:直接hook set ...

  3. python 破解字体加密实战

    破解字体加密,以58同城网站为例. 字体加密是爬取网页的过程中比较麻烦的问题. 字体加密一般是网页修改了默认的字符编码集,在网页上加载的他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在 ...

  4. 记一次破解前端加密详细过程

    应工作需要爬过各种各样的航空公司网站,大到B2B平台,小到东南亚某某航空官网,从最初使用webdriver+selenium爬虫到现在利用http请求解析html,经历过各种各样的问题,webdriv ...

  5. Python攻防-暴力破解ZIP加密文件的密码

    文章目录 前言 Python语法 自定义迭代器 Python多线程 Python脚本 单线程数字爆破 单线程字符爆破 多线程字典爆破 总结 前言 本文继续记录学习下 Python 的有趣应用:借助 P ...

  6. 谈Flash的破解与加密(附flash破解工具)

    下载地址:http://dotnet.5d6d.com/thread-470-1-1.html 包括:SSD4,换衣.zip,flash.zip 在一些名门论坛,谈论破解之术被明文禁止甚至会招来不尽的 ...

  7. (zt)Flash破解与加密综合

    Flash破解与加密综合[精品原创](2007-7-4更新) 上传时间:2007-1-17 更新时间:2007-1-22.2007-2-10.2007-2-27.2007-3-29.2007-5-17 ...

  8. 超简单破解网页加密源代码

    有些网站的源代码是经过加密的,如何快捷的破解这些加密的代码呢?告诉你一个简单而有效的方法. 在地址栏或按Ctrl+O,输入: javascript:s=document.documentElement ...

  9. 秀尔算法:破解RSA加密的“不灭神话” --zz

    http://netsecurity.51cto.com/art/201508/488766.htm RSA加密曾被视为最可靠的加密算法,直到秀尔算法出现,打破了RSA的不灭神话. RSA加密 VS ...

  10. 区块链和同态加密结合使用的电子投票系统_全同态加密资源汇总

    本文由陈智罡博士撰写. ●全同态加密论文列表 1.http://people.csail.mit.edu/vinodv/FHE/FHE-refs.html 这个是根据同态加密进行分类的列表 2.htt ...

最新文章

  1. 深入探讨Java中的异常与错误处理
  2. 编译安装appach遇到的那些事
  3. 图论--二分图--二分图的定义及其判断定
  4. python2.7读取excel_对Python2.7pandas中的read_excel详解
  5. 小巧的Web进度条组件 - NProgress
  6. Linux安装gcc和运行代码教程
  7. nero刻录软件中文版|nero express刻录软件 (附教程)
  8. word参考文献后面空格太大
  9. 数字图像处理——大家来找茬(Python)
  10. 统一社会信用代码正则表达式
  11. Windows快捷键大全(2020年版)
  12. 02_制定自己的学习计划
  13. 2014中国机器视觉行业十大知名品牌
  14. Axure RP9 安装教程
  15. DFC Search In Depth-转
  16. 中国消费者信心指数连月下跌...
  17. Nginx反向代理配置详解
  18. python提供服务_利用Python打造短链服务(一)
  19. 计算机在校学校目标和措施,学校信息化工作方案
  20. Vue - 使用 腾讯云SCF部署Vue项目(支持GitHub Action)

热门文章

  1. 计算机打印字与印刷字的大小,[转载]实际大小、实际印刷大小 字号 磅数 尺寸对照表及图片...
  2. 电子元件识别 测量
  3. java基础考试_Java基础试题及其答案
  4. 极化码自适应CA-SCL译码(极化码译码)
  5. 旧版微信支付文档链接
  6. java 文件 锁定,Java中的文件锁定
  7. java itext 里表格_Java解析PDF里的表格内容
  8. tp5调用阿里云短信接口
  9. 英语语音识别软件_识别英语语音的软件_英文语音识别软件 - 云+社区 - 腾讯云...
  10. EasyRoad3D使用手册