源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C语言 解压华为固件的实例代码

  • 时间:2020-12-27 16:39 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C语言 解压华为固件的实例代码
[u]复制代码[/u] 代码如下:
/*##################################################################### # #   文件          : unpack_update.c #   作者          : Michellgaby(vincent.18023962826@gmail.com) #   说明          : 解压缩华为的'UPDATA.APP'官方系统包. # #   创建时间      : 2013年1月22号 -Michellgaby # #####################################################################*/ #include<stdio.h> #include<stdlib.h> #include<string.h> #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); }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部