zoukankan      html  css  js  c++  java
  • C语言 解压华为固件

    这是解压华为固件(update.app)的C语言。。其实这也是我翻115翻出来的。。。

    /*#####################################################################
    #
    #   文件          : 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.
    ");
                return -1;
            } else printf("Extracted output/%s
    ",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]
    ");
        exit(0);
    }
  • 相关阅读:
    AngularJs 与Jquery的对比分析,超详细!
    身份证号验证,获取户口地址、性别、出生日期
    前端面试·
    页面可见性(Page Visibility API) 可以有哪些用途?
    webSocket如何兼容低浏览器?(阿里)
    如何实现浏览器内多个标签页之间的通信?
    HTML5的form如何关闭自动完成功能?
    Label的作用是什么?是怎么用的?
    cookies,sessionStorage 和 localStorage 的区别?
    浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?
  • 原文地址:https://www.cnblogs.com/GentlemanMod/p/3272580.html
Copyright © 2011-2022 走看看