skyun1314 发表于 2015-11-14 03:25:21

cocos2d图片资源的解密

本帖最后由 skyun1314 于 2015-11-14 03:46 编辑

学习逆向知识已经1年多了一直没有实质性的进展,遇到过各种图片加密的游戏,想解密却一直无从下手,不会ida,不会动态调试,不会c语言,不会英文。所以一直不能突破。最近遇到大神指点,终于 解出一款加密图片,整理下 分析过程,和学到的知识,第一次发帖,请多多关照!!!
   
   ak 打开软件 发现是cococs游戏,并且资源文件里面全是mp3,没有图片,拖入010里面发现没有模数,是被加密了! 并且文件命名是0到60 http://www.pd521.com/forum.php?mod=image&aid=1805&size=300x300&key=09fa0eeae69bf42d&nocache=yes&type=fixnone,想到肯定是在一个循环解密。
   1 先想到hook fopen 函数 找到文件操作的地方肯定有解密代码,写了半天hook 发现 只能hook到UserDefault.xml 资源文件全都hook 不到。
   2 参考各路大牛的分析 知道, cocos2dx的图片资源加载, 是在Image::initWithImageData(const unsigned char * data, ssize_t dataLen) 函数, 按照函数名称顾名思义:用数据初始化Image, 好了, 在ida 给这个函数下个断点, 先看看这个传进来的datahttp://www.pd521.com/forum.php?mod=image&aid=1806&size=300x300&key=793a3d2a26472263&nocache=yes&type=fixnone而且这个地址的内容跟上面打开看到的完全不一样, 再再而且, 前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的魔数.pnghttp://www.pd521.com/forum.php?mod=image&aid=1807&size=300x300&key=22d9d4065fcdf5c4&nocache=yes&type=fixnone
知道解密算法了, 怎么把图还原出来?很简单, 照着这个函数写一个c函数, 读文件进内存, 调这个函数解密, 就可以了
[mw_shl_code=c,true]
#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
                                        ^ (v10 + v11);
                        ++v11;
                } while (v11 < size / 4);
      }

      v12 = size % 4;
      if (size % 4 >= 1) {
                v13 = (int) ((char *) newfileData + size - 1);
                v14 = (int) &fileData;
                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;
}
第一次发帖,基本参考别人,代码很挫,请多多包涵。

sndncel 发表于 2015-11-14 05:38:33

谢谢分享。。。。进来学习一下呀。

skyun1314 发表于 2017-2-10 19:09:47

sndncel 发表于 2015-11-14 05:38
谢谢分享。。。。进来学习一下呀。

谢谢捧场

边缘浪子 发表于 2018-4-10 20:01:41

谢谢分享。。。。进来学习一下呀。
页: [1]
查看完整版本: cocos2d图片资源的解密