如何破解微信聊天数据库并导出聊天记录?机灵鹤教你完整教程
大家好,我是机灵鹤。今天教大家如何破解微信聊天数据库,导出自己的微信聊天记录。
以下教程是以操作系统和安卓手机为基础的,苹果用户或许不适用。
1. 准备工作
需要准备以下工具和运行环境。
1.1 安卓模拟器
微信的数据库文件处在手机的系统目录当中。只有经过 root 处理后的手机,才能够对其进行访问。
因为 root 手机存在一定的技术门槛,同时还伴有变砖的风险。并且 root 之后,手机的安全性会降低,甚至会失去保修资格。
所以建议新手,若没有搞机经验,就使用 root 后的安卓模拟器来替代。
我这里使用的是 逍遥模拟器 。
下载地址:
1.2 数据库软件
微信数据库导出以后,需要通过数据库软件 .exe 打开。
下载地址:
1.3 安装软件
1. PC 版微信
可以通过备份聊天记录,然后将其恢复,从而把聊天记录转移到已经 root 后的安卓模拟器里,这样便于后续进行导出操作。
下载地址:
2. 安卓版微信
在安卓模拟器中,通过应用商店或浏览器,下载并安装 微信。
下载地址:
3. re 文件管理器
在安卓模拟器里,利用应用商店或者浏览器,将 re 文件管理器进行下载并完成安装。
因为模拟器自带的文件管理器无法打开系统根目录,所以需要安装 re 文件管理器。
1.4 Java 环境
要破解微信数据库密码,就需要运行一段 java 代码,因而需要安装 java 运行环境。
安装教程:
2. 破解流程
总体流程分为三步:
https://img0.baidu.com/it/u=2722114213,1755946753&fm=253&fmt=JPEG&app=138&f=JPEG?w=1045&h=500
进入手机系统目录,将微信数据库拷贝出来
破解数据库密码
打开数据库,将聊天记录数据表导出
2.1 导出聊天记录数据库
本节教程讲解在手机未获取 root 权限的情况下,怎样借助安卓模拟器来导出聊天记录文件。已经获取手机 root 权限的朋友能够直接跳转至 2.1.3 拷贝数据库文件。
2.1.1 备份聊天记录至电脑
先登录 PC 版微信,接着点击左下角的“备份与恢复”,然后选择“备份聊天记录至电脑”。
2.1.2 聊天记录恢复至模拟器
启动安卓模拟器并开启 root 模式。
在模拟器上登录安卓版微信,接着利用 PC 版微信来进行聊天记录的恢复。
注:模拟器登录微信后,PC版微信可能需要重新扫码登录。
2.1.3 拷贝数据库文件
在安卓模拟器里,打开 re 文件管理器这个软件,接着进入到系统的根目录。
此时,我们需要找到两个文件并导出。
首先打开 /data/data/com..mm/ 文件夹。
找到 .cfg 文件并导出,这是我们需要找的第一个文件。
接着进入一个文件夹,该文件夹的名字是一长串随机字母。在这个文件夹中找到.db 文件并将其导出,此.db 文件就是我们需要找的第二个文件。
每个模拟器导出文件的方法可能不一样,而我在这里使用的是逍遥模拟器。
将文件拷贝至共享目录 //0// ,这样就能导出文件,导出的文件位于电脑的下载/逍遥安卓下载文件夹里。
这里简单解释一下,这两个文件是什么。
2.2 破解数据库密码
打开.exe 这个文件,接着点击 File 选项,然后选择 Open ,从而打开.db 。
可以发现,数据库是加密的,需要输入密码才能打开。
https://img2.baidu.com/it/u=85236803,925700398&fm=253&fmt=JPEG&app=138&f=JPEG?w=554&h=431
查阅资料后得知,数据库的密码生成规则是:
把手机的 IMEI 值和微信的 uin 值进行拼接,接着对拼接后得到的字符串计算 MD5,然后取出 32 位小写值的前七位,这前七位就是数据库密码。
举个例子:
假设 IMEI 值和 uin 值,将这两个值直接拼接起来得到 56789,接着对其进行 md5 加密,得到的 32 位小写的值为,然后取出这个值的前 7 位数,这前 7 位数就是数据库密码 。
IMEI 和 uin 值具体的含义我们无需关心。我们只需知晓,这两个值被保存在.cfg 文件里。
以下代码能够从.cfg 文件里把 IMEI 值和 uin 值提取出来。
<p><pre class="code-snippet__js" data-lang="swift"> <code><span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> java.io.FileInputStream;</span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">import</span>java 中的 io 包下的 FileNotFoundException 这个异常类。</span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> java.io.IOException;</span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> java.io.ObjectInputStream;</span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">import</span> java.util.Map;</span></code><code><span class="code-snippet_outer"> </span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">public</span> <span class="code-snippet__class"><span class="code-snippet__keyword">class</span> <span class="code-snippet__title">MapTest</span> </span>{</span></code><code><span class="code-snippet_outer"> </span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment">/**</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> * @param args</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__comment"> */</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__keyword">public</span> <span class="code-snippet__keyword">static</span> void main(<span class="code-snippet__type">String</span>[] args) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">请提供需要改写的句子呀,你没有给出具体的横线下的句子呢。</span></span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">try</span> {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">用你自己的 systemInfo.cfg 的路径来替换(将其替换为你自己的 systemInfo.cfg 的路径)</span></span></code><code><span class="code-snippet_outer"> <span class="code-snippet__type">FileInputStream</span> file = new <span class="code-snippet__type">FileInputStream</span>(<span class="code-snippet__string">"E:/systemInfo.cfg"</span>);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__type">ObjectInputStream</span> mObjectInputStream = new <span class="code-snippet__type">ObjectInputStream</span>(file);</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__type">Map</span> <span class="code-snippet__built_in">map</span> = (<span class="code-snippet__type">Map</span>mObjectInputStream 完成读取对象的过程。</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__keyword">for</span> (<span class="code-snippet__type">Object</span> key: <span class="code-snippet__built_in">map</span>.keySet()) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__type">System</span>.out.<span class="code-snippet__built_in">println</span>(<span class="code-snippet__string">"key: "</span> + key + <span class="code-snippet__string">", value: "</span> + <span class="code-snippet__built_in">map</span>.<span class="code-snippet__keyword">get</span>(key));</span></code><code><span class="code-snippet_outer"> }</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">// System.out.println(map);</span></span></code><code><span class="code-snippet_outer"> } <span class="code-snippet__keyword">catch</span> (<span class="code-snippet__type">FileNotFoundException</span> e) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">请提供需要改写的句子呀,你没有给出具体的内容呢。</span></span></code><code><span class="code-snippet_outer"> e.printStackTrace();</span></code><code><span class="code-snippet_outer"> } <span class="code-snippet__keyword">catch</span> (<span class="code-snippet__type">IOException</span> e) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">// TODO Auto-generated catch block</span></span></code><code><span class="code-snippet_outer"> e.printStackTrace();</span></code><code><span class="code-snippet_outer"> } <span class="code-snippet__keyword">catch</span> (<span class="code-snippet__type">ClassNotFoundException</span> e) {</span></code><code><span class="code-snippet_outer"> <span class="code-snippet__comment">// TODO Auto-generated catch block</span></span></code><code><span class="code-snippet_outer"> e.printStackTrace();</span></code><code><span class="code-snippet_outer"> }</span></code><code><span class="code-snippet_outer">}</span></code><code><span class="code-snippet_outer">}</span></code></pre></p>
首先创建一个文本,接着将其重命名为.java 。然后把上面的代码段复制到这个文档里,最后进行保存。同时要注意修改代码的第 16 行,把它改成自己的.cfg 文件路径。
接着打开命令行工具,接着进入到.java 所在的目录,通过输入以下命令来运行。
<p><pre class="code-snippet__js" data-lang="properties"> <code><span class="code-snippet_outer"><span class="code-snippet__attr">javac</span> <span class="code-snippet__string">MapTest.java</span></span></code><code><span class="code-snippet_outer"><span class="code-snippet__attr">java</span> <span class="code-snippet__string">MapTest</span></span></code></pre></p>
即可打印出 .cfg 文件中的键值对信息。
其中,一个键是 1,它对应的值是 uin 值;另一个键是 258,它对应的值是 IMEI 值。
如果没有键 258,则 IMEI 值取默认。
MD5 值计算:
2.3 聊天数据表导出
前一步之后,我们成功破解了数据库.db 的密码,进而打开了该数据库。
接下来,导出需要的聊天记录数据表。
点击“File”,接着点击“->”,再点击“Table as CSV file”。然后选择“Table name”为具体的某个内容,最后点击相应的按钮完成导出。
设置导出的文件名为 .csv ,然后保存即可。
聊天记录的 csv 文件可以用 excel 直接打开查看。
至此,我们成功导出了微信的聊天记录文件。
后续你能够把它整理排版成文档并留存下来,同时也可以编写脚本来进行数据分析。
具体怎么玩就看你自己的想法了。
3. 参考资料
【1】
【2】
【3】
页:
[1]