15 directories, 0 files
Message出来了,这是不是我们想要的呢?再往下看里面的目录:
├── MessageTemp├── fts├── msg_0.db├── msg_0.db-backup├── msg_0.db-shm├── msg_0.db-wal├── msg_1.db
如果你登录过该台电脑并同步过信息,那么不出意外会有挺多*.db后缀的文件。大胆地猜测一下,这是不是我们想要的聊天数据存放路径呢?
不要管太多,先看看总不会错,一般本地存储的数据库,咱们程序员第一反应应该就是SQLite,要不要试试?
sqlite3 Message/msg_0.dbsqlite> .schemaError: file is not a databasesqlite>
??提示不是数据库,此时陷入了瓶颈,怎么就不是数据库了呢。反思一下,是不是打开的姿势不对。
会不会是加密了?依照这个思路,我了解到有一款基于SQLite的扩展数据库SQLCipher[1],SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能。
实践证明,我猜想的是对的,接下来主要做的怎么打开Message/msg_0.db这个文件并成功读取里面的数据。
最后我参考到一份有意思的问答,我就是参考这个问答[2]对数据库进行解密,这里我复述一下:
•打开微信,但是先不登录•打开终端,输入lldb -p $(pgrep WeChat)•会看到进入了lldb,然后输入br set -n sqlite3_key,按回车•在lldb中,输入c,按回车•然后回到lldb中,输入memory read --size 1 --format x --count 32 $rsi
此时就会得到以下类似的输出:
0x600003888340: 0xd1 0x05 0x29 0x04 0x75 0xc5 0x45 0x050x600003888348: 0x92 0x26 0xa1 0x65 0x95 0xe5 0x15 0x3f0x600003888350: 0xf3 0xc7 0x43 0x85 0x05 0x35 0x45 0x3d0x600003888358: 0x84 0xc8 0x64 0xe5 0x35 0x65 0x45 0xe2
去掉冒号前面的那一串,后面是四行八列的数据,再去除掉0x、空格、n等,就会得到一串64位的字符串,举个例子:
df012f587cc546000025a56599e81530f9cc49800329423d8ec460e1386549e2
这就是我们进入数据库的钥匙,接下来,请安装sqlcipher的相关软件,如:
brew install sqlcipherbrew cask install db-browser-for-sqlite
让我们用db-browser-for-sqlite打开db后缀的文件看看有什么不一样吧:
点击OK,成功打开!
随便进入一个表:
很显然,我们成功获取了本地的聊天记录,总算将第二步流程打通了,如今我们可以监控发送收藏文章的微信账户的聊天记录,只要收到此账号发来的推文消息,此时监控服务可以立马反应过来并解析发送到Bear。
有个小问题,怎么知道发推文的账号在哪个库哪个表呢?可以这样看,在电脑上登录发推文的账号,打开文件``:
cd /Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/988eebd1023a0d794bff2b6f5c8d5176/Accountcat userinfo.data
大概输出如下:
":BHPpx��127417592694754732��wxid_epXXXXXXXfj12� Howie6879�老胡的储物柜�
这里很明显我的wxid就是:wxid_epXXXXXXXfj12,那么对应需要监控的表名就是:Chat_md5(wxid_epXXXXXXXfj12),形式如同这样
Chat_f965739xxxx114fxxxxc394322exxxx
随后实现在库里面找到对应的表即可,我本机发现对应账户的表存在于库 msg_5.db中。
接下来要做的事情就很简单了,就是将提取后的内容发送到Bear,这里可以利用X callback url Scheme documentation[3],比如你在终端输入:
open 'bear://x-callback-url/create?title=Test%20Bear&text=Hello%20Bear'
立马就可以看到Bear自动建立了一篇笔记
编码实现
终于到了编码阶段,好心酸:
第一步,拿到必须要的常量:
•S_ACCOUNT_ID:微信发送账户ID,可以在Account/userinfo.data下查看•R_ACCOUNT_ID:微信接收账户ID,同上•RAW_KEY:解密Key,就是上面介绍的64位字符串•DB_PATH_TEM:定义的是消息DB路径,比如:"/Users/howie6879/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/2.0b4.0.9/{0}/Message/"
定义这四个常量,接下来的事情就一帆风顺了哈,我将项目开源在Github,地址见w2b[4],接下来我直接说说怎么用:
git clone https://github.com/howie6879/w2bcd w2b# 推荐使用pipenv 你也可以使用自己中意的环境构建方式pipenv install --python=/Users/howie6879/anaconda3/envs/python36/bin/python3.6 --skip-lock# 运行前需要填好配置文件pipenv run python w2b/run.py
随后,会有日志输出:
[w2b] pipenv run python w2b/run.pyLoading .env environment variables…[2019:09:13 09:16:35] INFO w2b 目标表 Chat_f965739b676114fxxxxc394322e1e826 存在于库 msg_5.db
好,代码跑起来后,接下来电脑上登录你的小号(也就是接收微信文章的微信号),然后在手机上登录发送文章的微信号,最终成功就和文章一开始的动图一样了~
如果觉得对你有帮助,点个好看然后帮忙转发一下吧。
References
[1] SQLCipher: [https://github.com/sqlcipher/sqlcipher](https://github.com/sqlcipher/sqlcipher
[2] 问答: https://www.v2ex.com/t/466053#reply15
[3] X callback url Scheme documentation: https://bear.app/faq/X-callback-url%20Scheme%20documentation/
[4] w2b: https://github.com/howie6879/w2b返回搜狐,查看更多