V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
5thcat
V2EX  ›  分享发现

土办法导出 Mac 版微信聊天记录

  •  6
     
  •   5thcat · 2018-06-26 18:52:32 +08:00 · 35238 次点击
    这是一个创建于 2340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    macOS 微信的“备份与恢复”功能只能从手机微信导出到 Mac, 但是微信其实又在本地存了加密的 sqlite3 数据库; 本地数据库的是一系列 *.db 文件,可以用如下命令查看,

    ls -alh ~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/*/*/Message/*.db

    经过观察,微信存数据使用的是开源的 sqlcipher, 所以还是有办法导出微信在 Mac 本机的数据库的, 以下内容在 macOS 10.12, MAS 版微信 2.3.16 测试生效;

    该方法依赖 lldb, 步骤如下

    • 打开微信

    • 命令行运行 lldb -p $(pgrep WeChat)

    • 在 lldb 中输入 br set -n sqlite3_key, 回车

    • 还是在 lldb 中,输入 c, 回车

    • 扫码登录微信

    • 这时候回到 lldb 界面, 输入 memory read --size 1 --format x --count 32 $rsi, 回车

      应该会输出类似于如下的数据

    0x000000000000: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd
    0x000000000008: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd
    0x000000000010: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd
    0x000000000018: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd
    
    • 现在,忽略左边的地址( 0x000000000000: ,0x000000000008:),从左到右,从上到下,把形如 0xab 0xcd 的数据拼起来,然后去掉所有的 "0x"和空格、换行, 得到 64 个字符的字符串,这就是 微信数据库的 key ;(参考 https://github.com/sqlcipher/sqlcipher

    • 然后, 可以下一个 https://sqlitebrowser.org/ ,用来浏览之前提到的*.db 文件(每个 db 都使用的相同的 key ),注意:打开数据库的时候选择(raw key), 然后输入 0x,再输入刚才那 64 个字符;

    • 遗留问题:*.db 文件要在另一台 PC 或 Mac 上 登录微信, 才能被关闭,否则里面的聊天记录不是最新的;当然也可以强制调用 wal_checkpoint, 不过作为土办法,在另一台电脑上登一下微信也无妨

    30 条回复    2024-08-26 19:05:05 +08:00
    AnyISalIn
        1
    AnyISalIn  
       2018-06-26 22:24:08 +08:00 via iPhone
    itunes 备份可以拿出明文数据
    5thcat
        2
    5thcat  
    OP
       2018-06-27 10:37:13 +08:00
    @AnyISalIn 误删手机微信的人可能有用
    mornlight
        3
    mornlight  
       2018-07-19 02:03:00 +08:00
    试了一下,还有个 wccontact db,里面是所有联系人,联系人的 m_nsUsrName 做一次 md5 后对应聊天记录 db 里以 Chat_xxx 开头的表。

    终于可以把我一些有用的记录导出来了,谢谢~
    Citrus
        4
    Citrus  
       2018-08-19 12:00:00 +08:00 via iPhone
    @AnyISalIn 备份不是备份不了微信数据么?
    AnyISalIn
        5
    AnyISalIn  
       2018-08-19 15:25:43 +08:00 via iPhone
    @Citrus 可以的
    Citrus
        6
    Citrus  
       2018-08-19 20:42:06 +08:00 via iPhone
    @AnyISalIn 要怎么查看?备份出来的都是 Hash 后的文件名吧。。。
    AnyISalIn
        7
    AnyISalIn  
       2018-08-19 21:18:59 +08:00
    @Citrus itunes 全量备份(不加密)之后用 iphone backup extractor 单独导出 weixin 的目录,然后最里面有一个 MM.sqlite 文件,都是明文的数据
    deniswu
        8
    deniswu  
       2019-01-10 08:40:30 +08:00
    请问现在这个方法还能用吗,拿到密码后,页面大小选多少,我试了下得到的密码还是打不开。
    devnkong
        9
    devnkong  
       2019-03-17 13:05:50 +08:00
    2019.3.17 亲测可用,加密方法选择 SQLCipher 3 default
    zhongdian121
        10
    zhongdian121  
       2019-03-26 17:45:12 +08:00
    没有 lldb 的相关经验,请问
    br set -n sqlite3_key 中的变量名 sqlite3_key 是怎么猜到的呢?
    这个办法能够破解 msg_n.db
    但是现在电脑端微信可以备份聊天记录到 Backup.db
    在这个过程中,设置 sqlite3_key 断点依然能够触发,
    memory read --size 1 --format x --count 32 $rsi 读到的数据跟登录时触发的断点也不相同
    但是就是无法用相同的方法解密
    newdongyuwei
        11
    newdongyuwei  
       2019-06-24 10:53:04 +08:00
    2019-06-24 亲测可用。赞楼主! Database Browser for SQLite 支持解密 sqlcipher 加密的数据库。Encryption setting 选择 sqlcipher3 defaults
    newdongyuwei
        12
    newdongyuwei  
       2019-06-24 14:21:53 +08:00
    @zhongdian121 我猜测是这个: https://www.zetetic.net/sqlcipher/sqlcipher-api/#sqlite3_key sqlcipher 会调用 sqlite3_key 这个函数
    taohao
        13
    taohao  
       2019-08-08 14:45:40 +08:00
    @zhongdian121 我也是这样,打开备份的数据时打不开
    longalong
        14
    longalong  
       2019-09-06 12:01:17 +08:00
    求教,我在 mac 按照教程走,最后可以在 DB broswer for sql-lite 里边看到,我现在要把 mac 里的聊天记录转到 pc 上,“遗留问题:*.db 文件要在另一台 PC 或 Mac 上 登录微信, 才能被关闭,否则里面的聊天记录不是最新的;当然也可以强制调用 wal_checkpoint, 不过作为土办法,在另一台电脑上登一下微信也无妨” 没有太理解这里的操作步骤。是指直接把 mac 里的 DB 文件复制到 PC 上 DB 文件应该在的位子就可以了吗?还是怎么操作的
    longalong
        15
    longalong  
       2019-09-06 12:01:54 +08:00
    zhangyccc
        16
    zhangyccc  
       2020-02-12 19:31:38 +08:00
    已经不行了,第一步就连不上了 lldb -p $(pgrep WeChat)
    nickr
        17
    nickr  
       2020-07-23 20:35:06 +08:00   ❤️ 1
    验证了. 这个方法还是可用的. 不过对于手机备份到 mac 的备份文件, 这个方法无法打开.
    yuanchao
        18
    yuanchao  
       2020-08-05 18:25:24 +08:00
    @nickr #17 您好,我这边尝试一打开 DB broswer for sql-lite 就崩溃,您遇到过吗
    yuanchao
        19
    yuanchao  
       2020-08-05 21:03:22 +08:00
    经过测试,这个方法在 2020-08-05 微信 Version. 2.4.2 (15063) 已失效,如哪位老哥有新的方法请 at 我,谢谢
    Jyougen
        20
    Jyougen  
       2020-08-07 11:57:35 +08:00
    @yuanchao Version. 2.4.2 (15063) 方法可用, 但是这种方法可以把数据导入到 iOS 的微信里吗?
    leverestfish
        21
    leverestfish  
       2020-08-25 10:40:32 +08:00
    @Jyougen 你好,我第一步就运行出错,同样版本号,微信软件的各种打开状态都试过,报错如下。在 lldb 前面加 sudo 也不行。

    ``` bash
    ➜ ~ lldb -p $(pgrep WeChat)
    (lldb) process attach --pid 97885
    error: attach failed: Error 1
    ```
    5thcat
        22
    5thcat  
    OP
       2020-08-25 15:58:54 +08:00
    @leverestfish 你的 macOS 版本是什么?
    leverestfish
        23
    leverestfish  
       2020-08-25 17:01:36 +08:00
    @5thcat macOS 10.15.6
    knightdf
        24
    knightdf  
       2020-08-31 23:47:04 +08:00
    mac 10.15.6, wechat 2.4.2 失效了?密码打不开.db 文件
    knightdf
        25
    knightdf  
       2020-09-01 00:24:54 +08:00   ❤️ 1
    @knightdf 最新版的用这个测试: http://xferris.cn/dao-chu-wei-xin-bei-fen-de-mac/ 亲测有效
    Hovera
        26
    Hovera  
       2020-12-05 08:49:13 +08:00
    @nickr #17 是这样的,我的是 macOS 10.15.7,微信版本 2.5.0 (15731),数据库打开似乎只是自动备份的最近几天的对话记录。

    对于手机微信消息至 mac 的备份应该在 Backup 文件夹(~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application\ Support/com.tencent.xinWeChat/2.0b4.0.9/Backup/),里面有 backup.db ,BAK_0_TEXT,BAK_0_MEDIA,不知该如何破解。
    SimonOne
        27
    SimonOne  
       2021-02-06 20:31:45 +08:00
    lldb 时微信无响应,没法点击怎么办呢?
    cherrychen
        28
    cherrychen  
       2021-09-13 15:51:10 +08:00
    @SimonOne 打了断点吧, 可以 输入 c 或者 continue 就可以了
    kevintao1024
        29
    kevintao1024  
       2023-06-26 17:33:51 +08:00   ❤️ 1
    按照操作报错了,请问怎么解决?
    ```
    (lldb) c
    Process 1153 resuming
    Process 1153 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000108fdfcc4 WCDB`sqlite3_key
    WCDB`sqlite3_key:
    -> 0x108fdfcc4 <+0>: mov x3, x2
    0x108fdfcc8 <+4>: mov x2, x1
    0x108fdfccc <+8>: adr x1, #0x2c4d7 ; "main"
    0x108fdfcd0 <+12>: nop
    Target 0: (WeChat) stopped.
    (lldb) memory read --size 1 --format x --count 32 $rsi
    error: invalid start address expression.
    error: address expression "$rsi" evaluation failed
    ```
    zysidea
        30
    zysidea  
       87 天前
    @Hovera 遇到同样的诉求,老哥找到办法了么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5247 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:23 · PVG 09:23 · LAX 17:23 · JFK 20:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.