am928 发表于 2025-3-14 19:31:05

如何破解微信聊天数据库并导出聊天记录?机灵鹤教你完整教程

大家好,我是机灵鹤。

今天教大家如何破解微信聊天数据库,导出自己的微信聊天记录。

以下教程是以操作系统和安卓手机为基础的,苹果用户或许不适用。

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]
查看完整版本: 如何破解微信聊天数据库并导出聊天记录?机灵鹤教你完整教程