用c语言如何解压字符串,C语言 解压华为固件的实例代码

本文介绍了一款用于解压华为官方系统包'UPDATA.APP'的C语言程序。该程序能够读取固件文件,并将其分解为多个.img文件,方便用户进一步分析或使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*#####################################################################

#

#   文件          : 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/%s\n",OUTNAME);

//把内容数据分成多个部分

datasum=dataLength/MAXLEN;

for(line=0;line <= datasum;line++)

{

//获取内容数据

if(datasum == line)

fread(buffer, dataLength % MAXLEN, 1, INFILE);

else

fread(buffer, MAXLEN, 1, INFILE);

//输出文件

if(datasum == line)

fwrite(buffer, dataLength % MAXLEN, 1, OUTFILE);

else

fwrite(buffer, MAXLEN, 1, OUTFILE);

}

//关闭输出文件

fclose(OUTFILE);

//指针取整,4的倍数

remainder = 4 - (ftell(INFILE) % 4);

if (remainder < 4)

{

//进行填充剩余的字节

fseek(INFILE, remainder, 1);

}

}

//关闭输入文件

fclose(INFILE);

return 0;

}

void usage()

{

//帮助函数

printf("uasge: unpack_update.exe [UPDATE.APP|UPDATA.APP]\n");

exit(0);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值