一、简介
-
比如需要做一个读取聊天记录,并对聊天记录进行归纳整理存储到其他地方的功能,有几种方式:
-
1、通过微信网页版,但是网页版存在限制。
-
登录限制
:微信网页版在2017年
开始限制新注册账号登录,并于2019年
彻底关闭了登录入口。新注册的微信号无法登录网页版微信,老账号则不受影响,但随着时间的推移,老账号也可能逐渐无法使用网页版1。 -
API调用限制
:微信网页版API
存在调用限制,每个帐号每月有一定的API
调用限额。如果超过限额,可能会导致功能受限或无法正常使用。 -
安全风险
:由于网页版微信存在API
,一些开发者利用这些API
开发了微信机器人等工具,这可能带来安全风险。因此微信对网页版微信进行了限制和关闭,以保障用户账号的安全。而且这种方式登录还有可能被封号的可能。
-
-
2、解密客户端本地
SQLite
数据库读取。-
这些数据库文件都是加密的。不过微信存数据使用的是开源的
sqlcipher
, 所以还是有办法导出微信在本机的聊天数据库的。 -
客户端本地
SQLite
数据库文件路径:-
Mac
:登录微信客户端,随便截个图发送一个消息,然后右键这个图片,选择在 Frinder 中显示
,在打开的文件夹中往上级文件夹找,找到Message
文件夹即可,里面就是当前账号的聊天记录.db
文件。 -
Win
:登录微信客户端,到设置 -》文件管理
中找到存储文件夹,文件夹内的Msg
文件夹就是存储聊天记录的,里面有各种db
文件,不止聊天相关的。
-
-
-
3、使用
PC
客户端Hook
或Android
抓包。
二、聊天记录 .db
文件分析
-
进入各端聊天文件夹后,会发现同一个文件名会有几个不同后缀
-
文件关系与用途总结
文件名 作用 特点 xxx.db
主数据库文件 存储聊天记录的主要数据 xxx.db-backup
主数据库的备份 便于数据恢复 xxx.db-shm
共享内存文件(加速访问) 动态文件,多线程间共享内存 xxx.db-wal
写操作的临时存储(预写日志) 动态文件,写入性能优化 -
xxx.db
- 主数据库文件。
- 这是
SQLite
数据库的核心文件,包含了聊天记录的主数据。 - 文件中存储了聊天记录的内容,包括消息文本、图片路径、音视频文件的元信息等。
-
xxx.db-backup
- 备份数据库文件。
- 这是微信定期或在某些关键操作(如程序升级、异常退出)时,生成的主数据库的备份文件。
- 用于在主数据库损坏时进行恢复。
- 数据内容通常与某一时刻的
xxx.db
一致,但可能稍旧。
-
xxx.db-shm
- 共享内存文件(
Shared Memory
)。 - 当
SQLite
使用WAL(Write-Ahead Logging,预写日志)模式
时产生的文件。 - 用于多个数据库连接之间共享内存和协调事务(如多线程访问数据库时)。
- 文件作用:
- 暂存查询结果或中间数据。
- 加速读写操作。
- 文件内容是动态的,重启微信或关闭数据库连接后可能会被清空。
- 共享内存文件(
-
xxx.db-wal
- 预写日志文件(
Write-Ahead Log
)。 - 也是
WAL
模式的文件之一,用于临时存储对数据库的写操作。 - 写入流程:
- 数据库写操作首先写入
xxx.db-wal
文件。 - 当达到一定条件(如文件大小限制或事务提交时),
WAL
文件中的数据会被写回主数据库xxx.db
中。
- 数据库写操作首先写入
- 优点:
- 提高写入性能,避免频繁对主数据库文件操作。
- 保证数据完整性,即使程序崩溃,未提交的数据仍可从
WAL
文件恢复。
- 预写日志文件(
-
实际应用
- 恢复聊天记录:
- 如果
xxx.db
损坏,可以尝试从xxx.db-backup
恢复。 - 如果
xxx.db
数据缺失,xxx.db-wal
可能包含未写入主数据库的最新消息。
- 如果
- 分析聊天记录:
- 核心数据存储在
xxx.db
中,但在事务未提交或进行中的情况下,需同时解析xxx.db-wal
。
- 核心数据存储在
- 清理冗余文件:
- 在数据库关闭后,
xxx.db-shm
和xxx.db-wal
通常可以被清理,不影响主数据库。
- 在数据库关闭后,
- 恢复聊天记录:
三、xxx.db
密钥获取方式
-
将
xxx.db
导入到第三方可视化工具中后,遇到表和字段名显示为乱码
或无法加载任何数据,无法查看到表结构和内容
或提示文件加密
都需要对xxx.db
文件进行解密后再导入,代码访问同理。 -
密钥获取可以分为
配置文件获取(可能存在)
与运行时内存中获取
,如果想省事可以直接选后者,必定能提取到,前者有找不到的可能,可能是还未存储就去找了。
四、【推荐】密钥获取:运行时内存中获取
-
参考文章
-
网上有很多方法,对于
mac
几乎都是这套方法,都是利用lldb
对进程设断点跟踪信息,从而获取密钥。但是现在Mac
系统新增了系统安全限制(System Integrity Protection, SIP)
,需要关闭它才能使用lldb
指令,参考文章中有。
-
Win
- 先按参考文章来,琢磨其他方案再更新。
-
Mac
-
先按参考文章来,琢磨其他方案再更新。 不希望关闭
系统安全限制(System Integrity Protection, SIP)
才能进行操作。 -
执行命令后报
系统安全限制(System Integrity Protection, SIP)
的错误,关闭再执行即可:$ lldb -p $(pgrep WeChat)
(lldb) process attach --pid 600
**error:** attach failed: attach failed (Not allowed to attach to process. Look in the console messages (Console.app), near the debugserver entries, when the attach failed. The subsystem that denied the attach permission will likely have logged an informative message about why it was denied.)
-
五、【不推荐】密钥获取:配置文件获取(可能存在)
-
尝试跑了下没走通,节流留个笔记。
-
Win
-
在刚才的
Msg
文件夹的同级找到config
文件夹,里面有个配置文件,应该是在里面,但是是个二进制文件,需要处理。 -
处理后,部分版本可能存储在
xml
文件中,字段可能包括d2b_passwd
、pass_key
…
-
-
Mac
-
通过之前的方式,发个图片右键进入文件夹,往上找,找到
xxx/Data/Library/Preferences
文件夹,这里就不贴固定路径了,这样找适用所有版本系统。 -
搜索关键文件:
-
system_config_prefs.xml
(类似Android
的路径)。 -
JSON
格式的配置文件,可能包含字段d2b_passwd
或pass_key
。
-
-
.plist
如何打开:-
方式一
: 通过Finder
快速预览-
选中
.plist
文件。 -
按下
空格键
,使用macOS
的快速预览功能查看内容。如果是二进制格式,快速预览可能无法显示详细信息。请先使用plutil
转换为XML
格式(见下方步骤)。
-
-
方式二
:可以使用macOS
自带的plutil
工具可以转换和读取.plist
文件。# 输出会以 JSON 格式显示文件内容 $ plutil -p 文件路径(.plist)
某些
.plist
文件可能是二进制格式,使用以下命令将其转换为可读的XML
格式:# 输出会以 JSON 格式显示文件内容,转换后,用文本编辑器打开即可 $ plutil -convert xml1 文件路径(.plist)
-
-