破解TexturePacker加密资源,寻找解密Key之旅
破解TexturePacker加密资源的方式有好多种。。最多的是hook uncompress然后获取到内容,加入ccz的文件头写入文件。
例如:
http://blog.csdn.net/ynnmnm/article/details/38392795
http://bbs.pediy.com/showthread.php?t=187332
今天我用最直接的方法搞定,直接找到用户设置的秘钥。
void ZipUtils::ccSetPvrEncryptionKeyPart(int index, unsigned int value)// 设置密钥的接口
- 1
inline void ZipUtils::ccDecodeEncodedPvr(unsigned int *data, int len)
{const int enclen = 1024;const int securelen = 512;const int distance = 64;// check if key was set// make sure to call caw_setkey_part() for all 4 key partsCCAssert(s_uEncryptedPvrKeyParts[0] != 0, "Cocos2D: CCZ file is encrypted but key part 0 is not set. Did you call ZipUtils::ccSetPvrEncryptionKeyPart(...)?");CCAssert(s_uEncryptedPvrKeyParts[1] != 0, "Cocos2D: CCZ file is encrypted but key part 1 is not set. Did you call ZipUtils::ccSetPvrEncryptionKeyPart(...)?");CCAssert(s_uEncryptedPvrKeyParts[2] != 0, "Cocos2D: CCZ file is encrypted but key part 2 is not set. Did you call ZipUtils::ccSetPvrEncryptionKeyPart(...)?");CCAssert(s_uEncryptedPvrKeyParts[3] != 0, "Cocos2D: CCZ file is encrypted but key part 3 is not set. Did you call ZipUtils::ccSetPvrEncryptionKeyPart(...)?");// create long keyif(!s_bEncryptionKeyIsValid){unsigned int y, p, e;unsigned int rounds = 6;unsigned int sum = 0;unsigned int z = s_uEncryptionKey[enclen-1];do{
#define DELTA 0x9e3779b9
#define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (s_uEncryptedPvrKeyParts[(p&3)^e] ^ z)))sum += DELTA;e = (sum >> 2) & 3;for (p = 0; p < enclen - 1; p++){y = s_uEncryptionKey[p + 1];z = s_uEncryptionKey[p] += MX;}y = s_uEncryptionKey[0];z = s_uEncryptionKey[enclen - 1] += MX;} while (--rounds);s_bEncryptionKeyIsValid = true;}int b = 0;int i = 0;// encrypt first part completelyfor(; i < len && i < securelen; i++){data[i] ^= s_uEncryptionKey[b++];if(b >= enclen){b = 0;}}// encrypt second section partiallyfor(; i < len; i += distance){data[i] ^= s_uEncryptionKey[b++];if(b >= enclen){b = 0;}}
}
void ZipUtils::ccSetPvrEncryptionKeyPart(int index, unsigned int value)
{CCAssert(index >= 0, "Cocos2d: key part index cannot be less than 0");CCAssert(index <= 3, "Cocos2d: key part index cannot be greater than 3");if(s_uEncryptedPvrKeyParts[index] != value){s_uEncryptedPvrKeyParts[index] = value;s_bEncryptionKeyIsValid = false;}
}void ZipUtils::ccSetPvrEncryptionKey(unsigned int keyPart1, unsigned int keyPart2, unsigned int keyPart3, unsigned int keyPart4)
{ccSetPvrEncryptionKeyPart(0, keyPart1);ccSetPvrEncryptionKeyPart(1, keyPart2);ccSetPvrEncryptionKeyPart(2, keyPart3);ccSetPvrEncryptionKeyPart(3, keyPart4);
}
上appstore上随便找个cocos2d的游戏,拖入Hopper,搜索ccSetPvrEncryptionKeyPart,没有找到。然后搜索ZipUtils,如下图:
ccDecodeEncodedPvr用来解密pvr.ccz文件,没有找到ccSetPvrEncryptionKeyPart,那么我们在ccDecodeEncodedPvr上下代码块里面试试运气
int sub_444200(int arg0, int arg1) {r1 = arg1;r0 = arg0;r3 = *(0x7d79d0 + r0 * 0x4);asm{ it eq };if (r3 == r1) {return r0;}*(0x7d79d0 + r0 * 0x4) = r1;*(int8_t *)0x7d89e0 = 0x0;return 0x0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
这个有点像。。猜测arg0为index arg1为value
写tweak验证:
int(*orgccSetPvrEncryptionKey)(int index,unsigned int key);
int myccSetPvrEncryptionKey(int index,unsigned int key);
int myccSetPvrEncryptionKey(int index,unsigned int key2key{NSLog(@"\n\n===== keys: %d-%u ======\n\n",index,key);orgccSetPvrEncryptionKey(key1,key2);
}
%ctor{NSLog(@"====== HOOKED ======");intptr_t module_vmaddr = _dyld_get_image_vmaddr_slide(0);intptr_t ccSetPvrEncryptionKey = module_vmaddr + 0x444200 + 1;MSHookFunction((void *)ccSetPvrEncryptionKey, (void*)myccSetPvrEncryptionKey, (void**)&orgccSetPvrEncryptionKey);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
测试log
Jun 1 11:57:43 crean XXX[73393]:===== keys: 0-405172683 ======
Jun 1 11:57:43 crean XXX[73393]:===== keys: 1-1270815801 ======
Jun 1 11:57:43 crean XXX[73393]:===== keys: 2-3663874658 ======
Jun 1 11:57:43 crean XXX[73393]:===== keys: 3-2333226975 ======
将这4个Key转为16进制为
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
182671CB4BBF1C39DA624A628B1237DF
- 1
用TexturePacker打开加密的pvr.ccz的文件,它会提示你输入128位加密的KEY,输入直接解密验证:
我想,看了这篇教程学到的不紧紧是破解TexturePacker加密资源哦。。自己动手验证试试。。只随机了一个游戏测试。。有兴趣的朋友可以找个游戏验证验证是否通用。。
本文转自: creantan
原文链接:http://www.jianshu.com/p/9562bc1cab72
破解TexturePacker加密资源,寻找解密Key之旅相关推荐
- Android中IDA分析TexturePacker加密资源寻找加密Key
一.前言 今天我们来看如何破解分析TexturePacker加密资源的加密Key.根据经验目前常用的方法有以下三种:直接hook uncompress函数,得到资源数据内容并保存:直接hook set ...
- C++最强防御解密程序,一秒破解所有加密文件!
在21世纪互联网信息时代,你的个人信息有可能被别有用心的人时时刻刻监视着,那么你想不想实现专属于两个人或一个小圈子的人在社交软件上的交流不被任何其他人读懂呢?下面就给大家提供一个原理极其简单程序极其容 ...
- cocos2d-LUA逆向之用idaPro调试so库获取xxtea解密key
以一个棋牌类app 大神.apk为例,,首先我们需要获取apk里面的脚本资源,可以直接用360好压解压缩apk安装包,会得到如下目录: 其中,lib目录含有我们需要调试的so库文件,文 ...
- php源代码保护——PHP加密方案分析解密还原
前言 php是一种解释型脚本语言. 与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 . 在php源代码的保 ...
- python AES对称加密文件、解密文件
咱也不是学计算机的,咱也不是学网络安全的,咱更不是学密码学的,所以东拼西凑一堆代码,能用就行. 该加解密的秘钥是自己输入的密码加电脑固定序列号,包括网卡MAC地址.CPU序列号.硬盘序列号.主板序列号 ...
- python 破解字体加密实战
破解字体加密,以58同城网站为例. 字体加密是爬取网页的过程中比较麻烦的问题. 字体加密一般是网页修改了默认的字符编码集,在网页上加载的他们自己定义的字体文件作为字体的样式,可以正确地显示数字,但是在 ...
- 无线WiFi安全渗透与攻防(五)之aircrack-ng破解WEP加密
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 无线WiFi安全渗透与攻防(二)之打造专属字典 无线WiFi安全渗透与攻防(三)之Windows扫描wifi和破解WiFi密码 无线WiF ...
- jsencrypt.js加密java后端解密
文章目录 1.什么是RSA? 2.RSA算法 2.1 生成公钥和私钥 2.2 使用公钥加密信息 2.3 使用私钥解密信息 4.RSA的应用:数字签名 5.RSA的安全性 6.为什么要写这文章? 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 ...
最新文章
- ubuntu 18.04 添加快快捷方式
- 利用gulp对项目html,js,css,图片进行压缩
- ipa去除时间锁_【解密了!】影响沸石分子筛转轮去除效率的因素
- postgresql数据库用户名密码验证失败
- 最近吸收的html CSS 知识
- python的按钮控件_python实现360皮肤按钮控件示例
- android微信支付服务端,Android 微信支付返回-1
- 梁单元分析matlab,[FEM][有限元][编程][Matlab][Code by myself] 2D Timoshenko梁单元
- Python入门6_抽象
- c# npoi 公式不计算_高中数学最不容易,最难计算,全高中数学所有基础性质公式归纳...
- 矩形变弧度角_懒惰使人类进步:不想刷马桶,那就让马桶自己变干净丨种草机...
- 展示浏览 java_java利用 cookie 进行展示你所浏览过的的商品
- TMGM外汇平台官网最全测评(2022年版)
- OpenCL 简单概念
- 在任意文件夹下以管理员的身份运行powershell
- 现货黄金宝典——如何做突破行情
- undefined symbol nvic 报错 undefined symbol TIM_Cmd报错
- 区块链技术与第四次工业革命之于人类的意义
- java导出word实现方式一,在jsp中实现
- PaddleOCR数字仪表识别——3.paddleocr迁移学习