对客户端图片资源加密的破解(使用TexturePacker加密)

目前找到以下几种办法,均可实现:

  1. 使用API动态拦截+注入的办法,HOOK OpenGL的glTexImage2D,结合libpng将二进制数据生成png文件。缺陷是如果想拿到游戏中所有的解密后的资源,就必须把游戏中所有的人物、场景全部解锁并玩到。而且还有很大的一个问题,就是cocos里TTF Label生成的文字也是使用glTexImage2D来渲染的,这样就导致文字也被一并输出成PNG了。。

  2. @夜风 的方案,HOOK uncompress函数,经本人实测,这种方式可以成功解压出解密过后的资源文件,但跟上面第一种方式会遇到差不多同样的问题:需要把游戏完整的玩一次才能拿到全部资源(方案的链接:http://blog.csdn.net/ynnmnm/article/details/38392795)

  3. 大杀器:IDA直接跟踪游戏的so库,逆向找到调用ZipUtils::ccSetPvrEncryptionKeyPart的地方(对于IDA而言这简直轻而易举),然后直接查看反编译的编码。实测不少游戏可以直接在反编译的源码里近乎明文显示texturepacker加密时的密码,比如下面这个:

然后只需要将4个有符号整形数转成16进制无符号整型,并拼接成一个字符串,就是texturepacker加密时生成的完整密钥了……

3赞

用第一种方式HACK图片资源个人认为想保护图片资源这问题几乎完全是无解的。因为不管用什么方式加密,在OPENGL绘制的时候就肯定都已经解密了。。。

楼主太强大了,看来我以后要加强加密才行

楼主能不能给个第一种的方法的详细教程啊:5:

楼主!用libinject按照网上的例子试验成功了,怎么HOOK OpenGL的glTexImage2D 教一下呗:5:

怎么HOOK OpenGL的glTexImage2D 教一下呗:6:

:5::5::5::5:

怎么HOOK OpenGL的glTexImage2D 教一下呗 :5: :5: :5: :5:

怎么HOOK OpenGL的glTexImage2D 教一下呗:5::5:

void (*old_glTexImage2D)( GLenum target,
GLint level,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid * data);

void new_glTexImage2D( GLenum target,
GLint level,
GLint internalFormat,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid * data){
//LOGD(“call glTexImage2D, image width: %d, height: %d, format: %d, type: %d”, width, height, format, type);
if (old_glTexImage2D == NULL)
LOGD(“error!\n”);
G_fileNameIndex++;
if (G_fileNameIndex < 1000 && width < height* 5)
{
char fullNamebuf;
sprintf(fullNamebuf,"/data/tmp_dir/%d.png",G_fileNameIndex );
saveImageToPNG(fullNamebuf, 0, width, height, data);
}

return (*old_glTexImage2D)(target, level,internalFormat, width,height,border,format,type,data); 

}

unsigned address = (unsigned)get_symbol_address(“glTexImage2D”);
replaceFunc(address, new_glTexImage2D, (void**)&old_glTexImage2D);

找到glTexImage2D在so库里的地址,将原地址替换成自己的函数就可以了,写教程太麻烦了,直接贴代码了

也看不懂也不会 还想解密一个程序 咋搞

楼主能帮忙解密一个么?

mark一下吧

MARKK