抓包分析的本质是"提问-验证"循环
面对一条陌生的加密流量,新手盯着 hex 发呆,老手在做假设-验证的循环:猜一个结构,找证据,错了换下一个假设。本文把这套心法拆成可执行的步骤。
第一步:建立流量的"地图"
抓到包先别急着看单条,先看全貌:
- 会话结构:这次操作产生了几个请求?顺序是什么?(Charles 的 Sequence 视图)
- 域名分布:api 域名、cdn 域名、埋点域名各是什么?(分清业务流量和噪音)
- 协议类型:HTTP/1.1 还是 H2?明文 json 还是加密体?
全貌看完,心里要有张图:哪个请求是核心(业务数据),哪些是配套(鉴权、埋点、心跳)。
第二步:找"锚点"——已知信息
分析加密流量的起点永远是已知明文锚点:
- 你输入的手机号、搜索关键词——明文里一定有
- 响应里展示的昵称、商品名——解密后一定有
- 时间戳——格式特征明显(10/13 位数字)
# 例:你搜索了"手机",在请求体里搜它的各种编码
手机 → UTF-8: E6 89 8B E6 9C BA
手机 → URL编码: %E6%89%8B%E6%9C%BA
手机 → Unicode: \u624b\u673a锚点找到了,加密层的位置就确定了(锚点明文出现 = 未加密段,锚点消失处 = 加密起点)。
第三步:结构假设与验证
对加密体做结构假设,逐个验证:
假设 1:base64 系? 字符集检查 + 长度是 4 的倍数 → 试解码 → 解出乱码则考虑换表
假设 2:标准加密? 长度是 16 的倍数 → 疑似 AES/SM4 分组加密 → 去代码里搜算法常量
假设 3:自定义? 长度无规律、字符分布异常 → 准备硬读代码
每个假设都有明确的验证动作和证伪条件——这是和"盯着看"的本质区别。
第四步:动静结合
纯抓包(动态)能看清"发了什么",纯逆向(静态)能看清"怎么生成的",但单独用都慢。心法是在两者之间快速切换:
- 抓包发现 sign 参数 → 静态搜 "sign" 找生成点
- 静态看到加密函数 → 动态 hook 验证输入输出
- 动态发现请求有 token → 静态追 token 的来源接口
卡在一个方向超过 30 分钟没有进展,就换到另一个方向找新线索。
第五步:沉淀协议文档
分析完成必须沉淀文档,否则两周后自己都看不懂:
## 接口:搜索
- URL: POST /api/v2/search
- 鉴权: header token(来自 /login 响应,有效期 2h)
- 签名: sign = md5(body + salt),salt 硬编码在 libsec.so +0x1234
- body: json,{"keyword": "...", "page": n}
- 响应: AES-CBC 加密,key=xxx iv=yyy,解出为 json
- 风控: 频率 > 30/min 触发滑块每个字段注明"来源"和"验证方法"——这是协议文档和抓包记录的区别。
精髓:三个效率认知
- 30 分钟切换原则:动态/静态任一方向卡 30 分钟就切换,两个方向的线索会互相启发
- 锚点先行:没有已知明文锚点就不开始分析加密体——先制造锚点(自己输入特征字符串)
- 文档即资产:协议文档是逆向的真正产出,代码会过时,文档里的"字段来源和验证方法"是长期资产
总结
- 抓包分析 = 假设-验证循环,不是盯着 hex 看
- 五步走:建地图 → 找锚点 → 结构假设 → 动静结合 → 沉淀文档
- 锚点是分析的起点,没有就先制造
- 文档注明每个字段的来源和验证方法
交流微信:run1255