目前针对手机微信数据恢复,已经有较为成熟的方法,商业的手机取证工具一般都能不同程度地支持。本文将以Android微信为例探讨判断微信聊天记录是否被删除过的方法,这一方法也可以用于检验取证工具恢复的聊天记录是否完整。

Android微信默认路径为data分区下的“datacom.tencent.mmMicroMsg”目录,用户及应用产生的大部分数据都在此目录下,但用户产生的多媒体数据则保存在SDCard分区的“tencentMicroMsg”目录下。在以上路径下,每个登录的帐号会产生一个以某MD5值(该值也和微信账号有关系,详情网上可以搜到)命名的文件夹,聊天记录、朋友圈信息、收藏记录全部位于各账号MD5值目录下。

Android微信聊天记录保存在数据库文件“EnMicroMsg.db”中,收藏信息保存在数据库文件“enFavorite.db”,朋友圈信息保存在数据库文件“SnsMicroMsg.db”中。“EnMicroMsg.db”和“enFavorite.db”都是加密的,密钥为(手机IMEI+微信uin)取MD5值后截取前7位,详细资料可以从网上搜到。

有了以上基础,可能大家会想到,既然是加密后的SQLite数据库,又知道加密规则,解密后直接进行SQLite数据库恢复不就可以了吗?实际情况还真没有这么简单,如何找到解密参数是第一个问题(本文暂不讨论),从Android微信5.3.1版本开始,删除操作使用了特殊的指令,通俗地说就是删除后在原记录处使用“0”进行填充。像短信、通讯录一样使用SQLite数据库原理对Android微信聊天记录进行恢复是行不通的。

下面进入正题。

将“EnMicroMsg.db”文件解密后,可以发现聊天记录保存在表“message”中。主要字段有“msgId”、 “status”、 “isSend”、 “createTime”、 “talker”、 “content”等。如图1所示。

图1
图 1

“status”记录了消息阅读状态,“isSend”记录了消息是发送还是接收的,“createTime”记录了消息时间,“talker”记录了消息的创建者(如果是群消息,则是群聊ID,具体消息创建者标示在“content”字段内),“content”记录了消息的详细内容。

本文的主角是“msgId”字段。该字段记录的是消息在本地的序号,该序号是自增长的,正常情况下,所有对话中,时间上相邻的两条记录“msgId”字段值必定是相邻的。所有记录按“msgId”字段排序后,如果发现有相邻的记录“msgId”字段值不连续,则说明此处有记录被删除了,具体删除的条数也可以判断出来。

图2
图 2

我们再观察一下上面的截图。按“msgId”字段排序后,第11786条记录的“msgId”字段值为11822,而第11787条记录的“msgId”字段值为11824,由此可以推断,这两条记录之间本还有一条记录。第11786条记录的“createTime”字段值“1495527020001”转换成可视化时间为2017-05-23 16:10:20 (UTC+08:00),第11787条记录的“createTime”字段值1495527161000转换成可视化时间为2017-05-23 16:12:41 (UTC+08:00)。即在本例中,2017年5月23日16:10:20之间有一条聊天记录被删除。

总结及说明:

  1. 可以通过“EnMicroMsg.db”表“message”的“msgId”字段值来判断是否有聊天记录被删除。
  2. 本文介绍的方法无法判断被删除记录的创建者和接收对象,也无法判断被删除的具体内容。
  3. 本文讨论的“删除”操作不包括“撤销”,撤销的消息记录还在,只是“content”字段值被改成了“‘xxx’撤回了一条消息”。

本文最早发布于本人微信公众号“取证杂谈”,发布日期为2017年7月9日。

标签: 微信, SQLite

添加新评论