微信数据库解密
目录
微信数据库解密
介绍
微信数据库采用的加密算法是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 | 系统通知(特别包含你邀请别人加入群聊) |