分享好友 最新资讯首页 最新资讯分类 切换频道
PC微信逆向:两种姿势教你解密数据库文件
2024-12-29 16:29

                                                                                   文章目录

PC微信逆向:两种姿势教你解密数据库文件

  • 定位数据库文件密码
    • 定位数据库密钥的思路
    • 获取数据库密钥的实战分析
      • CreateFileW断点
      • 常见错误
      • 排查堆栈
        • 排查堆栈地址
      • 单步跟踪
    • 用代码实现解密数据库
      • 编译选项
      • 解密代码
      • 实际效果
    • 动态获取数据库密钥
  • 定位数据库文件句柄
    • 关于微信数据库句柄
    • 获取微信数据库句柄的思路
    • 定位微信的数据库句柄

定位数据库文件密码  微信的数据库使用的是sqlite3,数据库文件在C:UsersXXXDocumentsWeChat Files微信账号Msg这个路径下

  所有的数据库文件都是经过AES加密的,AES的密钥是32位,而且所有数据库文件共用一个密钥,我们需要找到那个AES密钥才能进行解密,然后才能对数据库文件进行操作。
定位数据库密钥的思路  微信在登录时肯定要从数据库文件中获取历史聊天记录加载到程序中,然后我们才能看到之前的聊天记录。那么在微信读取数据库文件之前肯定要先打开数据库文件,所以CreateFile这个API就是我们的切入点。
  在API断下之后怎么去找数据库的密码呢?可以根据AES的密钥长度为32位这个线索,32也就是十六进制的20,时刻注意20这个数字
  另外,在解密数据库的call中至少需要两个参数,一个是AES的密钥,另外一个是需要解密的数据库文件的路径。
  还有一种方法是在内存中搜索数据库文件的名字,然后下访问断点。这种方案也是可行的。
获取数据库密钥的实战分析CreateFileW断点

  打开微信,手机不要点击登录,用OD附加微信,在CreateFileW函数下断点,下好断点之后在手机上确认登录

  在CreateFileW的参数中找一个FileName为xxx.db的,我们要在微信访问这个数据库文件的时候断下,然后从这里开始往下跟。一直跟到有数据库的密码的地方
常见错误

  如果出现了这个错误,需要修改一下设置

  将StrongOD和OD本身取消忽略所有异常,这个错误是因为多线程访问冲突引起的。
排查堆栈  在CreateFileW的返回地址下断,直接F9运行,CreateFileW这个API我们是不需要看的

  CreateFileW断点断下来,那么现在应该怎么跟呢?肯定不能一直往下单步,虽然单步也能达到目标。
  分析一下现在的状况,这个时候微信的数据库处于一个还未初始化,但是即将初始化的状态,我们可以在堆栈或者堆栈附近的地址找到关于数据库初始化相关的函数。然后在微信初始化完数据库之后单步往下跟。这样能省去很多麻烦
排查堆栈地址

  直接找到第四个返回地址

  这个函数传入了三个参数,虽然三个参数都没有什么价值。但是这个call稍微往下拉,你会发现一个字符串

  这个函数的作用应该就是用来提示错误的,一般比较大的工程都会将错误提示信息写成一个函数,报错的时候会提示哪一个模块的哪一个cpp的哪一行出错了,以便最快定位到错误点。
  再往上看会发现一个je,用来跳过这个错误

  根据这个错误提示的内容,我们现在可以百分百的确定打开数据库的操作已经完成
单步跟踪

  因为微信的数据库文件不止一个,所以我们不需要重启微信。直接在这个函数下断点,然后取消剩下的所有断点,按F9运行,程序断下。然后F8单步

  这里是我们遇见的第一个函数,看参数就知道不是我们想要的了,跳过 继续往下

  第二个函数将数据库名和一个保存零的指针入栈,也跳过

  第三个函数就很可疑了,这个call将三个参数压入堆栈,其中eax是一个结构体,里面保存一个地址和0x20这个数字,AES的密钥正好是32位的,也就是十六进制的0x20。
  数据窗口跟随,前两行0x20个字节就是数据库的密钥了

  各个参数含义如下

用代码实现解密数据库编译选项

  工程需要包含OpenSSL的相关文件
解密代码  这份代码原作者是谁我已经不记得了 反正被拷来拷去拷了很多次了

 

实际效果  运行程序

  最后生成的dec_ChatMsg.db就是解密出来的文件,对比一下解密前后的文件

  解密前

  解密后 看到这个MAGIC头,不用验证我就知道已经解密成功了。接下来还是验证一下结果

  用Navicat新建一个SQLite连接

  选择解密后的数据库

  可以看到所有的表数据已经出现了。解密完成
动态获取数据库密钥  找到了密钥之后就结束了吗?这个密钥目前是写死的,如果变化的话,我们又要重新找,然后再次输入。所以我们需要动态获取到数据库密钥。想要动态获取数据库密钥,就必须定位到数据库密钥的基址。步骤如下
  直接在CE中搜索之前找到的密钥

  接着依次搜索这两个地址,找到了一个绿色的基址

  这个基址以指针的形式保存了微信数据库的密钥,这个地址就是我们要的微信密钥的基址了。
  动态获取数据库密钥的代码如下

 

定位数据库文件句柄  在拿到数据库密码之后,我们还需要对数据库文件进行解密,解密完成之后才能查询数据库。那么有没有更好的方法可以不需要获取密码也不需要解密数据库文件就能直接进行数据库的查询操作呢?当然是有的,就是通过微信的数据库句柄
关于微信数据库句柄  微信的数据库句柄在一些地方会经常用到,比如查询好友的详细信息的时候,需要传入一个数据库的句柄。然后通过句柄去查询信息,最后返回好友详细信息。
  如果我们直接拿到密码,然后对数据库进行解密,再查询好友信息,这种方法当然也是可以的。但是拿到的数据并不是实时的。
  如果我们拿到这个数据库的句柄,就能实时的去查询好友的详细信息了,而且也不需要进行解密和获取数据库密码的操作了。
获取微信数据库句柄的思路  找微信数据库句柄的思路和找数据库密码的思路是一样的,微信在点击登录的时候,肯定是要打开本地的数据库,然后获得一个句柄,所以我们可以通过在CreateFileW下断点,接着单步跟踪,就能找到数据库的句柄
定位微信的数据库句柄

  在CreateFileW下断,当微信读取数据库文件时让程序断下。

  接着来到CreateFileW的返回地址处,点击K查看调用堆栈


  经过排查,这个地址的call最像我们需要的找的call,在这个call的地址下断,点击F9运行

  程序断下,此时ecx指向数据库文件的路径


  edx指向一个空的缓冲区,那么这个就非常像我们要找的call

最新文章
C.C虎虎漫画:食堂排队的N种状态
饭卡没钱:out of money in the meal card(此类囧事儿相信娃们都干过)抱怨菜不好:complaining about the food(谁都有过嫌弃
AE脚本:AI.T - Artificial Intelligence Titles_人工智能标题(超10万种变化)
你有多少时间浪费在后期效果中建立标题动画?如果您不再需要花费数小时来按关键帧调整关键帧,并且每次客户请求更改时重做几乎所
DedeCMS织梦程序被挂黑链原因及检查方法
目前我们选择建站程序的时候,个人网站、博客的话大家都喜欢选择WP或者ZBLOG程序居多,中大型内容系统的话我们选择帝国CMS或者De
ai回复机器人在线
ai智能语音外呼系统,是一种基于人工智能技术的新型外呼系统。 它可以自动拨打电话并记录通话过程和结果,帮助企业筛选意向客户
discord苹果手机版注册教程,discord注册下载教程
Discord苹果手机版注册教程,Discord注册下载教程在当今信息社会,社交网络平台如雨后春笋般出现。而在这种大环境下,Discord作
AI机器人 1.0.3
“AI机器人”是一款能够开展对话和聊天的智能应用。该应用使用先进的自然语言处理算法来生成人类可理解的对话,并快速响应用户的
Bank4.0时代智慧网点转型系列一:6年来走过的转型弯路
对于A股与H股上市银行,大型机构投资者尤其海外价值投资者,侧重于研究一家银行的战略、盈利模式以及精细化管理程度。映射于银行
ChatGPT成为一款搜索引擎
OpenAI于11月1日凌晨在ChatGPT中正式推出ChatGPT搜索功能,标志着ChatGPT成为一款人工智能网络搜索引擎。OpenAI长期以来一直在积
AI+化学|利用强化学习增强多步逆合成
逆合成路线设计是有机合成中的一项经典任务,也和药物设计等应用领域息息相关。自从深度学习兴起以来,许多基于神经
2022最新qq男生霸气说说超拽霸气十足 请你好好说话
  1.数学已跪,英语不会,化学已醉,语文没背,物理已废,而我已睡。  2.别人都是手牵手,我却手里牵条狗,走一走,瞅一瞅,