微信作为中国用户量最大的移动应用之一,其通信协议与加密机制向来是逆向工程领域的热门研究对象。本文将聚焦于 基于 iPad 协议(版本 859) 的登录流程,详细分析 验证码请求的触发逻辑、数据包内容、以及关键字段的逆向解析方法,并结合常用工具(如 Frida、IDA Pro)提供一套完整的技术路径。
一、背景与用途:为什么选 iPad 协议(v859)?
微信在不同平台下使用不同的通信协议,iOS 版中又细分为 iPhone 与 iPad 协议,后者因为:
-
绑定手机但不强制扫码(支持账号+密码登录)
-
协议逻辑更清晰,登录流程更独立
-
验证码功能更容易复现与分析
因此,iPad 协议版本 859(对应 iOS 客户端 8.0.35) 成为当前主流的研究目标,既可用于模拟微信登录行为,又能绕过扫码逻辑,是实现自动化登录或账号验证的关键环节。
二、抓包准备与 protobuf 数据包的获取
1. 环境准备
要分析微信的网络通信,首先需要获取原始数据包内容。微信通信采用 protobuf + TLS 加密,常规抓包软件无法直接读取明文内容。
我们推荐如下方案:
-
操作系统:越狱 iPhone / 模拟器(Frida + Ghidra/IDA)
-
网络代理:使用 Burp Suite + Frida 动态 Hook 解密请求体
-
工具链:
-
Frida
(Hook 加密函数,拦截明文请求) -
mitmproxy
(辅助解析 TLS 前的数据) -
Protobuf Viewer
(解包 .proto 数据)
-
2. 抓包定位方式
重点关注以下通信特征:
-
请求路径通常为
/cgi-bin/micromsg-bin/**
-
Content-Type 为
application/octet-stream
-
请求体和返回体均为 protobuf 序列化结构
登录过程包含多个阶段:
➤ login (首次握手)
➤ push login (账号密码验证)
➤ verify code(验证码相关)
验证码请求即为 verifycode
类型的包,包名可能为:
/cgi-bin/micromsg-bin/verifypsw
/cgi-bin/micromsg-bin/newverifypasswd
三、验证码请求接口识别与字段解析
验证码相关的 protobuf 请求结构主要出现在账号密码登录失败后,微信会主动请求服务端下发验证码界面信息,并通过后续接口上传用户输入。
1. 验证码请求触发逻辑
关键条件:
-
登录失败,错误码返回
-6
(需要验证码) -
客户端会携带验证码 UUID 和图片地址再次发起登录验证
2. 请求字段结构(逆向分析结果)
下面是推测出的 protobuf 字段含义(部分字段名称基于 IDA 符号和调试命名):
message VerifyCodeRequest {
required string uuid = 1; // 验证码 session UUID
required string verify_code = 2; // 用户输入的验证码
optional string user_name = 3; // 用户名
optional bytes password_md5 = 4; // 密码的 MD5
optional int32 scene = 5; // 验证码场景,一般为 1
}
注意:uuid
和验证码图片 URL 是由服务器在前一次登录失败返回中提供的。
四、逆向工程工具与技巧详解
1. Frida 动态 Hook 核心函数
微信 iOS 中的 protobuf 加密流程基本如下:
原始 protobuf → 加密器(如 TEA/XXTEA)→ TLS
关键是定位 protobuf 编码与加密的桥接点。
Frida Hook 示例:拦截 protobuf 加密前数据
Java.perform(function () {
var Clazz = Java.use("com.tencent.mm.protocal.protobuf.YourVerifyCodeClass");
Clazz.toByteArray.implementation = function () {
var raw = this.toByteArray();
console.log("VerifyCodeRequest protobuf raw:", raw);
return raw;
};
});
如果在 iOS 环境下(Objective-C),你需要 Hook -[WCPBSerialization serializeMessage:toData:]
或类似接口。
2. IDA 静态分析思路
在 IDA 中你可以:
-
搜索登录相关关键字如
"login"
,"verify"
,"ErrCode -6"
-
查找字符串引用与跳转表
-
跟踪含
sub_
前缀的函数调用链,特别关注调用 protobuf encode、TLS send 函数之前的数据结构
3. 动态调试辅助验证
结合 Frida 与 IDA 的结果,可以通过构造 payload 测试是否登录成功。可以使用 Python + mitmproxy 构建伪造请求。
五、伪代码与请求构造逻辑
在掌握上述 protobuf 字段之后,可以手动构造请求数据。例如:
# Python 伪代码,仅作演示
from wechat_pb import VerifyCodeRequest # 假设你已定义好 .proto
def build_verify_code_packet(uuid, verify_code, user_name, password_md5):
req = VerifyCodeRequest()
req.uuid = uuid
req.verify_code = verify_code
req.user_name = user_name
req.password_md5 = bytes.fromhex(password_md5)
req.scene = 1
return req.SerializeToString()
随后将该数据通过 TLS + protobuf
格式发送到微信服务器:
POST /cgi-bin/micromsg-bin/verifypsw HTTP/1.1
Content-Type: application/octet-stream
User-Agent: MicroMessenger Client
Content-Length: ...
(binary protobuf body)