C/C++ 电脑微信dat文件解密及工具分享

2023-05-16

1、前言
  最近想整理下照片(回忆 ^ _ ^ 怀旧),以前也知道在微信pc端聊天时,图片、视频、文档等文件会缓存在一个目录下(电脑微信→左下角三条杠→设置→文件管理),点击按钮“打开文件夹”快速访问,文件基本都存储在“FileStorage”文件夹中,本文重点在于解密“Image”文件夹中被加密的dat文件。
在这里插入图片描述


2、工具介绍
  使用VS2010 MFC编写,支持选择单个文件转换及选择文件夹批量转换,一般都是选择目录/路径/文件夹进行批量转换。【注】在Windows XP下软件打开失败。
(1)工具界面截图
在这里插入图片描述

(2)阿里云盘链接:下载 提取码: i5j9


3、分析
  在网上搜索相关资料时了解到,电脑端微信对接收到的图片中的每一个字节进行了异或加密计算(即异或某一个固定值,这个值不知道,需要尝试计算反推出来),再将转换后的字节存储在以dat为后缀名的文件中,至此图片被加密了,无法直接双击查看图片,失去了它本身的色彩。
(1)异或原理:异或百度百科
  我们所常见的jpg、png、bmp、gif等格式图片都有其固定的存储方式(如jpg格式图片以FF D8开头),可以使用文本编辑器Notepad++打开图片,然后点击编辑器上方工具栏最后面的“H”,即以十六进制展示文件内容,如下图所示:
文件16进制内容

在这里插入图片描述

在这里插入图片描述

(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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++ 电脑微信dat文件解密及工具分享 的相关文章

  • 在嵌入式里面实现printf()类似的功能

    学习C语言大多数都是从printf 34 hello world 34 开始的 xff0c 对于printf的熟悉程度最高 xff0c 在嵌入式编程中 xff0c 实现printf函数有一种很标准的办法就是实现putch xff0c 绑定对
  • 我的第一个rust程序,感受一下

    周末了 xff0c 要学习一点让自己开心的东西 听说rust语言很年轻 xff0c 性能超过了C 43 43 xff0c 还能支持嵌入式编程 xff0c 作为一名未来要出名的代码工程师 xff0c 岂能错过 xff1f 于是上周开始学习这个
  • 走进他人内心的七项修炼

    本文是一篇读书笔记 xff0c 书名叫 我就是你啊 之所以看这本书 xff0c 是因为在结婚之后 xff0c 发现很多时候会吵架 xff0c 会发现自己情绪不好 xff0c 然后无能为力去解决 让我们来回顾一下 xff0c 化解一场纷争需要
  • 使用优先队列解决自己构造的数据类型

    在C 43 43 中优先队列有两种 xff0c 最大堆和最小堆 当数据类型为int的时候 xff0c 大家都会使用 xff0c 但是如果数据不是单一的 xff0c 比如数据是一个hashmap怎么办 xff1f 例子如下 xff1a You
  • curl header设置Authorization

    文章目录 场景解决 场景 接口设置了tymondesigns jwt auth 认证 xff0c 所以需要在请求的头部放置authorization 信息 解决 参考curl 官网 code class prism language php
  • python subprocess.Popen read阻塞问题解决

    python subprocess Popen read阻塞问题解决 背景 使用subprocess Popen打开一个子进程 xff0c 指定子进程的标准输入 xff0c 标准输出为subprocess PIPE xff0c 使用stdo
  • stm32 串口发送一帧数据(字符串版本和结构体版本)

    使用stm32串口发送一帧数据 具体程序如下 xff0c 相关知识点请自行脑补 1 串口发送字符串 发送一个字节 myUSARTx xff1a 具体串口 ch 一个8位的字节 void Debug SendByte USART TypeDe
  • 【通信总线】CAN 总线简介及应用

    CAN总线简介及应用 一 CAN总线简介二 CAN总线报文格式2 1 数据帧区分2 2 标准帧 11位2 3 扩展帧 29位 三 CAN测试工具四 CAN总线报文处理五 CAN应用 一 CAN总线简介 简单来说 xff0c CAN最早是由德
  • 【Linux---NX】基于Xavier NX模组安装Paho-MQTT C库及Json库并在ROS功能包中调用

    基于Xavier NX模组安装Paho MQTT C库及Json库并在ROS功能包中调用 一 系统环境二 Json 库下载编译三 Paho C库下载编译四 ROS中调用Paho C库及Json库 一 系统环境 Ubuntu 18 04 43
  • 【STM32---IAP】基于CAN总线的BootLoader上下位机设计

    IAP开发 下位机STM32 43 上位机Linux 一 准备工作二 IAP系统开发2 1 IAP简介2 2 IAP下位机开发2 2 1 刷写文件选择2 2 2 Bootloader程序框架2 2 3 Bootloader程序开发2 2 3
  • 【STM32---传感器】基于状态机机制实现多路超声波传感器数据采集及异常检测

    一 超声波传感器介绍 1 1 测距原理 xff08 1 xff09 采用IO口TRIG触发测距 xff0c 给至少10us的高电平信号 xff08 2 xff09 模块自动发送8个40khz的方波 xff0c 自动检测是否有信号返回 xff
  • 【STM32---任务调度】裸系统下的时间片轮询机制

    一 任务调度 众所周知 xff0c 实时多任务操作系统 xff08 RTOS xff09 是嵌入式应用软件的基础和开发平台 xff0c 因其简单易用 开源等优点被大多数嵌入式开发者使用 xff0c 但是在一些简单 实时性要求比较强的情况下
  • 【日志工具】g3log_4_API接口描述

    API描述 使用g3log所需的大部分API都在本文件中进行了描述 xff0c 有关更多API文档和示例 xff0c 请继续阅读 API readme xff0c 你会找到一些例子如这里所示 xff1a 日志API LOG调用 LOG调用可
  • 【日志工具】g3log_5_自定义log格式

    自定义日志格式 重载默认文件接收器的文件头 默认文件头可以在默认文件接收器中自定义 FileSink overrideLogHeader std string 重载默认文件接收器的日志格式 默认的日志格式是在LogMessage hpp s
  • 【日志工具】g3log_6_ROS1中g3log的安装&使用

    ROS1中g3log的安装 amp 使用 基于ros1 melodic版本进行封装使用 g3log库安装 git clone https span class token operator span span class token com
  • nginx负载均衡 upstream ip_hash的用法

    文章目录 场景参考文档用法 场景 负载均衡解决session共享的问题 参考文档 nginx org upstream 用法 语法 Syntax ip hash Default Context upstream 说明 Specifies t
  • ros 播放激光雷达数据包,rviz可视化

    通过bag文件记录话题消息 当发布话题的节点运行后 xff0c 可以通过rostopic list 列出当前 运行的话题 xff0c 然后记录 xff1a mkdir bagfile cd bagfile rosbag record a 记
  • TIM2_CH1_ETR可以当做TIM2_CH1来用

    TIM2 CH1 ETR可以当做TIM2 CH1来用 在stm32中文参考手册8 3 7定时器复用功能重映射小节可以看到这样的描述
  • hal库LTDC的层数判断应为<而不是<=

    LTDC的层数判断为 IS LTDC LAYER LAYER LAYER lt 61 MAX LAYER 假设MAX LAYER 61 2 xff0c 则LAYER等于2时也满足条件判断 但在配置寄存器时 xff0c 寄存器的地址依靠 la
  • 【无标题】

    hal库 SD卡总线宽度设置8不支持 xff0c 但还是保留了设置总线宽度为8的宏定义 HAL SD ErrorTypedef span class token function HAL SD WideBusOperation Config

随机推荐

  • 【无标题】

    发现一个问题 使用HAL库中的这个类型定义变量 xff0c 但不使用的话居然不会报警告 就是它 xff1a DMA HandleTypeDef
  • 【无标题】

    勘误 xff1a stm32F4xx参考手册中 34 11小节FIFO框架图中 最上面的DIEPTXF2 31 16 应为DIEPTXFn 31 16
  • HttpURLConnection高阶使用之kerberos认证解决方案

    1 HttpURLConnection 简介 sun net www protocol http HttpURLConnection是jdk中默认执行请求时使用 此HttpURLConnection 支持多种权限认证方案 xff0c Neg
  • 下篇 | 开发板AMR接收虚拟机Ubuntu传来的文件

    上篇笔记 xff1a 虚拟机Ubuntu向开发板AMR传送文件 已经做好了虚拟机向开发板传送文件的笔记啦 xff0c 然后有发送肯定有接收的 xff0c 不然就发空气啦 xff01 接下来 xff0c 写开发板如何接受虚拟机发送过来的文件的
  • 解决QT->setText()中文出现乱码问题,使用QString或者tr()均出现乱码。

    微软VC编译器源代码使用GB2312编码进行保存 源码中的汉字字符串在生成可执行文件的过程中被转换成了本地编码 Qt内部是使用Unicode编码 xff0c 即QString保存的是Unicode编码的字符串 Qt内部需要使用Unicode
  • Qt 下载图片并显示图片

    源码下载 xff1a 图片下载器 include 34 mainwindow h 34 include 34 ui mainwindow h 34 include lt QHostAddress gt include lt QDebug g
  • 海康威视 web3.0开发 常见错误 404,403

    海康威视 web3 0开发 常见错误 404 xff0c 403 配置情况 IE 浏览器 43 nginx 43 thinkPHP5 0 43 海康威视200万星光级红外球机1080P变焦云台球机DS 2DC4223IW D 关于如何使用网
  • 虚拟USB设备总结

    开发环境 xff1a windows 首先来总结最近研究的虚拟USB设备 xff0c 进而虚拟USB键盘成功了 xff0c 开心 xff01 得出了一个C S框架 xff0c 首先说一下客户端 客户端有两个部分 xff0c 用户空间工具和底
  • C#Winform:《DataGridViewComboBoxCell值无效》解决方案

    值无效 xff0c 可能是你下拉框选项 xff0c 没有这样的值 xff0c 而你却设置这个值 dataGridView1 Rows i Cells 1 Value 61 Hello World 解决方法就是在窗体的构造函数里添加如下代码
  • FFmpeg笔记

    1 下载 xff0c 配置 FFmpeg官网 xff1a https ffmpeg org 用的系统是Ubuntu18 04 所以直接apt get就可以了 sudo apt get install ffmpeg 2 简介 xff0c 上手
  • 《WPF中TextBox绑定Double类型数据,文本框不能输入小数点》解决方案

    在App cs文件里面 xff0c 重写OnStatup xff0c 添加下面一条语句即可 span class token keyword public span span class token keyword partial span
  • stm32 HAL库串口收发-中断接收DMA发送不定长数据

    使用的时候发现 xff1a 接收完一个字节立即用DMA的方式发送出去 xff0c 会出现数据的丢失 xff0c 如用串口调试助手发送1234 xff0c 返回的只有13 目前只能用缓存buf 43 协议结束 xff08 如0x0d 0x0a
  • headers Authorization

    var auth 61 96 host user host pass 96 const buf 61 Buffer from auth 39 ascii 39 strauth 61 buf toString 39 base64 39 con
  • 平衡车入门---MPU6050陀螺仪的使用

    平衡车入门 MPU6050陀螺仪的使用 一 MPU6050简介二 学习MPU6050的步骤三 I2C协议简介四 MPU6050硬件介绍五 MPU6050的几个重要寄存器六 原始数据的单位换算七 角度换算 滤波算法 一 MPU6050简介 M
  • C++ 为什么基类的析构函数要声明为虚函数

    1 为什么声明基类析构函数为虚函数 xff1f xff08 1 xff09 基类指针 指向 基类对象 xff1a 不用考虑基类析构函数是否声明为虚函数 xff08 2 xff09 基类指针 指向 派生类对象 xff1a 若基类析构函数不为虚
  • std::map find和count效率测试

    1 简介 在使用标准模板库中的map容器且遇到键值对的值为自定义struct或class类型时 xff0c 考虑到特殊场景 xff08 即不能确保key自始至终唯一 xff09 xff0c 若插入新元素 xff08 new 对象 xff09
  • 随机生成8位长字符串(大小写字母及数字组合)

    1 简要说明 项目上开发要用到随机生成一个8位长的字符串 xff08 类似Java工具类中的UUID xff09 xff0c 作为id来对同一事物的不同个体进行唯一标识 xff0c 如同一个班级里学生名字几乎不同 xff0c 偶尔会有重复
  • C++引用和指针区别

    1 C 43 43 引用和指针区别 xff1a 指针是一个新的变量 xff0c 指向另一个变量的地址 xff0c 我们可以通过访问这个地址来修改另一个变量 xff1b 而引用是一个别名 xff0c 对引用的操作就是对变量的本身进行操作指针可
  • TCP/UDP端口号

    大家好呀 xff0c 我是请假君 xff0c 今天又来和大家一起学习数通了 xff0c 今天要分享的知识是TCP UDP端口号 在IP网络中 xff0c 一个IP地址可以唯一地标识一个主机 但一个主机上却可能同时有多个程序访问网络 要标识这
  • C/C++ 电脑微信dat文件解密及工具分享

    1 前言 最近想整理下照片 xff08 回忆 怀旧 xff09 xff0c 以前也知道在微信pc端聊天时 xff0c 图片 视频 文档等文件会缓存在一个目录下 xff08 电脑微信 左下角三条杠 设置 文件管理 xff09 xff0c 点击