制作微信聊天记录词云,python编程超强实战,获取微信数据库密码
前言
春暖花开,万物复苏,又到了一年里恋爱的季节。情人节,女神节,每个节日都是秀恩爱的好时光,不过香奈儿、SKII这些事件俗物已经不能满足程序员们表达爱情的方式了。网上关于这方面的文章也很多,基本上的思路都是通过手机root,获取IMEI+UIN,通过MD5加密,前七位为EnMIcroMsg.db的密码。这种方法笔者也尝试过,也许是微信修改了加密方式,总之以失败告终。幸好,我们每个程序员对于技术都是锲而不舍的追寻着,终于让我找到一套能破译微信数据的方法,配合python编程,只要有一点点编程基础就能给女朋友一个大大的惊喜,何乐而不为呢。言归正传,让我们一同来感受编程的魅力。
工具准备
1、python
2、Mumu模拟器
3、adb
4、frida
5、sqlcipher
进入实战
制作微信词云的我们基本上可以分为两步走,第一步为获取微信数据库并破解密码,第二步将得到的聊天记录使用python进行加工制作成词云。
1、下载mumu模拟器、在模拟器中下载微信
2、使用windows客户端版的微信进行备份,点击备份聊天记录至电脑
3、手机端选择备份的对象
4、导出完毕后打开模拟器,登录模拟器的微信,勾选我们刚刚导出的聊天记录,并在模拟器上点击开始恢复。
至此,我们需要的聊天记录已经备份到模拟器上了,下一步只需要找到EnMicroMsg.db数据库并破译数据库密码
5、安装adb,大家可以网上下载也可以用笔者提供的
链接:https://pan.baidu.com/s/1EUXBQ6KBP7VXa0FiEgybxA
提取码:th8j
将adb放置在c盘任意为止,添加环境变量至path
6、frida是一个轻量级别的hook框架。官网介绍:Dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers.
frida由两部分组成:一部分是运行在系统上的交互工具frida CLI,另一部分是运行在目标机器上的代码注入工具frida-server。pc端安装frida 和frida-tools,输入win+r,cmd进入dos界面,如果你已经安装了python和pip,直接用命令行安装
pip install frida
pip install frida-tools
安装完之后用查看安装版本,好去官网下载对应的frida-server,frida-server 服务端版本下载,https://github.com/frida/frida
在dos界面启动adb
adb start-server #启动adb adb connect 127.0.0.1:7555#连接模拟器,mumu模拟器端口7555,其他软件请自行百度 adb devices #查看连接设备
本地解压frida-server,通过adb把它放到模拟器上
adb C:\push frida-server-15.1.7-android-x86_64 /data/local/tmp #上传frida-server
adb shell #进入Android系统
进入frida-server目录:
cd /data/local/tmp
添加权限:
chmod 777 frida-server-15.1.7-android-x86_64
启动:
./frida-server-15.1.7-android-x86_64
新开一个dos界面,端口转发,验证
adb forward tcp:27042 tcp:27042 #端口转发
adb forward tcp:27043 tcp:27043 #端口转发
frida-ps -U #验证,如果显示出进程列表说明启动成功
使用frida获取EnMicroMsg.db的密码,运行hook.py文件,代码如下
import frida import sys jscode = """ Java.perform(function(){ var utils = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); // 类的加载路径 utils.openDatabase.overload('java.lang.String', '[B', 'com.tencent.wcdb.database.SQLiteCipherSpec', 'com.tencent.wcdb.database.SQLiteDatabase$CursorFactory', 'int', 'com.tencent.wcdb.DatabaseErrorHandler', 'int').implementation = function(a,b,c,d,e,f,g){ console.log("Hook start......"); var JavaString = Java.use("java.lang.String"); var database = this.openDatabase(a,b,c,d,e,f,g); send(a); console.log(JavaString.$new(b)); send("Hook ending......"); return database; }; }); """ def on_message(message,data): #js中执行send函数后要回调的函数 if message["type"] == "send": print("[*] {0}".format(message["payload"])) else: print(message) process = frida.get_remote_device() pid = process.spawn(['com.tencent.mm']) #spawn函数:进程启动的瞬间就会调用该函数 session = process.attach(pid) # 加载进程号 script = session.create_script(jscode) #创建js脚本 script.on('message',on_message) #加载回调函数,也就是js中执行send函数规定要执行的python函数 script.load() #加载脚本 process.resume(pid) # 重启app sys.stdin.read()
运行结果如下,至此,成功破译密码:
将EnMicroMsg.db文件从模拟器复制到电脑上
adb pull /data/data/com.tencent.mm/MicroMsg/xxxxxxxxxxxxx/EnMicroMsg.db C:\XXXX
使用 SqlCipher 工具打开EnMicroMsg.db,sqlcipher下载,
链接:https://pan.baidu.com/s/1G5L9OXhA0mhQe2KGEuN98Q
提取码:pqxq
打开并用table from csv file导出数据库,导出的数据记得用utf-8保存一下,否则程序读取时候会报错
7、使用python将得到的数据制作成词云
首先对得到的数据进行清洗,得到真正的聊天记录
import pandas import csv, sqlite3 conn= sqlite3.connect('chat_log.db') # 新建数据库为 chat_log.db df = pandas.read_csv('chat_logs.csv', sep=",") # 读取我们上一步提取出来的csv文件,这里要改成你自己的文件名 df.to_sql('my_chat', conn, if_exists='append', index=False) # 存入my_chat表中 conn = sqlite3.connect('chat_log.db') # 连接数据库 cursor = conn.cursor() # 获得游标 cursor.execute('select content from my_chat where length(content)<30') # 将content长度限定30以下,因为content中有时候会有微信发过来的东西 value=cursor.fetchall() # fetchall返回筛选结果 data=open("聊天记录.txt",'w+',encoding='utf-8') for i in value: data.write(i[0]+'\n') # 将筛选结果写入 聊天记录.txt data.close() cursor.close() conn.close() # 关闭连接
然后,进行词云分析,这里的代码比较简单,大家可以根据自身需要进行编程。jieba、wordcloud、imageio这三个库使用pip安装经常出错,建议可以下载安装包安装。
安装过程会提示需要安装"Microsoft C++ Build Tools",visualcppbuildtools_full.exe安装容易出错,建议下载完整版:
链接:https://pan.baidu.com/s/1MIDa-ZbmfYBU9H840x7DoA
提取码:i1yr
import jieba import wordcloud import imageio mask = imageio.imread("zgdt.jpg") #词云图片,按自己喜好修改 f = open("聊天记录.txt", "r", encoding = "utf-8") #刚才清洗出来的聊天记录 t = f.read() f.close() ls = jieba.lcut(t) txt = " ".join(ls) w = wordcloud.WordCloud(font_path = "msyh.ttc", mask = mask, width = 1000, height = 700, background_color = "white") w.generate(txt) w.to_file("grwordcloud.png") #生成词云图片
这样我们词云就制作完成了,看一下效果,一首精忠报国送给大家!