/*
* =====================================================================================
*
* Filename: cpbtool.c
*
* Description: 一个分解酷派刷机文件.cpb文件的程序
*
* Version: 1.0
* Created: 2013年05月07日 18时55分53秒
* Revision: none
* Compiler: clang
*
* Author: linkscue (scue),
* Organization: 不告诉你。
*
* =====================================================================================
*/ #include <stdio.h>
#include <stdlib.h> #define u8 unsigned char
#define u32 unsigned int
#define u16 unsigned short typedef struct {
u8 cp_magic[]; /* coolpad file magic */
u8 cp_version[]; /* coolpad head version */
u8 model[]; /* coolpad phone model */
u8 flag_p2[]; /* alway is P2 string */
u8 version[]; /* phone version or rom name */
u8 file_form[]; /* where the rom come from */
u8 information[]; /* some information, but unkown */
u32 image_offset; /* entrance offset of image */
u32 cpb_filesize; /* the size of whole cpb file */
u8 reverse[]; /* never use, remain for future */
u32 checksum; /* here maybe is a checksum */
} cpb_head; typedef struct { /* 76 bytes */
u8 filename[]; /* image filename */
u32 image_offset; /* image offset */
u32 image_size; /* image filesize */
u32 checksum; /* here maybe is a checksum */
} image_t; //分解文件函数;
void splitFile(char *file){ FILE *fd = NULL;
FILE *ft = NULL;
int i=,imagecount=;
cpb_head header;
image_t images[];
printf("\n");
printf("Welcome to use unpackcpb tool by scue@ATX(bbs.anzhi.com), 2013-05-09, weibo.com/scue.\n");
printf("\n"); if ( (fd=fopen(file,"rb")) == NULL ) { /* 打开文件进行操作 */
printf ( "Extract cpb file, open %s failure!\n", file );
exit();
} fread(&header, sizeof(header), , fd);
for ( i=; ( ftell(fd) < (header.image_offset) ); i++ ){
fread(&images[i], sizeof(image_t), , fd);
imagecount++;
}
//开始解压数据;
int size=,n=,count=,offset=;
unsigned char imagename[]="";
unsigned char buffer[]=""; /* 创建缓冲区 */
for( i=; i < imagecount; i++ ){
strncpy(imagename, images[i].filename, sizeof(imagename));
/*-----------------------------------------------------------------------------
* 从这里开始,不同的酷派手机,
* 可能会被穿插入一部分未知的字节数,要视情况对offset的值进行修改,
* 提示一点,所有的Android手机,boot.img的MAGIC必须是‘ANDROID!’。
*-----------------------------------------------------------------------------*/
offset=images[i].image_offset;
size=images[i].image_size;
if ( size != ) {
if ( ( ft=fopen(imagename,"wb") ) == NULL ){
printf("Extract cpb file, open %s failure!\n",imagename);
}
fseek( fd, offset, SEEK_SET); /* 跳转至数据段 */
printf("Extract: %-15s offset: 0x%08x size: %d\n",imagename, offset, size);
n=;count=;
while ( count < size ) {
n = fread(buffer,, sizeof(buffer), fd);
fwrite(buffer, n, , ft);
count+=n;
}
}
}
fclose(fd);
// printf("Extract cpb file done!\n");
} /*
* === FUNCTION ======================================================================
* Name: main
* Description: 仅分解.cpb文件,不含重新制作.cpb文件的部分
* 在一些酷派手机固件中,官方会把文件结尾的一部分内容,穿插至cpb文件中
* 穿插的部分字节不确定,所以要视不同的酷派手机固件重写这个cpbtool.c程序
* =====================================================================================
*/
int main ( int argc, char *argv[] )
{
if (argc==) {
printf("usage:%s cpb file.\n", argv[]);
exit();
} // printf("argc is %d\n",argc);
char *cpb;
cpb=argv[];
splitFile(cpb); return EXIT_SUCCESS;
}

注:cpb文件组成结构是经过反复对比与测试得到的,分析工具:bless,测试平台:Linux。

〖Android〗酷派手机固件.cpb文件的分解程序的更多相关文章

  1. 【Android进阶】怎样使用文件来保存程序中的数据

    在程序中.有非常多保存和获取数据的方法,本篇文章,主要介绍使用文件系统对程序中的数据进行保存和读取的操作 我直接写了一个帮助类,进行文件的写入和读取操作 /** * 用于在文件里保存程序数据 * * ...

  2. [Android] 判断手机上是否安装了某个程序

    http://blog.csdn.net/xiaodongrush/article/details/9320135 1. 首先得到该程序的包名 这个连上手机ADB,看logcat就能看到.比如:QQ客 ...

  3. Mac电脑如何读取Android手机上的文件

    问题 一般Android手机用usb数据线连接到windows操作系统的电脑上后,会自动将手机存储卡以移动存储的方式显示在电脑里. 但是如果操作系统是Mac的,就没有这个存储设备.问题来了,Mac电脑 ...

  4. [转]在eclipse打开的android虚拟手机,打开File Explorer,下面是空的没有data、mnt、system三个文件

    在eclipse打开的android虚拟手机,打开File Explorer,下面是空的没有data.mnt.system三个文件 这是因为模拟器没有选择打开的缘故,必须首先打开一个模拟器(AVD), ...

  5. (转载)Mac系统下利用ADB命令连接android手机并进行文件操作

    Mac系统下利用ADB命令连接android手机并进行文件操作 标签: Mac adb android 2016-03-14 10:09 5470人阅读 评论(1) 收藏 举报  分类: Androi ...

  6. Android固件img文件的解包, 修改和打包的命令行操作

    Android固件img文件的解包打包 To Unpack-Modify-Pach the system.img, I have followed the following procedure: a ...

  7. &quot;CoolReaper&quot; --酷派手机后门

    文章转自:http://drops.wooyun.org/tips/4342 注:译文未获得平底锅授权,纯属学习性质翻译 原文:https://www.paloaltonetworks.com/con ...

  8. Android之手机向导以及设置中心模块的开发

    当我们使用的新的软件的时候,我们首先需要教用户如何使用我们的软件,当用户学习完使用教程,下次再登录的时候,我们应该直接跳到我们的功能界面,下面我来展示一下我学习视频做的效果图:手机防盗这个功能模块就是 ...

  9. Android学习笔记之Drawable 文件夹

    PS:最近闲着无聊..模仿去写个QQapp..效果还不错..并且从中又学习到了一些相关的东西,在这里进行一些相关总结.. 学习内容: Android 中 Drawable 文件夹内部相关属性..   ...

随机推荐

  1. 淘宝海量数据库之八-攻克随机IO难关 -----阿里正祥的博客

    http://blog.sina.com.cn/s/blog_3fc85e260100qwv8.html

  2. UI----------------Toggle

    Is On:是否已经勾选上了 Toggle Transition:渐变效果 Graphic:勾选标志的图,就是那个勾 Group:多选组 On Value Changed:当选项改变时,触发事件 多选 ...

  3. 禁用IE缓存

    HTTP消息报头包括普通报头.请求报头.响应报头.实体报头. 普通报头中的Cache-Control用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的 ...

  4. waitdialogform z

    namespace DevExpress.Utils { using DevExpress.LookAndFeel; using DevExpress.Skins; using DevExpress. ...

  5. 算法:哈希表格(Hash Table)

    背景 Java 和 .Net 平台都有一个所有引用类型都会间接或直接继承的类型:Object,这个类型提供最基本的相等性比较算法和哈希算法,很多书上都给出了在重写这两个算法的时候的主意事项,其中大多数 ...

  6. Java中List效率的比较

    Java Collections Framework(JCF) 是Java SE中一个基本的类集,几乎所有的项目都会用到,其中的List 则是JCF中最最常用的一个接口.围绕List 接口,有很多实现 ...

  7. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  8. 学习笔记:A*算法

    简易地图 如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个的小方 ...

  9. QT QCharts QScatterSeries 空心点阵图,鼠标移动到上面显示数值,鼠标移开数值消失

    在最近接到的需求是这样的,画一个折线图,关键点使用空心的圆点标识出来,鼠标移动到关键点上,显示出当前数值:鼠标移走数值消失. 我们遇到这个需求的时候,第一时间就会想到使用 QLineSeries 画折 ...

  10. window安装Scrapy———解决报错问题

    系统是WIN10 64位Python是3.5.2今天安装pip install Scrapy  来安装发现报错Microsoft Visual C++ 14.0 is required 检查发现电脑中 ...