微信数据库解密

微信数据库解密

介绍

微信数据库采用的加密算法是256位的AES-CBC。数据库的默认的页大小是4096字节即4KB,其中每一个页都是被单独加解密的。加密文件的每一个页都有一个随机的初始化向量,它被保存在每一页的末尾。加密文件的每一页都存有着消息认证码,算法使用的是HMAC-SHA1(安卓数据库使用的是SHA512)。它也被保存在每一页的末尾。每一个数据库文件的开头16字节都保存了一段唯一且随机的盐值,作为HMAC的验证和数据的解密。用来计算HMAC的key与解密的key是不同的,解密用的密钥是主密钥和之前提到的16字节的盐值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代64000次计算得到的。而计算HMAC的密钥是刚提到的解密密钥和16字节盐值异或0x3a的值通过PKCS5_PBKF2_HMAC1密钥扩展算法迭代2次计算得到的。为了保证数据部分长度是16字节即AES块大小的整倍数,每一页的末尾将填充一段空字节,使得保留字段的长度为48字节。综上,加密文件结构为第一页4KB数据前16字节为盐值,紧接着4032字节数据,再加上16字节IV和20字节HMAC以及12字节空字节;而后的页均是4048字节长度的加密数据段和48字节的保留段。

数据库结构

MSG(聊天记录核心数据库),字段如下:

  • localId:字面意思消息在本地的 ID,暂未发现其功用
  • TalkerId:消息所在房间的 ID(该信息为猜测,猜测原因见 StrTalker 字段),与Name2ID对应。
  • MsgSvrID:猜测 Srv 可能是 Server 的缩写,代指服务器端存储的消息 ID
  • Type:消息类型,具体对照见表1
  • SubType:消息类型子分类,暂时未见其实际用途
  • IsSender:是否是自己发出的消息,也就是标记消息展示在对话页左边还是右边,取值0或1
  • CreateTime:消息创建时间的秒级时间戳。此处需要进一步实验来确认该时间具体标记的是哪个时间节点,个人猜测的规则如下: 从这台电脑上发出的消息:标记代表的是每个消息点下发送按钮的那一刻 从其它设备上发出的/收到的来自其它用户的消息:标记的是本地从服务器接收到这一消息的时间
  • Sequence:次序,虽然看起来像一个毫秒级时间戳但其实不是。这是CreateTime 字段末尾接上三位数字组成的,通常情况下为000,如果在出现两条- CreateTime 相同的消息则最后三位依次递增。需要进一步确认不重复范围是在一个会话内还是所有会话。CreateTime 相同的消息则最后三位依次递增。需要进一步确认不重复范围是在一个会话内还是所有会话。
  • StatusEx、FlagEx、Status、MsgServerSeq、MsgSequence:这五个字段个人暂时没有分析出有效信息
  • StrTalker:消息发送者的微信号。特别说明,从这里来看的话,上面的TalkerId 字段大概率是指的消息所在的房间ID,而非发送者ID,当然也可能和TalkerId属于重复内容,这一点待确认。
  • StrContent:字符串格式的数据。特别说明的是,除了文本类型的消息外,别的大多类型这一字段都会是一段 XML 数据标记一些相关信息。通过解析xml可以得到更多的信息,例如图片的宽高、语音的时长等等。
  • DisplayContent:对于拍一拍,保存拍者和被拍者账号信息
  • Reserved0~6:这些字段也还没有分析出有效信息,也有的字段恒为空
  • CompressContent:字面意思是压缩的数据,实际上也就是微信任性不想存在 StrContent 里的数据在这里(例如带有引用的文本消息等;采用lz4压缩算法压缩)
  • BytesExtra:额外的二进制格式数据
  • BytesTrans:目前看这是一个恒为空的字段

表1:MSG.Type字段数值与含义对照表(可能可以扩展到其它数据库中同样标记消息类型这一信息的字段)

分类Type 子分类SubType 对应类型
1 0 文本
3 0 图片
34 0 语音
43 0 视频
47 0 动画表情(第三方开发的表情包)
49 1 类似文字消息而不一样的消息,目前只见到一个阿里云盘的邀请注册是这样的。估计和57子类的情况一样
49 5 卡片式链接,CompressContent 中有标题、简介等,BytesExtra 中有本地缓存的封面路径
49 6 文件,CompressContent 中有文件名和下载链接(但不会读),BytesExtra 中有本地保存的路径
49 8 用户上传的 GIF 表情,CompressContent 中有CDN链接,不过似乎不能直接访问下载
49 19 合并转发的聊天记录,CompressContent 中有详细聊天记录,BytesExtra 中有图片视频等的缓存
49 33/36 分享的小程序,CompressContent 中有卡片信息,BytesExtra 中有封面缓存位置
49 57 带有引用的文本消息(这种类型下 StrContent 为空,发送和引用的内容均在 CompressContent 中)
49 63 视频号直播或直播回放等
49 87 群公告
49 88 视频号直播或直播回放等
49 2000 转账消息(包括发出、接收、主动退还)
49 2003 赠送红包封面
10000 0 系统通知(居中出现的那种灰色文字)
10000 4 拍一拍
10000 8000 系统通知(特别包含你邀请别人加入群聊)
0%