微信图片解码

微信图片解码原理与代码

bool WxImageDecode(string filename)
{
	//微信图片解密原理:
	//1、所有微信图片都是通过加密后保存为.dat格式;
	//2、获取.dat文件前2个字节,将该值与0xd8ff进行异或(^)计算,如结果高低字节相同,则代表原图为jpg格式(jpg以0xff 0xd8开头);
	//将该值与0x5089进行异或计算,如结果高低字节相同,则代表原图为png格式(png以0x89 0x50开头)。
	//3、取结果的高位(高低位一样,例如0xc0c0,取c0即可),将高位字节逐一与.dat文件所有字节进行异或计算,得到的结果即为图片数据,
	//保存到文件即可。
	unsigned char* key;
	unsigned char byte;
	unsigned short value, value2;
	char* jpegData;
	ULONGLONG jpegLen;
	BOOL ret;
	CFile file;
	ret = file.Open(filename.c_str(), CFile::modeRead | CFile::typeBinary);
	if (!ret)
		return false;
	//申请一块空间,存放解密后的图片数据
	jpegData = new char[file.GetLength()];
	ZeroMemory(jpegData, file.GetLength());
	//读取源文件开头2个字节
	ret = file.Read(&value, 2);
	key = (unsigned char*)&value2;
	do
	{
		//编码前是jpg格式
		value2 = value ^ 0xd8ff;
		if (key[0] == key[1])
			break;
		//编码前是png格式
		value2 = value ^ 0x5089;
		if (key[0] == key[1])
			break;
		//其他情况
		delete[]jpegData;
		file.Close();
		return false;
	} while (0);
	//移动指针到文件开头
	file.SeekToBegin();
	//遍历文件,将文件所有字节与加密字符(key[0])进行异或计算
	jpegLen = 0;
	while (true)
	{
		ret = file.Read(&byte, 1);
		if (ret < 1)
			break;
		jpegData[jpegLen] = byte ^ key[0];
		jpegLen++;
	}
	file.Close();

	if (jpegLen > 0) {
		//修改后缀,解码图片与源文件同名
		int pos = filename.find("dat");
		filename.replace(pos, 3, "png");
		//将解码后的数据写入新文件
		ret = file.Open(filename.c_str(), CFile::modeWrite | CFile::typeBinary | CFile::modeCreate);
		if (ret) {
			file.Write(jpegData, jpegLen);
			file.Close();
			delete[]jpegData;
			return true;
		}
	}
	delete[]jpegData;
	return false;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值