标签:程序开发 pad cpp style xtu dex 交互 详细 dll
近期我们要开一个新项目,UI与交互打算借鉴当前正火的《圣火英雄传》。程序开发为了和美术制作并行,打算用圣火的资源暂代使用。我解压圣火apk,发现用TexturePacker命令行无法把它的pvr.ccz资源文件转成png,略微了解一下,才知道TP提供了加密功能。我近期做Unity开发。仅仅须要TP最主要的打图集功能,所以一直用v2.4.5,非常久没有升级了,out了。
圣火资源加密了,没有密钥无法打开
美术同学能够先截图或画草图给程序用,可是,截图/草图跟原图比:大小规格不正确。质量差,图元叠在一起,也会缺漏非常多。
不说耗费美术大量精力做繁重的体力活,这样做出的东西也会“慘不忍睹”,等正式美术资源来了,全部美术显示也都须要程序又一次调整,这是不小的工作量。
所以,最好的方法是研究破解圣火的加密资源。project师的工作就是减小人的劳动,提高生产效率。
动态库注入与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。这样能够直接获取password。可是。从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 bytes unsigned short compression_type; // should 0 unsigned 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。作者:夜风。
标签:程序开发 pad cpp style xtu dex 交互 详细 dll
原文地址:http://www.cnblogs.com/cxchanpin/p/7008032.html