怎么把hex文件的数据反编译为C语言

请教各位兄弟,怎么把hex文件的数据反编译为C语言,我之前用过ida按着网上查的方法做过,没能成功,不知道哪里出了问题,请各位兄弟赐教一下,十分感谢。

使用反汇编器可以将机器代码(即hex文件中的数据)转换为汇编语言,然后您可以使用反汇编语言到C语言的翻译工具来实现反编译

大部分工具,反汇编效果都很差强人意,更何况反编译为C,建议先根据反汇编代码,弄清楚程序功能,然后人工C

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 嵌入式--Hex文件总结:Hex文件格式,Hex文件转bin文件中的 使用C语言将Hex文件转成Bin文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    bool ReadHexLineData(HexFormatForLine* out,const QByteArray &ba)//false: 校验错误 true:校验成功
    {
         unsigned char i,checkoutCal=0;
    
        //计算校验值
         for(i=0;i < ba.size()-1;i++){
            checkoutCal += (unsigned char)ba.at(i);
         }
         checkoutCal = 0x100-checkoutCal;
         //获取个部分域的值
         out->datalen =(unsigned char)ba.at(0);
         out->addr = ((unsigned char)ba.at(1)<<8)|(unsigned char)ba.at(2);
         out->datatype = (unsigned char)ba.at(3);
         memset(out->databuf,0,sizeof(out->databuf));
         for(i = 0;i<out->datalen;i++){
            out->databuf[i] = (unsigned char)ba.at(4+i);
         }
         out->checkout = (unsigned char)ba.at(4+i);
    #if  0 //调试时打开
         qDebug("datalen=%X",out->datalen);
         qDebug("addr=%X",out->addr);
         qDebug("datatype=%X",out->datatype);
         qDebug("checkout=%X",out->checkout);
         qDebug("checkoutCal=%X",checkoutCal);
    #endif
        //比较读取的校验值和计算的校验值是否一致
        if(checkoutCal == out->checkout){
            return true;
        }
        return false;
    }
    
    char HexToBin(HexFormatForLine* ba,QDataStream & out)//return 0: ok  1:hex文件结束 2:hex文件有误
    {
        static unsigned int ExStageAddr = 0x00;//扩展段地址
        static unsigned int ExLineAddr = 0x00;//扩展线性地址
        static unsigned int absoluteAddrLocal = 0x00;//本地记录绝对地址
        unsigned int absoluteAddrCurrent = 0x00;//计算当前记录的绝对地址
        unsigned int Bytesskipped = 0;//被跳过的字节数
    
        switch(ba->datatype)
        {
            case 0x00://数据记录
                //计算出当前记录的绝对地址
                if(ExStageAddr != 0){
                    absoluteAddrCurrent = (ba->addr+ExStageAddr);
                }else if(ExLineAddr != 0){
                    absoluteAddrCurrent = (ba->addr|ExLineAddr);
                }else{
                    absoluteAddrCurrent = ba->addr;
                }
                //hex文件第一条数据记录时,将本地绝对地址absoluteAddrLocal同步等于当前记录的绝对地址absoluteAddrCurrent
                if(absoluteAddrLocal == 0){
                        absoluteAddrLocal = absoluteAddrCurrent;
                }
                //比较当前记录的绝对地址absoluteAddrCurrent和本地的绝对地址absoluteAddrLocal是否有偏差
                Bytesskipped = absoluteAddrCurrent-absoluteAddrLocal;
            break;
            case 0x01://文件结束记录
                return 1;
            break;
            case 0x02://扩展段地址记录
                ExStageAddr = (ba->databuf[0]<<8|ba->databuf[1])<<2;
                ExLineAddr = 0x00;
                return 0;//return ok
            break;
            case 0x04://扩展线性地址记录
                ExLineAddr = (ba->databuf[0]<<8|ba->databuf[1])<<16;
                ExStageAddr = 0x00;
                return 0;//return ok
            break;
            default:
                return 2;
            break;
        }
    
        for(unsigned int i = 0;i < Bytesskipped;i++){//被跳过的地址,填充0
            out <<(unsigned char)0x00;
        }
        if(Bytesskipped!=0){
            qDebug() <<Bytesskipped;
        }
        absoluteAddrLocal += Bytesskipped;//本地绝对地址absoluteAddrLocal累加
    
        for(unsigned int i = 0;i < ba->datalen;i++){
            out <<ba->databuf[i];
        }
        absoluteAddrLocal += ba->datalen;//本地绝对地址absoluteAddrLocal累加
    
        return 0;
    }
    
    void do_hex2bin(void)
    {
        QFile hexfile(ui->edtFileName->text());//获取hex文件路径
        // 就在原目录下生成一个bin文件
        QFile outfile(ui->edtFileName->text().replace("hex", "bin")); // 生成的目标bin文件
    
        if (!hexfile.open(QIODevice::ReadOnly)) // hex文件
        {
            qDebug("file open fail!");
            return;
        }
    
        if (!outfile.open(QIODevice::WriteOnly)) // bin文件
        {
            qDebug("file open fail!");
            return;
        }
    
        QDataStream out(&outfile);
    
        QByteArray alinedata;
        HexFormatForLine HexDataStr;
        while(!hexfile.atEnd()){//循环处理,至hex文件读完
            /*若: alinedata =QByteArray::fromHex(":12345678");
              则: alinedara ={0x12,0x23,0x45,0x78};*/
            alinedata = QByteArray::fromHex(hexfile.readLine());//从hex文件中读取一行
            bool ret = ReadHexLineData(&HexDataStr,alinedata);//将一行数据解读到HexDataStr结构体
            if(!ret){
                qDebug("校验出错,hex文件有误.");
                outfile.remove();//删除输出的bin文件
                hexfile.close();//关闭输入文件
            }
            ret=HexToBin(&HexDataStr,out);//将解读后的数据写入bin文件
            if(ret!=0){
                break;
            }
        }
        qDebug("hex2bin ok");
        hexfile.close();
        outfile.close();
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^