深入解析微信收藏数据获取协议:逆向工程与Protobuf通信实践

一、技术背景与需求场景

微信的收藏功能涉及复杂的客户端-服务器通信协议,其核心接口batchgetfavitem使用mmtls加密传输Protobuf序列化数据。本文解析的Go模块实现了:

通过微信ID获取指定收藏项(FavId)的完整数据
处理微信特有的加密通信和会话管理
完整封装微信私有协议为可调用API

适用于:微信自动化工具、跨平台收藏迁移、企业知识库同步等场景。


二、核心代码解析
1. 协议数据结构

go

// Protobuf请求结构 (mm.proto)
message BatchGetFavItemRequest {
  BaseRequest baseReq = 1;
  int32 count = 2;          // 请求数量
  repeated int32 favIdList = 3; // 收藏ID列表
}

// 基础认证结构
message BaseRequest {
  bytes sessionKey = 1;     // 会话密钥
  uint32 uin = 2;           // 用户唯一ID
  bytes deviceId = 3;        // 设备ID(16字节)
  int32 clientVersion = 4;  // 客户端版本
  bytes deviceType = 5;      // 设备型号
  uint32 scene = 6;          // 场景标识
}
2. 加密通信流程

go

comm.SendRequest(comm.SendPostData{
  Ip:     D.Mmtlsip,        // MM-TLS服务器IP
  Host:   D.MmtlsHost,       // TLS域名
  Cgiurl: "/cgi-bin/micromsg-bin/batchgetfavitem", // 微信私有接口
  PackData: Algorithm.PackData{
    EncryptType:      5,     // 微信特有加密算法
    Clientsessionkey: D.Clientsessionkey, // 会话密钥
    Loginecdhkey:     D.RsaPublicKey,     // ECDH公钥
  },
}, D.MmtlsKey)              // MM-TLS会话密钥

关键加密参数​:

EncryptType=5:微信私有混合加密方案
SessionKey动态生成:每次登录刷新
MM-TLS:微信基于TLS 1.3改造的安全传输层


三、关键技术实现细节
1. 请求构造流程

2. 错误处理机制

go

// 分层错误码设计
switch {
case err != nil:
  return models.ResponseResult{Code: -8}  // 系统级错误
case errtype != 0:
  return models.ResponseResult{Code: errtype} // 网络层错误
case Response.GetBaseResponse().GetRet() != 0:
  return models.ResponseResult{Code: -100} // 业务逻辑错误
}

关键错误类型​:

-8:序列化/反序列化失败
-100:微信协议返回错误
5xx:网络层错误(如MMTLS连接中断)


四、协议逆向工程要点

设备指纹伪造


go

DeviceId:      D.Deviceid_byte,  // 16字节设备指纹
DeviceType:    []byte("iPhone14,2"), // 仿冒iOS设备

需维持设备ID的持久性
客户端版本号需匹配当前微信版本

会话密钥管理

SessionKey有效期≈登录会话周期
ClientSessionKey由ECDH协商生成
每次登录后需更新RSA公钥

压缩优化


go

UseCompress: false // 禁用压缩(微信收藏含多媒体)

因收藏项可能包含图片/视频,禁用压缩避免二次处理开销


五、性能与安全优化建议

连接复用


go

// 在comm.SendRequest中实现
keepAlive := http.Transport{DisableKeepAlives: false} 

复用MMTLS连接减少握手开销
维持长连接心跳

密钥安全存储

使用操作系统密钥环存储SessionKey
内存中加密存储RSA私钥

协议兼容性


go

// 版本检测机制
if D.ClientVersion != expectedVersion {
    return ErrVersionMismatch
}

监控微信协议版本变更(通过Wireshark抓包分析)


六、扩展应用场景

企业知识库同步


python

# Python调用示例
from ctypes import CDLL
wechat = CDLL("./wechatdll.so")
fav_item = wechat.GetFavItem(b"wxid_123", 456)

自动化备份方案


bash

# 周期性获取收藏
while true; do
  ./wechatctl get-fav --wxid=$USER --all
  sleep 86400
done

结语​:
本文剖析的微信收藏协议实现,展示了逆向工程在即时通讯系统深度开发中的典型应用。随着微信协议持续升级,开发者需持续已关注加密算法变更和设备指纹验证机制的演进。欢迎在评论区交流协议分析经验!

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容