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

#include

#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

哈哈哈

android图片资源加密解密,[原创]cocos2d游戏图片资源解密相关推荐

  1. Android报加密错误,(原创)高通MSM8909+Android 8.1.0 FDE全盘加密失败分析记录

    Author: Jimmy Chen Version: v1.0 Date:2018-04-13 最近在MSM8909+Android 8.1.0上熟悉高通平台的相关开发.在尝试进行FDE全盘机密的时 ...

  2. android图片资源加密解密,Android下资源图片的加密和解密

    apk文件使用解压工具就能看到drawable等资源,但是有些游戏中的图片资源却是无法看到的. 这个问题探索了许久-- [1]图片资源不放置在drawable文件下,放在assets中(但是解压apk ...

  3. cocos2dx 图片资源加密解密

    转载自:http://www.taikr.com/article/600 下面就和大家来共享一下cocos2dx 图片资源加密解密的方法,如果对这个方法有疑问或者完善可以到社区里面发帖,来和大家一起进 ...

  4. Cocos2d-x利用xxtea进行图片资源加密

    在Cocos2d-x开发中,需要对图片资源加密,可以用xxtea,加密解密都行,密钥由自己来决定.思路就是事先把图片资源加密,然后在程序中使用的时候,在加载资源处先解密再使用. Cocos2d-x已经 ...

  5. cocos2d游戏jsc文件格式解密,SpideMonkey大冒险

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍cocos2d游戏中常用的jsc格式文件的解密." 01 - 在破解游戏应用中,经常会碰到后缀为jsc的文件,这是基于coco ...

  6. Android RSA加密解密

    转载: http://blog.csdn.net/bbld_/article/details/38777491 概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素 ...

  7. Android RSA加密解密的 工具类的使用

    RSA 比较特殊,我们首先要生成私钥和公钥,然后在加密的时候,使用私钥加密,在解密的时候使用公钥解密. //RSA 的初始化,获得私钥和密钥public void rsaInit(){try {Key ...

  8. cocos2d-html5游戏图片资源选择

    cocos2d-html5游戏图片资源能够选择,单张的图片作为一个精灵或者场景的载入对象.也能够把图片给做成plist文件.通过plist来訪问图片资源.其中优缺点.使用方式在个人的測试其中体现例如以 ...

  9. Android RSA加密解密,用于和服务器交互时的请求

    概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数 ...

最新文章

  1. Vista光线效果photoshop教程
  2. 第二阶段团队项目冲刺第七天
  3. Resnet的pytorch官方实现代码解读
  4. 将JAVA编译为EXE的几种方法
  5. P4414 [COCI2006-2007#2] ABC(python3实现)
  6. 30.Qt的内存管理
  7. python tkinter进度条_在python tkinter中Canvas实现进度条显示的方法
  8. python创建树_python – 从SQLalchemy中的自引用表创建树
  9. [饭后算法系列] 数组中和非负的最长子数组
  10. 深入理解jQuery中的Deferred
  11. (转)贝莱德,从0到6万亿
  12. 成人高考自考资讯网源码 织梦dedecms模板
  13. mac下的svn工具——Versions使用详解
  14. 阿里云常用产品汇总及解释
  15. Python比较文本相似度的7种方法(详细)
  16. nodejs (usb)连接打印机 获取打印状态(escpos-printer和node-escpos)检测USB端口的热插拔
  17. Android小Demo——绘制小机器人
  18. OPC UA IO模块对工业物联网的影响
  19. 20届春秋招数据分析面筋分享
  20. 业内人士来说一下炫云渲染和渲染100云渲染使用真实感受吧

热门文章

  1. Excel在统计分析中的应用—第十二章—回归分析与预测-运用LINEST函数进行多元线性回归分析
  2. 增量学习简介(incremental learning)
  3. 开源SWD脱机烧录器-第一章 软硬件配置及其初始化
  4. 重庆大学计算机在职研究生,重庆大学在职研究生招生学院_重庆大学在职研究生_学校查找_在职研究生教育信息网...
  5. python 日程(待办事项) 提醒简单小程序——基于Timer和tkinter
  6. 小米android隐藏游戏,MIUI8小米手机开启隐藏选项
  7. java基于ssm+vue的乒乓球室收费系统
  8. [OpenStack] Linuxbridge 的Permission Denied故障调查
  9. python分析红楼梦中人物形象_《红楼梦》主要人物形象分析
  10. 面试题:460道Java后端面试高频题答案版「模块九:Spring」