转载:破解TexturePacker加密资源

今天在通过命令行调用TexturePacker 生成图集和加密。。。

然后就看到了有个大神已经通过反注入DLL破解了TexturePacker自带的加密。。。

本文转载自 http://blog.csdn.net/ynnmnm/article/details/38392795,感谢原作者。。。

最近我们要开一个新项目,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文件中。

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

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

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

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

破解

看看ccz的文件头:

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

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 02。如果是小端,逆序写就可以了。改了之后重新生成ccz,成功打开。

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

文件命名

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

转png与切图

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

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

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

ps. 两篇相关的操作blog:

查看android进程信息 http://blog.csdn.net/ynnmnm/article/details/38417829

使用adb在电脑和手机间传文件 http://blog.csdn.net/ynnmnm/article/details/38415221

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

时间: 2024-08-06 09:59:18

转载:破解TexturePacker加密资源的相关文章

破解TexturePacker加密资源 —— 使用IDA

之前我使用动态库注入和API拦截的方法破解过TexturePacker加密资源(详见博文<破解TexturePacker加密资源>).后来有热心的网友提醒我,用IDA也可以,而且更方便,今天下载IDA 6.6试了一下,这里记录一下操作方法. 1. 把IDA目录下android_server传到android 目录中 adb push IDA安装目录\dbgsrv\android_server /data/local/tmp/ adb shell 进入模拟器 cd /data/local/tmp

【转载】破解TexturePacker加密资源

最近我们要开一个新项目,UI与交互打算借鉴当前正火的<圣火英雄传>,程序开发为了和美术制作并行,打算用圣火的资源暂代使用.我解压圣火apk,发现用TexturePacker命令行无法把它的pvr.ccz资源文件转成png,稍微了解一下,才知道TP提供了加密功能.我最近做Unity开发,只需要TP最基本的打图集功能,所以一直用v2.4.5,很久没有升级了,out了. 圣火资源加密了,没有密钥无法打开 美术同学可以先截图或画草图给程序用,但是,截图/草图跟原图比:大小规格不对,质量差,图元叠在一起

破解TexturePacker加密资源

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

简单操作只需10秒破解PDF加密文件

简单操作只需10秒破解PDF加密文件 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51345950 如何破解PDF加密文件,如何破解PDF密码呢,破解加密的PDF文件? 从网上下载的PDF文件,由于版权的问题,作者经常会加密禁止读者复制修改等权限,如下面的PDF文档,用Adobe pdf Reader打开时,会显示"已加密"的字样,虽然可以阅读,但不能修改和标记. 为了解决这个问题,可以采用绕过破解密码这一

简谈-Python爬虫破解JS加密的Cookie

通过Fiddler抓包比较,基本可以确定是JavaScript生成加密Cookie导致原来的请求返回521. 发现问题: 打开Fiddler软件,用浏览器打开目标站点(http://www.kuaidaili.com/proxylist/2/) .可以发现浏览器对这个页面加载了两次,第一次返回521,第二次才正常返回数据.很多没有写过网站或是爬虫经验不足的童鞋,可能就会觉得奇怪为什么会这样?为什么浏览器可能正常返回数据而代码却不行? 仔细观察两次返回的结果可以发现: 1.第二次请求比第一次请求的

u3d 加密资源并缓存加载

// C# Example // Builds an asset bundle from the selected objects in the project view. // Once compiled go to "Menu" -> "Assets" and select one of the choices // to build the Asset Bundle using UnityEngine; using UnityEditor; using

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

RSA加密 VS 秀尔算法 作为RSA加密技术的终结者——“太多运算,无法读取”的秀尔算法(Shor’s algorithm)不是通过暴力破解的方式找到最终密码的,而是利用量子计算的并行性,可以快速分解出公约数,从而打破了RSA算法的基础(即假设我们不能很有效的分解一个已知的整数).同时,秀尔算法展示了因数分解这问题在量子计算机上可以很有效率的解决,所以一个足够大的量子计算机可以破解RSA. RSA加密“曾经”之所以强大,是因为它对极大整数做因数分解的难度决定了RSA算法的可靠性.将两个质数相乘

破解WPA2加密包实验

无线安全设置中,wpa2是目前应用最广泛的加密认证方式.在加密和秘钥管理过程中,均没有明显漏洞可利用.但是在实际中,依然存在针对wpa2的认证口令的攻击.目前针对wpa2的攻击方法,最主要的就是抓取用户接入ap时,截获handshake握手包.handshake握手包中包含着被加密处理的秘钥信息.因此在攻击时,可以利用同样的加密算法,对密码字典中的内容进行加密,并与握手包中的内容进行匹配,从而找到wpa2的认证秘钥.该种攻击方法的前提是设法嗅探到handshake包,并依赖字典的内容.因此弱口令

【转载】TexturePacker 如何使用自带的加密功能及在cocos2dx中的使用

在cocos2dx中使用纹理图集是非常节省资源的,在这里推荐 TexturePacker,而且 TexturePacker工具的加密接口也非常的好用,下面就来介绍一下... TexturePacker 工具的加密,只是相对于一般使用的基础上增加了几步对密码操作的步骤(目前的加密功能仅适用于.pvr.ccz格式): 一.生成密码(图形化界面和命令行两种方式) 方式一:图形化界面生成密码 密码可以自己手动过输入,或者使用下面的这几个按钮,完后点击外面的空白区域就自动保存了... (2)shell脚本