如今的微信、QQ已经成为用户使用最多的社交软件。不管是工作上还是生活上,都会通过微信来传递信息,给我们工作与生活带来了极大的便利。微信、QQ的普适也衍生出了很多的应用场景,包括目前我们可以看到的国内华米OV厂商推出的系统自带QQ、微信分身以及市面上各种各样的第三方QQ,微信应用分身。正因为微信、QQ的普及使用,对微信、QQ删除数据恢复的需求也日益增加。
通过对手机内部文件结构的研究(本文主要以安卓系统为例),我们发现官方微信,系统自带微信分身,第三方微信分身,存储路径是存在区别的。区别如下:
① 官方微信数据库存放位置:
data/data/com.tencent.mm/MicroMsg/32位字符串文件夹
如果对APP内部文件系统及数据库路径不熟悉,盘古石手机取证系统可对数据库路径进行显示,对我们掌握各APP内部文件系统结构和数据库研究非常有帮助。
②系统自带微信分身数据库存放位置(不同品牌手机稍有差异):
data/user/999/com.tencent.mm/MicroMsg/32位字符串文件夹或
data/user/10/com.tencent.mm/MicroMsg/32位字符串文件夹
③第三方微信分身数据库存放位置(由于是第三方,路径可能没有规则可言):
data/data/?/com.tencent.mm/MicroMsg/32位字符串文件夹
④官方微信媒体文件存放位置:
data/media/0/tencent/MicroMsg/32位字符串文件夹
⑤系统自带微信分身媒体文件存放位置:
data/media/999/tencent/MicroMsg/32位字符串文件夹或
data/media/10/tencent/MicroMsg/32位字符串文件夹
目前随着取证技术的发展,通过对分身数据存储路径的了解,我们利用高级备份是可以获取到部分品牌手机的微信分身数据,比如苹果、华为、OPPO、VIVO等。
众所周知微信数据库是加密的,如果我们需要探寻微信里的数据,首先必须了解数据库的解密方式,下面一起来了解微信数据库的解密方法。
首先我们要了解数据存储路径中最后的32位字符串文件夹对应的是不同的微信账号的数据。32位字符串其实是用户的hash值,计算方法是:MD5(mm + uin),即在UIN值前加上字母mm只有计算MD5值。
微信数据库的密钥由IMEI+UIN计算MD5值后,取哈希值前7位。
存放IMEI的来源文件:
1./data/data/com.tencent.mm/shared_prefs/DENGTA_META.xml;
2./data/data/com.tencent.mm/MicroMsg/CompatibleInfo.cfg
3.默认IMEI:1234567890ABCDEF
存放UIN的来源文件:
1./data/data/com.tencent.mm/shared_prefs/app_brand_global_sp.xml
2./data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml
3./data/data/com.tencent.mm/shared_prefs/com.tencent.mm_preferences.xml
获取密钥后,我们即可解开数据库查看内容,前边我们已经获取数据库路径,可导出数据库文件后,通过sqlcipher.exe手工解密查看。
我们还需要知道数据库里到底能查看到哪些内容。
我们列举聊天记录,可以看看数据表里相关信息。
关于微信删除数据恢复
首先我们应该了解微信聊天内容是以数据库形式存放的,它所使用的是sqlite轻量级数据库。因此数据库存放的是文字性聊天内容,而涉及的语音,视频,图片等多媒体文件内容是单独存放在sdcrad中的,并且通过相关存储规则关联数据库。因此关于微信的数据恢复就分为两种类型:记录级恢复和文件级恢复。
1.记录级恢复
在安卓微信7版本前用户删除微信数据时,只对部分消息进行了针对性的删除,实际上仅仅删除了EnMicroMsg.db文件message数据表中的局部内容,由于没有覆盖新数据,这种情况下是可以通过SQLite恢复工具直接恢复。
但是在7版本后因腾讯对安卓版本实行了删后写0覆盖的机制,这种机制造成了无法直接从主数据库文件进行恢复的境况。目前经过研究发现仍有可能存在历史已删除数据。
EnMicroMsg.db-wal 预写日志,微信的主数据EnMiciroMsg.db采用的是Wal预写日志方式,我们来了解下该预写日志的工作原理。
wal文件是预写日志文件,这个文件主要是记录数据库的修改。当我们对微信某条聊天内容进行删除的时候,它是不会直接写入到主数据库文件当中,而是暂存写入到这个预写日志文件当中,在适当的时候才会写入到主数据库中。我们假设删除和某个聊天对象的部分内容,如删除“内容2”,此时是直接在日志文件进行删除,当回滚的时候原始数据库不会作删除动作,但当提交的时候会将预写日志执行删除命令后的内容写入到原始数据文件当中,此时原始数据库经过写入后,只有“内容1”,但是预写日志文件还是存在删除的“内容2”,也就是说删除的“内容2”我们可以通过Wal预写日志恢复回来,这也是目前微信删除恢复的主要方式。
安卓微信在建立EnMicroMsg.db文件的同时会生成一个索引文件,目的在于方便数据检索,相当于对产生过的数据会有一个类似缓存的备份。早期版本的索引文件为IndexMicroMsg.db,目前6.6以后版本的微信索引文件已更新为FTS5IndexMicroMsg.db,所有表名称变更为FTS5开头,内容字段均为明文,该文件结构如图所示:
当EnMicroMsg.db数据库内有数据删除时,对应的FTS5IndexMicroMsg.db文件中的相应内容同步删除,但不受写0覆盖的影响,因此可以从该索引文件中基于数据库恢复原理尝试恢复已被删除的数据记录。
1.文件级恢复
不同于台式机和服务器系统使用硬盘作为存储介质,智能移动设备主要使用闪存作为存储介质。手机拍摄的图片、视频、QQ,微信聊天发送的图片、语音、视频、传输的其他文件均以单一文件存储在手机中,针对这一类单一文件形式的删除数据可尝试通过获取系统镜像文件,对文件系统格式信息进行分析,扫描OOB区域,建立索引树和提取系统结构信息,获取数据删除状态标记为0的相关信息。最后,通过数据分析、数据重构恢复未被新数据覆盖的已删除数据。但由于安卓、iOS系统的升级和文件系统的变化,针对获取手机逻辑镜像方式恢复删除数据效果并不理想。
目前手机取证数据删除受以下几点因素影响,导致恢复数据效果较差,甚至不能恢复数据:
-
手机格式化、刷机、恢复出厂设置:原数据彻底丢失
-
微信卸载:彻底清空应用数据,重新安装源数据丢失
-
聊天记录删除:微信7版本之后,微信对数据文件删后写0覆盖的机制,至此对数据库文件无法直接恢复,需要借助数据库缓存文件进行恢复。
-
由于SQLite收缩机制,定期对SQLite数据库标志已删除区域进行收缩彻底删除
-
如果手机存储芯片文件操作频繁,已经对文件删除区域进行复写,则较难恢复。
安全为先,洞鉴未来,奇安信盘古石取证团队竭诚为您提供电子数据取证专业的解决方案与服务。如需试用,请联系奇安信各区域销售代表,或致电95015,期待您的来电!
原文始发于微信公众号(盘古石取证):微信内部结构及恢复原理