目前找到以下几种办法,均可实现:
-
使用API动态拦截+注入的办法,HOOK OpenGL的glTexImage2D,结合libpng将二进制数据生成png文件。缺陷是如果想拿到游戏中所有的解密后的资源,就必须把游戏中所有的人物、场景全部解锁并玩到。而且还有很大的一个问题,就是cocos里TTF Label生成的文字也是使用glTexImage2D来渲染的,这样就导致文字也被一并输出成PNG了。。
-
@夜风 的方案,HOOK uncompress函数,经本人实测,这种方式可以成功解压出解密过后的资源文件,但跟上面第一种方式会遇到差不多同样的问题:需要把游戏完整的玩一次才能拿到全部资源(方案的链接:http://blog.csdn.net/ynnmnm/article/details/38392795)
-
大杀器:IDA直接跟踪游戏的so库,逆向找到调用ZipUtils::ccSetPvrEncryptionKeyPart的地方(对于IDA而言这简直轻而易举),然后直接查看反编译的编码。实测不少游戏可以直接在反编译的源码里近乎明文显示texturepacker加密时的密码,比如下面这个:
然后只需要将4个有符号整形数转成16进制无符号整型,并拼接成一个字符串,就是texturepacker加密时生成的完整密钥了……