继微信dat之后的PC端微信解密后数据库数据抽取

前段时间弄了下微信的dat图片的解码,后续有同学问数据库的解码怎么弄.. 当然,后边陆陆续续的看了下,加上住院乱七八糟的事情,一直没处理,最近几天处理了下,发现微信数据库的数据格式是真的麻烦...

如何查看微信dat图片的点击下面的链接

http://sdxlp.cn/article/%E5%BE%AE%E4%BF%A15.html

简单梳理下最近的操作:

  • 通过od拿到PC端微信数据库的密钥
  • 通过c++ 将PC端微信数据库db文件进行解密成普通db
  • 通过nodejs来读取sqlite数据库,拿到好友和聊天记录

前面两部就不讲了,我也是直接拿着大神的教程直接做的,没啥变化,也讲不出什么东西来。 本文主要是做个简单的记录整理,确实没啥很特别的东西..

先来几张图

根据拿到的64位密钥,对数据库进行解密。

得到解密后的数据库

得到解密后的数据库

通过sqlite 打开看到如下表

MSG数据库

MSG数据库

以MSG.db 为例子,该数据库主要存储的是聊天记录,表MSG中为所有的好友+群组的聊天记录,如下图:

MSG表聊天记录

MSG表聊天记录

数据库

微信MSG下有很多数据库文件,如果我们需要的是好友+聊天记录,那么其实只需要三个数据库文件即可,为: MSG.db MediaMsg.db MicroMsg.db ,当然存储数据达到一定体积后,会有 MSG0 MSG1 等。

  • MSG.db 存储的为聊天记录数据
  • MicroMsg.db 存储的为好友+群组等等联系人的信息,表为contact
  • MediaMsg.db 主要存储的是语音数据,格式为silk .
  • Misc.db 存储的是头像数据

抽取

所以,我们只需要拿到联系人,然后根据联系人拿到对应的聊天记录,然后对聊天记录进行展示,当然,思路是比较简单的,麻烦的是微信的聊天数据格式比较多,大约十几种,分别包括:消息/图片/表情/语音/视频/地图/名片/撤回/红包/群组消息/拍一拍等等。

我们还需要根据不同的数据格式,解析成不同的内容,由于兴趣有限,只做了比较简单的消息/图片/视频这三个。除了消息外,图片和视频都是存储的路径,文件分表在 filestorage/image 和 filestorage/video 下,我们通过正则匹配到后拿到文件进行展示。

其中蓝色代表存在聊天记录的好友

其中蓝色代表存在聊天记录的好友

样式很low ,随便写的

样式很low ,随便写的

主要的业务代码

/***** * 微信的所有业务查询使用*/const fs = require('fs');
const sqlite3 = require('sqlite3').verbose();
const lib = require('./lib');module.exports = function (options) {let wxid = options.wxid;const MicroIns = new sqlite3.Database(options.MicroMsg);const MSGIns = options.MSG.split(',').map(str => {return new sqlite3.Database(str);});const MEDIAIns = new sqlite3.Database(options.MEDIA);return {/**** 获取微信所有联系人-朋友*/getFriends: async function () {let list = await lib.all(MicroIns, 'select UserName,Remark,NickName,PYInitial,RemarkPYInitial from Contact where verifyFlag = 0 and (type=3 or type > 50)', []);//做简单排序,A list.forEach(item => {item.zimu = (item.RemarkPYInitial || item.PYInitial);item.f = item.zimu.length > 0 ? item.zimu.substr(0, 1) : '-';});list.sort((a, b) => {return a.f.charCodeAt(0) - b.f.charCodeAt(0);})return list;},/**** 获取微信所有的群数据*/getGroups: async function () {let list = await lib.all(MicroIns, 'select UserName,Remark,NickName,PYInitial,RemarkPYInitial from Contact where type=2');//做简单排序,A list.forEach(item => {item.zimu = (item.RemarkPYInitial || item.PYInitial);item.f = item.zimu.length > 0 ? item.zimu.substr(0, 1) : '-';});list.sort((a, b) => {return a.f.charCodeAt(0) - b.f.charCodeAt(0);})return list;},/**** 获取微信内的公众号信息*/getOfficial: async function () {let list = await lib.all(MicroIns, 'select UserName,Remark,NickName,PYInitial,RemarkPYInitial,VerifyFlag from Contact where type=3 and (VerifyFlag=24 or VerifyFlag=8)');//做简单排序,A list.forEach(item => {item.zimu = (item.RemarkPYInitial || item.PYInitial);item.f = item.zimu.length > 0 ? item.zimu.substr(0, 1) : '-';});list.sort((a, b) => {return a.f.charCodeAt(0) - b.f.charCodeAt(0);})return list;},/**** 获取微信内群里的陌生人信息*/getStrangers: async function () {let list = await lib.all(MicroIns, 'select UserName,Remark,NickName,PYInitial,RemarkPYInitial from Contact where type=4');//做简单排序,A list.forEach(item => {item.zimu = (item.RemarkPYInitial || item.PYInitial);item.f = item.zimu.length > 0 ? item.zimu.substr(0, 1) : '-';});list.sort((a, b) => {return a.f.charCodeAt(0) - b.f.charCodeAt(0);})return list;},/**** 根据UserName 获得Contact的一行记录*/getContactByUserName: async function (UserName) {let list = await lib.get(MicroIns, 'select UserName,Remark,NickName,PYInitial,RemarkPYInitial from Contact where UserName=?', UserName);return list;},/**** 根据UserName 获得 ContactHeadImgUrl 头像信息*/getHeadImageByUserName: async function (UserName) {let list = await lib.get(MicroIns, 'select usrName,smallHeadImgUrl,bigHeadImgUrl,headImgMd5 from ContactHeadImgUrl where usrName=?', UserName);return list;},//获得聊天记录条数getRecordCount: async function (UserName) {let count = 0;for (let i in MSGIns) {let temp = await lib.get(MSGIns[i], 'select count(1) as num from MSG where StrTalker=?', UserName);count += temp.num;}return { num: count };},/*** 根据UserName 查询 MSG0-N 中MSG 的聊天记录数据* @param {String} UserName */getRecordList: async function (UserName) {let list = [];for (let i in MSGIns) {let temp = await lib.all(MSGIns[i], 'select localId,TalkerId,Type,SubType,IsSender,CreateTime,Sequence,StrContent,StrTalker,BytesExtra from MSG where StrTalker=?', UserName);list = list.concat(temp);}list.forEach(item => {//type=3 ,图片消息//type=43 ,视频消息//type=47 ,表情消息//type=34,语音消息//type=1 ,普通消息//type=42,名片消息//type=48,地图定位消息//type=49,50 ,不确定//type=10000,撤回消息,消息从BytesExtra中//type=10002,邀请入群消息var info = item.BytesExtra.toString('utf8');if (info != null) {info = info.trim();var rr = info.match(/\b(.*)?\u001a/);if (rr) {item.from = rr[1];//来自谁发言}}var type = item.Type;if (type == 3) {//图片消息,需要获得缩略图和大图数据var info = item.BytesExtra.toString('utf8');var reg = new RegExp(wxid + '.*?(\.dat)', 'g');var ja = info.match(reg);if (ja) {item.bigImage = ja[0];item.smallImage = ja[1];item.BytesExtra = null;item.StrContent = null;} else {item.StrContent = info;}} else if (type == 43) {//视频var info = item.BytesExtra.toString('utf8');var reg = new RegExp(wxid + '.*?(\.jpg)', 'g');var reg2 = new RegExp('' + wxid + '.*?(\.mp4)', 'g');var ja = info.match(reg);if (ja != null) {item.videoPost = ja[0];info = info.replace(ja[0], '');}var ja2 = info.match(reg2);if (ja2 != null) {item.Video = ja2[0];}item.StrContent = null;item.BytesExtra = null;} else if (type == '47') {//表情消息item.StrContent = null;item.BytesExtra = null;} else if (type == 34) {//语音消息,需要将语音数据转为mp3 或直接播放// console.log(item)// console.log(item.BytesExtra.toString('utf8'));} else if (type == 1) {//普通消息// console.log(item);// console.log(item.StrContent)//获得是谁发言} else if (type == 42) {//名片消息} else if (type == 48) {//地图定位var label = item.StrContent.match(/label="(.*?)"/);if (label != null) {label = label[1];}var poiname = item.StrContent.match(/poiname="(.*?)"/);if (poiname != null) {poiname = poiname[1]}item.StrContent = label + poiname;item.BytesExtra = null;} else if (type == 10000) {//撤回/红包/拍一拍} else if (type == 10002) {//邀请入群item.StrContent = '邀请入群信息';item.BytesExtra = null;} else {// console.log(item);if (item.SubType == 6) {//附件var regExp = new RegExp('((' + wxid + ').*)');if (regExp) {item.filePath = regExp[0];}} else if (item.SubType == 5 || item.SubType == 33) {var reg = new RegExp(wxid + '.*?(\.jpg)', 'g');var ja = info.match(reg);if (ja) {item.bigImage = ja[0];}} else if (item.SubType == 8) {//gifvar reg = new RegExp(wxid + '.*?(\.gif)', 'g');var ja = info.match(reg);if (ja) {item.bigImage = ja[0];}} else {// console.log(info);item.StrContent = item.BytesExtra.toString('utf8');item.BytesExtra = null;}// console.log(item.BytesExtra.toString('utf8'))}})return list;},getMedia: async function () {let list = await lib.all(MEDIAIns, 'select * from media');return list;}};
}

其他

当然,感觉这个其实是没太有意义的,毕竟...密钥必须要微信登录才可以拿到.同时呢,由于微信的机制,导致数据库能看到啥,微信就能看到啥.. 所以没太大意义,除非准备把记录保存起来,后续如果真的闲的蛋疼的话,可能会吧聊天记录美化下,把不同格式都加上,尽可能的还原,然后加个pdf ?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68670.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【腾讯开发者大会】天刀手游开发历程(笔记)

前言 最近腾讯游戏学院发布了一些游戏行业内大佬们的分享视频,观看这些视频,我们可以了解到行业内最新的一些技术知识等,以便提升自己的水平。之前也看到天刀手游是基于Unity制作的,同时自己也作为一名天刀游戏的玩家&#xff0c…

【028】仿猫眼、淘票票的电影后台管理和售票系统系统(含后台管理)(含源码、数据库、运行教程)

文章目录 1.项目概要介绍2.用户运行界面截图3.后台管理员界面截图4.后端启动教程5.前端启动教程6.源码获取 1.项目概要介绍 前言:这是基于VueNodeMysql的模仿猫眼、淘票票的电影购票系统,有 附源码、数据库、运行教程 技术栈:Vue、element-u…

C# 使用微软自带的Speech进行语音输出

1、在VS中使用微软自带的Speech进行语音播报,首先需要添加引用: 2、具体实现逻辑代码如下: 转载于:https://www.cnblogs.com/hh8888-log/p/10785112.html

如何使用 Web Speech API 在浏览器中识别语音

Web Speech API有两个功能:语音合成(文本到语音)和语音识别(语音到文本)。在上一篇文章中,我解释了语音合成,但这次SpeechRecognition我将解释使用 API 的浏览器的语音识别和语音转录的方法。 识…

使用windows自带的语音引擎在客户端朗读一段文本

背景:之前公司有特殊要求,需要在特殊的环境下进行语音播报,且是物理隔离的内网状态,大家懂的。 环境:Windows 7 、IE系列 1. 先在网上看了一下前辈们的文章,发现还是有解决方案的,例如这个 使用…

占领手机,银行App的隐秘战事

作者 | 辰纹 来源 | 洞见新研社 十几年前,银行用各类卡片塞满我们的钱包;如今,银行用各种App塞满我们的手机。 说出来可能很多人还不相信,民商智慧《2019银行业电子银行场景营销分析报告》就提到,在2019年3月时&…

ADAS“中国战事”升级

尽管全球汽车产业面临严重的缺芯困境,但汽车智能化,尤其是辅助驾驶的新车搭载量、渗透率仍处于持续上升通道。 高工智能汽车研究院监测数据显示,今年1-6月国内新车(合资自主)搭载前向ADAS(L0-L2&#xff0…

中国数据库产业的“高地战事”

作者 | Aholiab 出品 | CSDN(ID:CSDNnews) 随着5G技术的飞速发展,海量数据的持续激增,大数据时代数据库行业也迎来了快速增长。 作为大数据存储、处理、分析的关键系统,基础软件核心之一,数据库对推动中国互…

python数据挖掘电影评分分析_豆瓣电影数据与票房数据分析

写在前面 在上次观看了比利.林恩的中场战事之后,开始进入了豆瓣的电影世界,对于一个新用户来说,特别喜欢豆瓣电影的影评,对于所看过的留下深刻印象的电影都在豆瓣上搜了一边,同一部电影,希望能看到与自己感受不同的观点,因为每一位观众都有着不一样的人生轨迹,看待事物…

百度的春晚战事

“我们对春晚一无所知。” 罗振宇曾在跨年演讲上如是说。 无论悲喜,反正每个中国人都为春晚辟出了一块“专属记忆”。而从2015年开始,中国人的春晚记忆里被点上了一颗“红痣”。那就是——总有一家顶尖互联网公司面带羞赧地走上舞台,给十几…

知云文献翻译打不开_英文PDF文献翻译神器-知云文献翻译

在经历了之前推荐的通天塔文献翻译网站次数使用完毕,冲会员才能继续使用;谷歌PDF翻译无法使用;谷歌文字翻译要自己手动删空格,还要受5000字符数(注意,是字符数不是字数)限制的折磨之后&#xff…

知云文献翻译打不开_只推荐这两款翻译软件!

上传文档、复制到网页等等,都是渣渣!难道就没有一边看一边就自动翻译的软件?有!有的!还不止一款!诚意推荐给你! 截止2020年,因为学业需要,本人每天都需要阅读外文&#x…

知云文献翻译打不开_有了这几个软件,轻松读懂英文文献

科研路上,大家伙儿难免绕不开的结就是——阅读英文文献。 然而,当你问大神用的什么翻译软件时?大神会分分种藐视你,人家偶尔查个单词跟你要查整篇文章完全是两个概念,咱们跟大神面对的是不同的问题,这也是为…

文献工具 Citavi+知云翻译

1、B站一位UP主分享的Citavi知云翻译的高效管理阅读文献的方法: https://www.bilibili.com/video/BV1Zt4y117XX/ 其中如何在tools中显示 经实验发现,是需要修改自己电脑上PDF的默认打开方式的,这个操作也特别简单 随便找一个PDF文件&#xf…

知云文献翻译打不开_一款好用的文献英中翻译软件

“ 知云文献翻译 ” 软件是我用过的一款比较好用的文献翻译软件。操作简单,只需要将文献 PDF 在这个软件中打开,第一次登录时点击右侧“重新登录”,用微信扫码登录即可。左键选中 PDF 中没有看懂的单词、句子、甚至是段落,该软件右…

知云文献翻译跨页内容选中翻译操作

知云文献翻译阅读软件跨页内容选中翻译操作 跨页内容选中翻译。 很多PDF段落分布在两个页面,划选容易将中间的页眉等杂乱文字选中。6.6版本开始支持跨页内容选中翻译。 方法是: 先选中前面部分的文字,然后按住Alt键选中后面的文字部分。 …

知云文献翻译免费下载——研究生必备!

还记得之前我介绍了一个超全的文献下载网站——文献小镇,然后和朋友聊天的时候就想到了一个问题:下载下来的文献是全英文的,看不懂啊! 于是我茅塞顿开,觉得还应该给大家介绍一个英文文献翻译的神器——知云文献翻译&a…

知云文献翻译——选中内容后不能翻译了,解决办法

划选文字,右侧无反应 故障描述 一般情况下使用文本工具选中左侧打开的pdf文件上的一段话或一句话或双击一个单词,右侧会自动跳转到二维码登陆界面或直接显示翻译结果。但某些用户选中文字后右侧没有任何反应。 排查流程 1、看看软件左上方版本号是否是…

知云文献翻译-选定内容后无法翻译

1.查看软件左上方版本号是否为最新版,如果不是就升级。 如果您没有上图所示的更新程序选项,说明是比较老的版本,您就自己到 https://www.yuque.com/xtranslator/zy/gga6xa 下载最新版安装版本安装。今后如果升级就直接点击"其他功能&quo…

在Endnote使用知云翻译阅读文献

下载知云翻译后,将pdf的打开方式改成知云文献翻译,右键pdf文件,打开属性,更改打开方式。 可能会遇到你在知云文献标记的pdf文件不能保存,即pdf是只读模式,可以这样设置,找到My EndNote Library…