如何查看微信image/*.dat文件

2023-11-04

背景: 起因我是想看看能不能获取的到撤回的图片, 于是在*\WeChat Files\*\FileStorage\Image这个文件下发现了聊天记录储存的文件, 却发现文件已被加密… 也就有了这篇文章…

关于撤回的图片这个问题, 结论是获取不到, 聊天记录里加密的图片也删除了…, 不过该文章的方法可以获取到原来聊天记录的图片


在这里插入图片描述
图片文件的每个字节 异或 机器随机的一个值, 对此进行的加密

下图为普通JPG文件. JPG文件的文件头为 0xFF, 0xD8
在这里插入图片描述
下图为image文件夹下某Dat文件, 文件头为0x63, 0x44
在这里插入图片描述
通过 0xFF异或 0x63 取值可以得到加密码为 9c (此处可以用第二位 0xD8 0x44 来反向验证), 之后便可以通过该值9c对全文件进行异或操作, 即可以得到原始图片文件.

不过此处我只是举了JPG图片的例子, 对于不同文件, 例如png, gif, bmp, 文件头都不一致, 因此还需按需调整.

见代码

import { argv } from 'process';
import { open } from 'fs/promises';

// JPEG (jpg),文件头:FFD8FF
// PNG (png),文件头:89504E47
// GIF (gif),文件头:47494638

const JPG_HEADER = [0xFF, 0xD9];
const PNG_HEADER = [0x89, 0x50];
const GIF_HEADER = [0x47, 0x49];

let readFile;
let writeFile;
let fileTypeObj;

function xorOpeartion(fileTypeArr = [], fileHeaderBuffer = []) {
  const fileCode = fileTypeArr[0] ^ fileHeaderBuffer[0];
  let returnValue = {
    isTrue: false,
    fileCode: null,
  }

  if (fileCode ^ fileHeaderBuffer[1] === fileTypeArr[1]) {
    returnValue.isTrue = true;
    returnValue.fileCode = fileCode;
  }

  return returnValue;
}

function getFileType(fileHeaderBuffer) {
  const fileTypeArr = [
    { type: 'jpg', value: JPG_HEADER},
    { type: 'png', value: PNG_HEADER},
    { type: 'gif', value: GIF_HEADER},
  ];
  let returnValue = {
    isTrue: false,
    fileCode: null,
    fileType: null,
  };
  for (let item of fileTypeArr) {
    returnValue = { ...returnValue, ...xorOpeartion(item.value, fileHeaderBuffer) };
    if (returnValue.isTrue) {
      returnValue.fileType = item.type;
      break;
    }
  }
  return returnValue;
}

try {
  readFile = await open(argv[2], 'r')

  let fileHeaderBuffer = Buffer.alloc(2);
  await readFile.read({
    buffer: fileHeaderBuffer,
  });
  fileTypeObj = getFileType(fileHeaderBuffer);
  if (!fileTypeObj.isTrue) {
    // 即无匹配文件
    throw new Error('不属于jpg, png, gif文件, 解码失败');
  }

  writeFile = await open(`${argv[2]}.${fileTypeObj.fileType}`, 'w')

  // 解码文件
  const readStream =  readFile.createReadStream({
    start: 0,
  });
  const writeStream = writeFile.createWriteStream();
  readStream.on('data', (chunk) => {
    let isOk = true;
    let finalData = [];
    for (let dataEachItem of chunk) {
      finalData.push(dataEachItem ^ fileTypeObj.fileCode);
    }

    isOk = writeStream.write(Buffer.from(finalData));

    if (!isOk) {
      readStream.pause();
      writeStream.once('drain', () => {
        readStream.resume();
      });
    }

    console.log(`Received ${chunk.length} bytes of data.`);
  });

  readStream.on('end', () => {
    console.log('End');
    writeStream.end();
  })
} catch (error) {
  console.log(`Usage: node ${argv[1]} <input filename>`);
  console.log(error);
}

如何使用: node 上述代码 <input filename>

在这里插入图片描述

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

如何查看微信image/*.dat文件 的相关文章

随机推荐

  • matlab学习日记Re0 (三)

    matlab学习日记Re0 三 Machine Learning Onramp 2 2 Import Data 使用readtable指令可以读出xls txt等格式的文件 并以table形式储存在matlab种 例如输入data read
  • atoi()函数详解

    atoi 函数详解 atoi s 函数用于把一个字符串转换成一个整型数据 该函数定义在stdlib h中 例 假如你输入的是123456 那么它先被读入到字符串s中 用atoi 函数就可以把它转化成一个整数 如果转化成功 则返回转化后的整数
  • Apollo配置中心教程、详解

    目录 配置的基本概念 配置中心 Apollo Apollo快速启动 Apollo工作原理 使用Apollo需要的核心概念 使用Apollo客户端 Springboot集成Apollo 配置的基本概念 应用程序在启动和运行的时候往往需要读取一
  • spring系统学习7-Spring JDBC框架

    七 Spring JDBC框架 使用普通的JDBC数据库时 要写很多与业务无关的代码来处理异常 打开和关闭数据库连接等 Spring JDBC框架负责所有的低层细节 从开始打开连接 准备和执行SQL语句 处理异常 处理事务 到最后关闭连接
  • 学习笔记-迪杰斯特拉算法求最短路径

    求最短路径问题 迪杰斯特拉算法 迪杰斯特拉 Dijkstra 算法是典型最短路径算法 用于计算一个结点到其他结点的最短路径 它的主要特点是以起始点为中心向外层层扩展 广度优先搜索思想 直到扩展到终点为止 设置出发顶点为 v 顶点集合 V v
  • JavaScript实现 -- 二分搜索

    二分搜索 二分搜索 binary search 也称折半搜索 对数搜索 是一种在有序数组中查找某一特定元素的搜索算法 原理 二分搜索算法的原理和猜数字游戏类似 就是有人让你从1 100之间选一个数字让他猜 他告诉你猜测的数字 你回复他猜测的
  • Windows SSH 配置和SCP的使用

    使用用户界面安装 ssh 功能 要在 Windows 10 11 上启用 SSH 服务器 请按照以下步骤操作 按 Windows 键 I 打开 设置 菜单 然后选择 应用程序 在左侧菜单栏中选择 应用和功能 从列表中选择 可选功能 点击 添
  • MapReduce实现线性回归

    1 软件版本号 Hadoop2 6 0 IDEA中源代码编译使用CDH5 7 3 相应Hadoop2 6 0 集群使用原生Hadoop2 6 4 JDK1 8 Intellij IDEA 14 源代码能够在https github com
  • Safari安装使用JsonView插件

    google的jsonView插件可以使接口数据json化 方便查看 下载地址 https github com rfletcher safari json formatter downloads 下载后直接点击打开安装 默认是自动开启的
  • Junit单元测试报错java.lang.Exception: No tests found matching

    在Java代码的开发过程中 我们经常会需要写单元测试 但是由于有些项目在构建的过程中 时间比较紧张 导致我们并不去重视或者没有时间去写单元测试 今天因为需要做一个接口加密的问题 需要用到单元测试 结果写完单元测试 发现运行测试就报错 jav
  • oracle查询第三个字母是A的员工,oracle_day2 限制查询

    限制查询 一 逻辑比较操作符 gt lt 不等于 三个都表示不等于的意思 经常用的是 lt gt 1 查看员工工资小于1000的员工id和名字 select id first name last name all name from s e
  • 数字电路设计之ARM m0进度(1)

    这个例子是用于测试我写的ARM这个内核 测试例子是一个求最大公约数和最小公倍数的程序 2014 10 21 1 已解决问题 LDR1这条指令的 10 i datain lt LDR1 5 b0000 1 gr0 gr2 LDR0 5 b01
  • Buildroot系列开发(五)bootloader简述

    参考 百问网 文章目录 1 什么是Boot loader 2 有哪些bootloader 哪些支持linux 3 Bootloader支持的Flash设备 4 Bootloader支持的文件系统类型 4 Bootloader支持的CPU架构
  • 【深度学习与计算机视觉】12、迁移学习

    文章目录 一 迁移学习简介 二 为什么要使用迁移学习 三 迁移学习的实现 四 迁移学习系统介绍 一 原始数据有标签 目标数据有标签 1 模型微调 model fine tune 也叫再优化 1 保守训练 Conservative Train
  • Nginx系列(十九):URI转义机制(部分转载)

    一 URI和特殊字符 源文档 https www cnblogs com upyun p 8267334 html 1 URI URI 全称是 Uniform Resource Identifiers 即统一资源标识符 用于在互联网上标识一
  • 【51单片机】LED模块和独立按键的使用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 原理介绍
  • MIMO 从入门到精通 -科普篇 1 - 5G Massive MIMO

    参考 Our Technology Planet lt lt 5G Massive MIMO Made Simple Learn All About Massive MIMO Beam Forming In 30 minutes gt gt
  • ESP32 Wi-Fi & 蓝牙 Tx Power 调整方法

    此篇博客用来整理 ESP32 Wi Fi BLE 的 Tx Power 调整方法 此博客分为两部分 Wi Fi Tx Power 调整 BLE Tx Power 调整 BR EDR Tx Power 调整 注 当前使用 的 IDF comm
  • Kubeadm 安装 Kubernetes:kubelet 状态失败的解决方案

    Kubeadm 安装 Kubernetes kubelet 状态失败的解决方案 在使用 kubeadm 安装 Kubernetes 集群时 遇到 kubelet 状态失败的问题是比较常见的 这个问题主要出现在 kubelet 无法正常启动或
  • 如何查看微信image/*.dat文件

    背景 起因我是想看看能不能获取的到撤回的图片 于是在 WeChat Files FileStorage Image这个文件下发现了聊天记录储存的文件 却发现文件已被加密 也就有了这篇文章 关于撤回的图片这个问题 结论是获取不到 聊天记录里加