Mac、Win 对微信 PC 客户端本地 .db 数据库文件解密并读取

6,277 阅读6分钟

一、简介

  • 比如需要做一个读取聊天记录,并对聊天记录进行归纳整理存储到其他地方的功能,有几种方式:

  • 1、通过微信网页版,但是网页版存在限制。

    • 登录限制:微信网页版在 2017年 开始限制新注册账号登录,并于 2019年 彻底关闭了登录入口。新注册的微信号无法登录网页版微信,老账号则不受影响,但随着时间的推移,老账号也可能逐渐无法使用网页版‌1。

    • API调用限制:微信网页版 API 存在调用限制,每个帐号每月有一定的 API 调用限额。如果超过限额,可能会导致功能受限或无法正常使用‌。

    • 安全风险:由于网页版微信存在 API,一些开发者利用这些 API 开发了微信机器人等工具,这可能带来安全风险。因此微信对网页版微信进行了限制和关闭,以保障用户账号的安全‌。而且这种方式登录还有可能被封号的可能。

    image.png

  • 2、解密客户端本地 SQLite 数据库读取。

    • 这些数据库文件都是加密的。不过微信存数据使用的是开源的 sqlcipher, 所以还是有办法导出微信在本机的聊天数据库的。

    • 客户端本地 SQLite 数据库文件路径:

      • Mac:登录微信客户端,随便截个图发送一个消息,然后右键这个图片,选择 在 Frinder 中显示,在打开的文件夹中往上级文件夹找,找到 Message 文件夹即可,里面就是当前账号的聊天记录 .db 文件。

        image.png

        image.png

      • Win:登录微信客户端,到 设置 -》文件管理 中找到存储文件夹,文件夹内的 Msg 文件夹就是存储聊天记录的,里面有各种 db 文件,不止聊天相关的。

        image.png

  • 3、使用 PC 客户端 HookAndroid 抓包。

二、聊天记录 .db 文件分析

  • 进入各端聊天文件夹后,会发现同一个文件名会有几个不同后缀

    image.png

  • 文件关系与用途总结

    文件名作用特点
    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 模式的文件之一,用于临时存储对数据库的写操作。
    • 写入流程:
      1. 数据库写操作首先写入 xxx.db-wal 文件。
      2. 当达到一定条件(如文件大小限制或事务提交时),WAL 文件中的数据会被写回主数据库 xxx.db 中。
    • 优点:
      • 提高写入性能,避免频繁对主数据库文件操作。
      • 保证数据完整性,即使程序崩溃,未提交的数据仍可从 WAL 文件恢复。
  • 实际应用

    • 恢复聊天记录:
      • 如果 xxx.db 损坏,可以尝试从 xxx.db-backup 恢复。
      • 如果 xxx.db 数据缺失,xxx.db-wal 可能包含未写入主数据库的最新消息。
    • 分析聊天记录:
      • 核心数据存储在 xxx.db 中,但在事务未提交或进行中的情况下,需同时解析 xxx.db-wal
    • 清理冗余文件:
      • 在数据库关闭后,xxx.db-shmxxx.db-wal 通常可以被清理,不影响主数据库。

三、xxx.db 密钥获取方式

  • xxx.db 导入到第三方可视化工具中后,遇到 表和字段名显示为乱码无法加载任何数据,无法查看到表结构和内容提示文件加密 都需要对 xxx.db 文件进行解密后再导入,代码访问同理。

  • 密钥获取可以分为 配置文件获取(可能存在)运行时内存中获取,如果想省事可以直接选后者,必定能提取到,前者有找不到的可能,可能是还未存储就去找了。

四、【推荐】密钥获取:运行时内存中获取

  • 参考文章

    • 参考工具:Win

    • 参考文章1:Mac

    • 参考文章2:Win、Mac

      网上有很多方法,对于 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 文件夹,里面有个配置文件,应该是在里面,但是是个二进制文件,需要处理。

      image.png

    • 处理后,部分版本可能存储在 xml 文件中,字段可能包括 d2b_passwdpass_key ...

  • Mac

    • 通过之前的方式,发个图片右键进入文件夹,往上找,找到 xxx/Data/Library/Preferences 文件夹,这里就不贴固定路径了,这样找适用所有版本系统。

      image.png

    • 搜索关键文件:

      • system_config_prefs.xml(类似 Android 的路径)。

      • JSON 格式的配置文件,可能包含字段 d2b_passwdpass_key

    • .plist 如何打开:

      • 方式一: 通过 Finder 快速预览

        1. 选中 .plist 文件。

        2. 按下 空格键,使用 macOS 的快速预览功能查看内容。如果是二进制格式,快速预览可能无法显示详细信息。请先使用 plutil 转换为 XML 格式(见下方步骤)。

      • 方式二:可以使用 macOS 自带的 plutil 工具可以转换和读取 .plist 文件。

        # 输出会以 JSON 格式显示文件内容
        $ plutil -p 文件路径(.plist)
        

        某些 .plist 文件可能是二进制格式,使用以下命令将其转换为可读的 XML 格式:

        # 输出会以 JSON 格式显示文件内容,转换后,用文本编辑器打开即可
        $ plutil -convert xml1 文件路径(.plist)