网上看到有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('出错:'