C语言 解压华为固件的实例代码
本文导语: 代码如下:/*####################################################################### 文件 : unpack_update.c# 作者 : Michellgaby(vincent.18023962826@gmail.com)# 说明 : 解压缩华为的'UPDATA.APP'官方系统包.## 创...
/*#####################################################################
#
# 文件 : unpack_update.c
# 作者 : Michellgaby(vincent.18023962826@gmail.com)
# 说明 : 解压缩华为的'UPDATA.APP'官方系统包.
#
# 创建时间 : 2013年1月22号 -Michellgaby
#
#####################################################################*/
#include
#include
#include
#define MAXLEN 10240
void usage();
int main(int argc,char *argv[])
{
int count,packetLength,dataLength,olddataLength,datasum,line,remainder,*Length;
char *FILENAME,*OUTNAME;
char int2char[10];
unsigned char buffer[MAXLEN];
FILE *INFILE,*OUTFILE;
//获取输入的参数
if(argc == 1)
FILENAME="UPDATE.APP";
else
FILENAME=argv[1];
//用二进制打开输入文件
if((INFILE = fopen(FILENAME, "rb")) == NULL) usage();
//创建文件夹并进入目录
mkdir("output");
chdir("output");
//跳过92空字节
fseek(INFILE, 92, 0);
for(count=1;INFILE != NULL;count++)
{
//判断是否为华为固件索引头
fread(buffer, 4, 1, INFILE);
if(buffer[0] != 0x55) break;
if(buffer[1] != 0XAA) break;
if(buffer[2] != 0x5A) break;
if(buffer[3] != 0xA5) break;
//获取头文件长度
fread(buffer, 4, 1, INFILE);
Length = (int *)buffer;
packetLength=*Length;
//跳过16字节
fseek(INFILE, 16, 1);
//获取内容长度
fread(buffer, 4, 1, INFILE);
Length = (int *) buffer;
dataLength=*Length;
//把整数和字符串连接并复制给文件名
itoa(count, int2char, 10);
OUTNAME=strcat(int2char, ".img");
//跳到头文件末尾
fseek(INFILE, packetLength-28, 1);
//创建文件
if((OUTFILE = fopen(OUTNAME, "wb")) == NULL)
{
printf("Unrecognised file format. Wrong identifier.n");
return -1;
} else printf("Extracted output/%sn",OUTNAME);
//把内容数据分成多个部分
datasum=dataLength/MAXLEN;
for(line=0;line
您可能感兴趣的文章:
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。