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;
}
经验分享 程序员 微信小程序 职场和发展