chrome 插件 抓取网页qq聊天记录(Python解密和解析微信导出聊天文件获取-p$)

优采云 发布时间: 2021-10-02 04:02

  chrome 插件 抓取网页qq聊天记录(Python解密和解析微信导出聊天文件获取-p$)

  介绍

  最近接到公司的任务,获取微信聊天记录。我想,这应该是不可能的。毕竟,微信被这么多人使用。如果可以轻松导出聊天记录,也不算不科学。另外,现在安卓手机基本上都很难root了。于是我在网上搜索了相关资料。发现真的可以导出聊天记录。可以通过sqlite的db浏览器查看。但是如果全部手动完成,就有点麻烦了。所以考虑使用Python来实现解密和解析。

  导出微信聊天db文件,获取db key。打开微信命令行,运行lldb -p $(pgrep微信),在lldb中输入br set -n sqlite3_key,回车或者在lldb中输入c,回车后扫码登录微信此时返回lldb界面,输入memory read --size 1 --format x --count 32 $rsi,回车

  命令行回显结果

  0x0: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd

  0x8: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd

  0x0: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd

  0x8: 0xab 0xcd 0xef 0xab 0xcd 0xef 0xab 0xcd

  忽略左边的地址(0x0:, 0x8:),从左到右,从上到下,将0xab 0xcd形式的数据放在一起,然后把“0x”、空格、换行符全部去掉,得到64 characters of characters String,这是微信数据库的key

  可以遇到的问题(来自网上,我在使用过程中没有遇到这个问题))

  *.db文件必须在其他PC或Mac上登录微信才能关闭,否则里面的聊天记录不是最新的;当然也可以强制调用wal_checkpoint,不过作为本地方法,在另一台电脑上登录微信就可以了。

  那么 wal_checkpoint 是什么?是一个sqlite命令,可以参考:#pragma_wal_checkpoint,不想看英文的请百度一下!

  sqlite的数据库浏览器

  db数据库可视化工具,打开需要查看的数据库文件:

  

  截图 2019-10-17 PM6.43.43.png

  先输入0x,然后复制上面得到的key。由于编码问题,复制时可能打不开。可以先把key复制到软件执行sql语句的地方,再复制。过一会python会读取db数据库,参考上面的设置参数。

  python解密db数据库

  这里需要使用sqlite来操作数据库,而sqlite本身不支持加解密,所以这部分需要我们自己完成,不过网上有开源库。

  加解密db库-pysqlcipher3。加密算法库-sqlcipher。微信db加密库-wcdb

  解密

  import pysqlcipher3.dbapi2 as sqlite

import config as cf

def decrypt(path, fileName):

# ———————————————————————————————————数据库操作———————————————————————————————————

# 参考:https://www.sqlite.org/pragma.html#pragma_wal_checkpoint

# 连接数据库如果文件不存在,会自动在当前目录创建:

db = sqlite.connect(path + fileName)

# 创建一个Cursor:

db_cursor = db.cursor()

# ————————————————————————————————————解密数据DB———————————————————————————————————

# sqlcipher加密解密参考:https://github.com/sqlcipher/android-database-sqlcipher/issues/94

# sqlcipher开源库地址:https://github.com/sqlcipher/sqlcipher/issues

# sqlcipherApi:https://www.zetetic.net/sqlcipher/sqlcipher-api/

db_cursor.execute("PRAGMA key='" + cf.DB_KEY + "';")

db_cursor.execute("PRAGMA cipher_compatibility=3;")

db_cursor.execute("PRAGMA cipher_page_size=1024;")

db_cursor.execute("PRAGMA kdf_iter=64000;")

db_cursor.execute("PRAGMA cipher_hmac_algorithm=HMAC_SHA1;")

db_cursor.execute("PRAGMA cipher_kdf_algorithm=PBKDF2_HMAC_SHA1;")

# 将解密文件导入新的DB文件

decrypt = cf.DB_OUT_PATH + 'decrypt_' + fileName

db_cursor.execute("ATTACH DATABASE '" + decrypt + "' AS db_de KEY '" + cf.DB_NEW_KEY + "'; -- empty key will disable encryption")

db_cursor.execute("SELECT sqlcipher_export('db_de');")

db_cursor.execute("DETACH DATABASE db_de;")

db_cursor.close()

  更多加密参数设置参考:sqlcipher使用文档

  将数据库导出为json

  import pysqlcipher3.dbapi2 as sqlite

import config as cf_wx

import dbToJson

def parse(path, fileName):

db = sqlite.connect(path + fileName)

db_cursor = db.cursor()

all_table = db_cursor.execute("SELECT name FROM sqlite_master WHERE type = 'table';").fetchall()

print(all_table)

for x in all_table:

table_name = x[0]

print("Searching", table_name)

try:

t = db_cursor.execute('SELECT * FROM ' + table_name + ';')

dbToJson.tableToFile(db_cursor,table_name)

print('\n')

except BaseException as e:

print(e)

continue

db_cursor.close()

db.close()

  联系

  查看聊天消息数据,发现聊天消息数据表无法关联到对应的聊天人,因为消息表中没有存储正在聊天的人。如果无法联系到相应的人,那岂不是很糟糕。那么这里就要用到联系人数据库了,key和上面一样。打开联系人的数据视图:

  

  屏幕截图 2019-10-17 PM7.30.41.png

  这是*敏*感*词*之一。执行“m_nsUsrName”的32 MD5后,我们得到32作为字符串。在person字符串前加“Chat_”就是该联系人在消息数据库中的表名。这样就可以通过这个字符串在消息数据库中找到对应的聊天消息。

  其他图书馆

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线