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

Posted 刘翾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何查看微信image/*.dat文件相关的知识,希望对你有一定的参考价值。

背景: 起因我是想看看能不能获取的到撤回的图片, 于是在*\\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>

以上是关于如何查看微信image/*.dat文件的主要内容,如果未能解决你的问题,请参考以下文章

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

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

delphi 中如何将图片数据保存到dat文件里的,然后读取出来,并在Image控件中显示。

PC微信本地图片格式转化

Java批量解析微信dat文件

教程/手册如何在 autoexp.dat 中创建 Visualizer