C/C++ 电脑微信dat文件解密及工具分享
(2)解密代码:打开dat文件→读取数据→判断文件类型→异或解密→写入数据到新文件
//可扩展并使用数据结构存储 #define JPG1 0xFF #define JPG2 0xD8 #define PNG1 0x89 #define PNG2 0x50 #define BMP1 0x42 #define BMP2 0x4D #define GIF1 0x47 #define GIF2 0x49 //代码可优化(sXor作为加密key值是唯一的,成功一次即可计算出key值,后续解密时无需反推计算) bool DecryptDatFile(CString &strEncrypt, CString &strDecrypt) { string strInPath = strEncrypt.GetString(); string strOutPath = strDecrypt.GetString(); //以二进制方式打开文件 FILE* fp;//文件指针 if((fp=fopen(strInPath.c_str(), "rb")) == NULL) { //MessageBox("dat文件打开失败,请检查路径及文件", "提示", MB_ICONWARNING); return false; } //获取图像数据总长度 fseek(fp, 0, SEEK_END); int nLength = ftell(fp); rewind(fp); //根据图像数据长度分配内存buffer char *pImgBuffer = (char*)malloc(nLength * sizeof(char)); fread(pImgBuffer, nLength, 1, fp);//将图像数据读入buffer fclose(fp); //判断图片类型,并获取异或值 short sXor = 0; short sFirst = pImgBuffer[0]; short sSecond = pImgBuffer[1]; //CString strType; if((sFirst ^ JPG1) == (sSecond ^ JPG2))//jpg { sXor = sFirst ^ JPG1; strOutPath += ".jpg"; //strType = "jpg格式"; } else if((sFirst ^ PNG1) == (sSecond ^ PNG2))//png { sXor = sFirst ^ PNG1; strOutPath += ".png"; //strType = "png格式"; } else if((sFirst ^ GIF1) == (sSecond ^ GIF2))//gif { sXor = sFirst ^ GIF1; strOutPath += ".gif"; //strType = "gif格式"; } else if((sFirst ^ BMP1) == (sSecond ^ BMP2))//bmp { sXor = sFirst ^ BMP1; strOutPath += ".bmp"; //strType = "bmp格式"; } else { //MessageBox("dat文件识别失败", "提示", MB_OK); free(pImgBuffer); return false; } //异或解密 for(int i=0; i<nLength; i++) { pImgBuffer[i] ^= sXor; } //以二进制方式写入文件 if((fp=fopen(strOutPath.c_str(), "wb")) == NULL) { //MessageBox("解密文件保存失败,请检查路径", "提示", MB_ICONWARNING); free(pImgBuffer); return false; } fwrite(pImgBuffer, nLength, 1, fp);//从buffer中写数据到fp指向的文件中 fclose(fp);//关闭文件指针 free(pImgBuffer);//释放buffer内存 return true; }
上一篇:
uniapp开发微信小程序-2.页面制作