背景前提
没有的就是想看看别人怎么做的,让自己在实际开发也有好的方案可以参考参考 “本文档仅为个人技术学习与研究目的而撰写,不涉及任何微信业务层用户数据。所有分析均在合法授权的个人测试环境中进行。严禁用于任何非法用途。”
本文以x64dbg,ida为原本结合Golang代码
研究思路
基本架构和TLS“外壳”
Fig.1 总体架构
从总体架构中可以知道,mmtls作为**“中间层”** ,沟通了业务层和网络连接层,其功能是为业务层提供了安全保障。
Fig.2 mmtls协议内部
分为这四种通讯类型,每一种都有对应的代码.
为了方便这里hook了ws2_32.dll的send和recv函数

这里用Golang列出大致的(命名不一定准哈)
|
|
既然是结合Tls
TLS 1.3
随便用wireshark

都是Opaque Type(1 byte) + Version (2 bytes) + Length (2 bytes) + Encrypted Data(Length bytes),那当然MMtls也不例外的,回头看一下这2张图

| Opaque Type | Version | Length | Encrypted Data |
|---|---|---|---|
| 16 | F1 04 | 01 6E | ………. |
| 17 | F1 04 | 00 20 | ………. |
| 表格是16进制 | |||
| 嗯非常好Omg |
[!quote] 基于TLS1.3的微信安全通信协议mmtls介绍 Alert协议用于通知对端发生错误,希望对端关闭连接,目前mmtls为了避免server存在过多TCP Time-Wait状态,Alert消息只会server发送给client,由client主动关闭连接。
这个是Opaque Type=0x15的情况,发生错误了
HandShake流程
因为之前不了解椭圆曲线,去Bilibili了解了一下公钥加密技术ECC椭圆曲线加密算法原理_哔哩哔哩_bilibili

根据官方开源的Tencent/mars: Mars is a cross-platform network component developed by WeChat.,然后通过longlink一路跟过来,到了req2buf,再就找到了发现很多核心算法都有mmcrypto这个字符串hh

密码学
ECDHE
原理
公钥加密技术ECC椭圆曲线加密算法原理_哔哩哔哩_bilibili,这里讲得很好就是那个乘法分配律好家伙
流程
客户端在启动的时候会调用GenEcdhKeyPair生成公钥和私钥,接着发送Client Hello发送自己的公钥,之后服务端返回Server Hello返回服务端的公钥 这里Go代码参考anonymous5l/mmtls: wechat mmtls protocol handshake implement 进行密钥交换后利用自己的私钥和服务端公钥计算出共享密钥
|
|
Hkdf拓展
- expanded secret
- application data key expansion
- client finished
- handshake key expansion
- PSK_ACCESS
- PSK_REFRESH
AES-Gcm加密
mmcrypto::OpenSslCryptoUtil::AesGcmEncrypt

这个算法肯定是借来用的我们翻一下看看大概是怎么个流程,根据这篇文章对称加密算法AES之GCM模式简介及在OpenSSL中使用举例-CSDN博客
|
|
EVP_EncryptInit_ex
这个跑x64可以知道是24

翻一下正版openssl看看是怎么个情况
|
|
全都有了不分析了。
mmcrypto::OpenSslCryptoUtil::AesGcmDecrypt


模拟
主要看一下nonce的生成方式
|
|
引用自己
- [[WeChat:mmcryto的灵感]]
- [[WeChat:SendWhenNoData]]
- [[WeChat:req2buf and buf2Resp]]
- [[WeChat:handshake]]
Hello Client
|
|
有时候长连接失败会用短链接
sub_40FA1D0

这是最关键的加密套件 (Cipher Suite) 标识符。
- 定义:
0xC02B在 IANA 标准中对应的是TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256。 - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- 拆解其安全含义:
- ECDHE:使用椭圆曲线临时密钥交换(具备前向安全性,即即便服务器私钥泄露,历史消息也无法被破解)。
- ECDSA:使用椭圆曲线数字签名算法进行身份验证。
- AES_128_GCM:使用 128 位密钥的 AES 算法,并采用 GCM 模式(同时提供加密和完整性校验)。
- SHA256:用于消息摘要和 PRF(伪随机函数)的散列算法。
参考源码
TrialNeo/mmtls: 基于golang的mmtls协议实现
希望给个免费的star,不要白嫖谢谢谢谢
参考文献
- [原创]mmtls的分析研究与总结-软件逆向-看雪安全社区|专业技术交流与安全研究论坛
- 基于TLS1.3的微信安全通信协议mmtls介绍
- 公钥加密技术ECC椭圆曲线加密算法原理_哔哩哔哩_bilibili
- Tencent/mars: Mars is a cross-platform network component developed by WeChat.
- anonymous5l/mmtls: wechat mmtls protocol handshake implement
- 21.5 对称加解密函数_OpenSSL 中文手册
- Openssl 对称加解密函数 - EVP_Cipher、EVP_Encrypt、EVP_Decryp 系列-CSDN博客
- 对称加密算法AES之GCM模式简介及在OpenSSL中使用举例-CSDN博客
- TLS/1.2和TLS/1.3的核心区别 | HTTPS有哪些不安全因素_哔哩哔哩_bilibili