网上看到有dat文件破解的,不过都是java和python的,没看到有JS的
自己有了些兴致,所以打算用JS实现。平台是Node
本文按照流程来讲,方便大家理解。如果直接想要实现的代码,请拉到最后。

1. 查看加密文件

微信的dat图片文件在 xxxx/FileStorage/Image 目录下
先要查看加密的dat文件。直接打开肯定是不行的,因为里面是二进制数据,所以需要一个十六进制器打开。

如果用的是VS Code ,那就很方便了,直接 ctrl + shift + x 打开插件商店搜索 hexdump for VSCode ,用这个插件可以在VSCode上面很方便地查看文件的十六进制码:
在这里插入图片描述

然后用VScode打开文件,在文件上右键选择 Show Hexdump 就可以查看十六进制: 在这里插入图片描述
在这里插入图片描述

2. 获取异或值

微信的dat文件是如何加密的?原理很简单:是把文件内容通过某个数值进行异或操作来进行加密的,所以我们必须要计算出它的异或值。
在这里插入图片描述
JPG图片文件的开头都是 FF D8 FF E0 00 10 4A 46 49 46 所以我们可以先用 FF D8 FF 先测试计算。(大部分的文件都是jpg的,当然也有少部分存在png文件,可以多试几个dat文件)
当然不用自己计算,我们打开WIN10自带的计算器,切换到程序员模式进行十六进制的异或运算
刚才十六进制打开的文件开头是 5B 7C 5B ,所以让 5B 7C 5B FF D8 FF 进行异或运算就好了:
在这里插入图片描述
得出结果是 A4 A4 A4 显而易见,异或值是 A4(hex) 也就是说可以通过异或值和dat文件解密得到原文件了

每个人的异或值可能不一样

3. 文件解析代码

console.time('完成,耗时');
var fs = require('fs');
var xor = 'a4a4a4a4a4';   //异或值(十六进制)
xor = hexToBin(xor);
var dataPath = './0c9a14c9d42da570d3ea13466be20608.dat';    //要解密的文件路径
var resPath = './res.'; //存放路径
var xorLen = 2;
//读取文件,获取到十六进制数据
fs.readFile(dataPath, { encoding: 'hex' }, function (err, data /** 加密后的十六进制数据*/) {
    if (err) {
        console.log(err);
    } else {
        var res = handleEncrypted(data, xor);   //解密后的十六进制数据
        var extension = getNameExtension(res.substring(0,4));
        var hex = Buffer.from(res, 'hex');  //转为十六进制
        fs.writeFile(resPath + extension, hex, function (err) {
            if (err) {
                console.log('出错:', err);
            console.timeEnd('完成,耗时');
//解密加密数据
function handleEncrypted(strEncrypted) {
    //先获取异或值(仅限于jpg文件)
    // getXor(strEncrypted.substring(0, 4));
    let strLength = strEncrypted.length;
    var source = '';
    var list = [];
    for (var i = 0; i < strLength; i = i + xorLen) {
        var str = strEncrypted.substring(0, xorLen);
        strEncrypted = strEncrypted.substring(xorLen);
        var res = getResult(str);
        list.push(res);
    source = list.join('');
    return source;
//获取异或值
function getXor(str) {
    xor = 'ffd8';
    xor = getResult(str);
    return;
//获取文件名后缀
function getNameExtension(hex) {
    var str = hex.substring(0, 4);
    var res = dataHead.find(function (item) {
        return item.hex === hex;
    }).name
    return res;
//十六进制转二进制
function hexToBin(str) {
    let hex_array = [{ hex: '0', bin: "0000" }, { hex: '1', bin: "0001" }, { hex: '2', bin: "0010" }, { hex: '3', bin: "0011" }, { hex: '4', bin: "0100" }, { hex: '5', bin: "0101" }, { hex: '6', bin: "0110" }, { hex: '7', bin: "0111" },
    { hex: '8', bin: "1000" }, { hex: '9', bin: "1001" }, { hex: 'a', bin: "1010" }, { hex: 'b', bin: "1011" }, { hex: 'c', bin: "1100" }, { hex: 'd', bin: "1101" }, { hex: 'e', bin: "1110" }, { hex: 'f', bin: "1111" }];
    let value = "";
    for (let i = 0; i < str.length; i++) {
        value += hex_array.find(function (item) {
            return item.hex == str[i];
        }).bin;
    return value;
//二进制转十六进制
function binToHex(str) {
    let hex_array = [{ hex: '0', bin: "0000" }, { hex: '1', bin: "0001" }, { hex: '2', bin: "0010" }, { hex: '3', bin: "0011" }, { hex: '4', bin: "0100" }, { hex: '5', bin: "0101" }, { hex: '6', bin: "0110" }, { hex: '7', bin: "0111" },
    { hex: '8', bin: "1000" }, { hex: '9', bin: "1001" }, { hex: 'a', bin: "1010" }, { hex: 'b', bin: "1011" }, { hex: 'c', bin: "1100" }, { hex: 'd', bin: "1101" }, { hex: 'e', bin: "1110" }, { hex: 'f', bin: "1111" }];
    let value = '';
    let list = [];
    while (str.length > 4) {
        list.push(str.substring(0, 4));
        str = str.substring(4);
    list.push(str);
    for (let i = 0; i < list.length; i++) {
        value += hex_array.find(function (item) {
            return item.bin == list[i];
        }).hex;
    return value;
//获取计算结果
function getResult(a) {
    let A = hexToBin(a);
    let B = xor;
    let d = "";
    for (let i = 0; i < A.length; i++) {
        if (A[i] === B[i]) {
            d = d.concat('0');
        } else {
            d = d.concat('1');
    return binToHex(d);
//扩展名-十六进制表
var dataHead = [
        name: 'jpg',
        hex: 'ffd8'
        name: 'png',
        hex: '8950'
        name: 'gif',
        hex: '4749'

代码其实写的并不是很好,很多地方并没有做优化,还有批量处理这个还没实现,等有空了会更新博客,如果可能的话还会打包成exe文件。

js的parseDate与操作系统和浏览器相关,会失败。 采用默认的yyyy/MM/dd来进行,兼容常见的所有浏览器,所以如果项目允许的话,可以定义输入框中的日期格统一为yyyy/MM/dd 长期使用后,非常消耗电脑的空间,导致电脑越来越卡,建议删除里面没用的垃圾文件图片文件。这些可以选择性删除,虽然删除这些文件并不会影响微信的正常使用,但是如果需保留微信的聊天记录,重要的图片、资料则不要删除。微信dat文件是电脑上微信聊天记录数据文件,可以选择删除,但需要注意,若是文件内有重要的数据(聊天记录、文件),需要及时进行保存,或者选择不删除,以免出现不必要的麻烦。如下图所示,点击成功后面的红色的小文件夹图标,就可以打开转换后的文件夹了哦。提示:您也可以拖放微信dat文件夹哦,操作也是一样的呢。 使用Date对象 支持脚本的浏览器含一个全局Date对象(事实上,每个窗口都有一个Date对象),这个对象总是存在的,随时随地都可被调用。Date对象是一个静态对 象,当需要处理日期时,可以调用Date对象的构造函数,获取一个与特定事件和日期关联的Date对象实体。如果不带参数调用这个构造函数,格式如下: var today=new Date(); Date对象取得了PC内部时钟的一个快照, 最近用户越来越多,每天用户行为数据也原来越大,虽然每天写一个文件,但是对于上M的文件node.js的fs.readFiles是扛不住的,会报错,因为v8引擎的内存是有限制的,readFiles会一下子把整个文件加载进内存里面来,当然会越界。幸好nodejs提供了fs.ReadStream,我们一块块(默认64k,可以自己设置,具体参考官方文档)读取文件数据,内存就不会爆掉。我们需要一行一行的分析... 这个不是完整版,请不要下载了。 上次在CSDN下载了一个类似的功能的源码,发现源码不全,根本无法执行,没有学习价值,于是我又多方查资料,最终成功了,应该在CSDN上易语言这种源码完整的就独此一份了吧。希望对大家有用。我也混几个积分好下载我眼馋的源码和资源。^_^ 运行后将微信“FileStorage\Image\”下的DAT格式的缓存批量拖入到程序窗口,即可批量异或解密这些图片缓存,速度还可以。这个源码绝对可用。 解密的密码,源码里面是15,你可以搜索15,然后替换成你的密码,各微信的都不一样,之前忘了做自动识别图片个格式和密码了,今天已经做好了,但不想上传了。很简单,大家自己摸索一下就会了,这样才能理解更深刻。 微信dat文件批量解密—PHP版 演示地址:https://tool.kongning.top/datdecode/ php版本下载:https://download.csdn.net/download/qq_34792050/81459999 HTML5提供了一套文件系统的API,可以操作本地的文件。 最近的需求是要读取本地的一个DAT文件。所以特此记录一下。 关于读取本地文件的方式,可以参考文章:http://www.voidcn.com/article/p-ajsiagvh-gr.html 这里我主要想说的是,读取里面8个字节的double类型数据。 var selectedFile = document.get 一键批量将微信聊天接受到的加密存储DAT图片文件转化为普通图片。通过查看转化后的图片,您可以:(1)清理无用的历史图片,节省电脑硬盘存储空间。(2)恢复寻找重要照片资料。 解码解密微信电脑版image文件夹下缓存的用户图片? 在检查微信缓存中“FileStorage”文件夹时发现了其目录下的“Image”文件夹,想到可能是使用过程中缓存的聊天图片等,但是打开文件夹发现都是dat文件,用图片浏览器打开也提示无法查看。 D:\Documents\Tencent\WeChat Files\wxid_xxxxxx\FileStorage\Image\2021-07 想到可能是进行了加密处理,便去网上查了一下资料,现在把解密过程描述如下。 需要的工具:Python 16进制编辑 <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Doc var tree = document.getElementById("tree"); //getAttribute()取值属性 console.log(tree.getAttribute("data-leaves")); console.log(tree.getAttribute("data-plant-height")); //setAttribute()赋值属性 tree.setA 之前的时候很多人都咨询问微信dat文件怎么才能打开?有没有什么软件能打开微信dat文件? 看了下网上的说明,发现就是异或处理,于是准备将微信dat的转码做出来,方便大家。 微信dat文件微信进行图片存储的时候做了异或加密,然后将后缀修改为了dat格式。由于文件大小没有变化,可以很容易得到异或值,然后我们通过异或值,将文件进行字节码解码,就可以将文件还原成为图片了。 至此,微信dat文件还原成为图片也就结束了。 本人使用的nodejs的语言实现的,下面贴下nodejs的代码,各位可以