首页
社区
课程
招聘
[原创]cocos2d游戏图片资源解密
发表于: 2018-11-15 16:48 22464

[原创]cocos2d游戏图片资源解密

2018-11-15 16:48
22464

0x00 序

之前遇到过一个有意思的cocos2d游戏。里面的图片资源全都加密了。今天突然想起来。整理一下发出来。

0x01 开干

ak 打开软件 发现是cococs游戏,并且资源文件里面全是mp3,没有图片,拖入010里面发现没有模数,是被加密了! 并且文件命名是0到60 ,想到肯定是在一个循环解密。

 

图片描述

0x02 思路1

先想到hook fopen 函数 找到文件操作的地方肯定有解密代码,写了半天hook 发现 只能hook 到UserDefault.xml 资源文件全都hook 不到。

0x02 思路2

  参考各路大牛的分析 知道, cocos2dx的图片资源加载, 是在Image::initWithImageData(const unsigned char * data, ssize_t dataLen) 函数, 按照函数名称顾名思义:用数据初始化Image。

   好了, 在ida 给这个函数下个断点, 先看看这个传进来的data而且这个地址的内容跟上面打开看到的完全不一样, 再而且, 前4个字节就是png文件的魔数!.png 那也就是说, 图片文件是在被读入内存之后, 在被初始化之前就解密了; 那图片在哪里被读入? 

图片描述

 

还是参考大神们的 分析cocos2dx Android的资源加载, 一般都是从 CCFileUtils-android.cpp文件
Data FileUtilsAndroid::getData(const std::string& filename, bool forString) 加密。
挂起ida 发现在AAsset_read 之后多了一个getfilename函数的调用,进到函数看一眼: 内存每4个字节位与一个数再存回去,最后uncompress 解压文件。 得了, 基本是解密函数无疑,然后再 uncompress 下断点 出现了png的魔数.png

 

很简单, 照着这个函数写一个c函数, 读文件进内存, 调这个函数解密, 就可以了

0x03 写代码

#include <stdio.h>
#include <stdlib.h>
#include "jieya/zlib.h"
char* filePath = "00.mp3";
char* savePath = "xxxxxxx.png";
void xiex(char* buffer, size_t readsize) {
        FILE *pFile = fopen(savePath, "w");
        if (!pFile) {
                printf("write file %s fail !!\n", savePath);
                return;
        }
        printf("fileData:%c\n", buffer);
        fwrite(buffer, sizeof(char), readsize, pFile);
        fclose(pFile);
        printf("程序执行完毕\n");
}
int getFileName1(const char *fileData, int size, int a6) {

        printf("buffer=%c---readsize=%d\n", fileData, size);
        const char * newfileData;
        const char * uncompress_fileData;
        int musize=size;
        int v10; // r2@4
        int v11; // r3@4
        int v12; // r0@6
        int v13; // r1@7
        int v14; // r2@7
        signed int result; // r0@11
        if (a6)
                newfileData = malloc(size);
        uncompress_fileData = malloc(size);
        if (size >= 4) {
                v10 = 0xbc614e;
                v11 = 0;
                do {
                   *((int *) newfileData + v11) = *(int *) &fileData[4 * v11]
                                        ^ (v10 + v11);
                        ++v11;
                } while (v11 < size / 4);
        }

        v12 = size % 4;
        if (size % 4 >= 1) {
                v13 = (int) ((char *) newfileData + size - 1);
                v14 = (int) &fileData[size - 1];
                do {
                        *(unsigned char*)v13 = *(unsigned char*)v14 ^ 0xCC;
                        --v12;
                        --v13;
                        --v14;
                } while (v12);
        }
//        xiex(newfileData, size);
        if (a6) {

    if (uncompress(uncompress_fileData, &musize, newfileData, size) )
    {
            printf("haha1");
             xiex(uncompress_fileData, musize);
      free(newfileData);
      result = -1;
    }else
    {
            printf("haha2");

      free(newfileData);
      result = 0;
######     }

        } else {
                result = 0;
        }
        return result;
}

int main(int argc, char** args) {
        printf("%s => %s\n", filePath, savePath);

        FILE *fp = fopen(filePath, "r");
        if (!fp) {
                printf("read file %s fail !!\n", filePath);
                return 1;
        } else {
                printf("read file %s succ !!\n", filePath);
        }
        fseek(fp, 0, SEEK_END);
        size_t size = ftell(fp);
        fseek(fp, 0, SEEK_SET);
        unsigned char* buffer = (unsigned char*) malloc(
                        sizeof(unsigned char) * size);
        size_t readsize = fread(buffer, sizeof(unsigned char), size, fp);
        fclose(fp);

        getFileName1(buffer+4 , readsize-4, 1);

        return 0;
}

0x04 事情没有这么简单

  图片批量解密完。发现有的图片解密出来了。有的图片没有解密出来。这是怎么回事呢。继续看代码发现 原来原始文件大小 竟然在加密文件头四个字节!!!

0x05 END

哈哈哈


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 5
支持
分享
打赏 + 1.00雪花
打赏次数 1 雪花 + 1.00
 
赞赏  junkboy   +1.00 2018/11/16
最新回复 (8)
雪    币: 138
活跃值: (5114)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wsc
2
沙发
2018-11-15 17:21
1
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
3
wsc 沙发
谢谢大佬捧场
2018-11-15 17:39
1
雪    币: 212
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
板凳
2018-11-15 17:57
1
雪    币: 723
活跃值: (1281)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
5
KevinMai 板凳
瓜子饮料矿泉水
2018-11-15 22:11
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
支持一下
2018-11-16 17:37
1
雪    币: 6
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个要赏!
2019-1-21 13:40
1
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
小白完全看不懂
2022-2-18 16:18
0
游客
登录 | 注册 方可回帖
返回
//