📝 前言

在爬虫与逆向工程的学习道路上,遇到带有强反调试机制和复杂混淆代码的网站是家常便饭。本文将以盼之代售网站为例,详细复盘如何突破无限 debugger 反调试,定位并还原关键的请求头 sign 参数及载荷中的 decode__1174 加密参数。

通过本次实战,你将学习到:

  • 如何绕过浏览器无限 debugger 陷阱
  • 利用 XHR 断点与调用栈定位关键加密函数
  • 分析控制流平坦化(Control Flow Flattening)混淆代码
  • 还原核心加密逻辑并实现参数生成

⚠️ 免责声明:本文仅供技术交流与学习使用,请勿将相关技术用于非法用途或侵犯他人权益。


🎯 逆向目标

  • 目标网址:aHR0cHM6Ly93d3cucHpkcy5jb20vZ29vZHNMaXN0LzcvNg==
  • 核心参数:
    • 请求头:sign,random,pztimestamp
    • 请求载荷:decode__1174 (长串加密参数)

第一阶段:环境准备与反调试绕过

1. 抓包分析

打开浏览器开发者工具(F12),进入 Network 面板,点击商品列表的“下一页”。此时观察到请求被拦截,控制台频繁触发 debugger,导致无法正常抓包分析。
在这里插入图片描述

2. 绕过策略

面对无限 debugger,通常有两种解决方案:

  1. 魔改浏览器:使用去除了 debugger 限制的定制版浏览器。
  2. Hook 注入:编写 Hook 代码重写 debugger 相关函数。

本次实战采用 Hook 方案,通过注入代码跳过断点

绕过成功后,页面正常加载,我们可以继续对接口进行深入分析。


第二阶段:请求头参数分析 (Sign, Random, Timestamp)

绕过反调试后,重新发起请求,观察 Header 中的动态参数:
在这里插入图片描述

  • sign: 签名值
  • random: 随机数
  • pztimestamp: 时间戳
1. 定位 Sign 生成逻辑

在 Sources 面板中使用 全局搜索 (Ctrl+Shift+F) 关键字 sign。
在这里插入图片描述

定位到关键代码段后,通过单步调试分析发现:

  • Random: 由 Math.random() 生成的随机字符串。
  • Timestamp: 当前 Unix 时间戳。
  • Sign 算法: 由三部分拼接加上固定字符串,然后对字符串进行处理,最后对处理后的字符串进行标准 MD5 加密。

结论:头部参数逻辑相对简单,可直接在代码中复现。


第三阶段:核心难点 decode__1174 参数逆向

请求载荷中的 decode__1174 是一串长长的密文,这是本次逆向的核心难点。

1. 定位参数生成入口

由于该参数出现在 POST 请求体中,我们使用 XHR 断点 功能:

  1. 在 Sources 面板右侧找到 “XHR Breakpoints”。
  2. 添加包含 goodsList 或特定 URL 特征的断点。
  3. 触发请求,程序中断在发送前。
    在这里插入图片描述
2. 栈回溯分析

查看 Call Stack (调用栈),向上追溯找到参数赋值的源头。

我们发现参数是在执行完某行代码后生成的:
在这里插入图片描述

在这里插入图片描述

执行完 QH 方法后,decode__1174 就被拼接到 url 后面了,那么 decode__1174 就是在 QH 内部所生成的

3. 深入加密函数 (QH -> W2)

进入 QH 方法,发现它调用了 W2 函数。W2 内部包含了大量的控制流平坦化混淆代码(即大量的 switch-case 和无意义的跳转)。

我们需要耐心跟进,剥离混淆逻辑,最终定位到核心拼接处:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4. 参数组成拆解

经过分析,decode__1174 是由多个子参数拼接后,传入最终的 c 函数生成的。各子参数来源如下:

片段来源/算法说明
WGSHA1 加密由控制流拼接的参数计算得出
WCSHA1 加密另一组参数的 SHA1 值
QMath.random重写了 Math.random 后的固定值(最新版需要本地重写 random)
Timestamp时间戳(new Date()).getTime()
_waf_xxxHTML 页面请求失败或首次访问返回的 HTML 中的隐藏字段 (如 _waf_bd8ce2ce37)
_waf_time时间戳生成上述 waf 字段的时间
Fixed硬编码代码中固定的常量值
5. 还原核心加密函数 (c 函数)

所有参数拼接完成后,进入最后的 c 函数。这是一大段高度混淆的代码,负责最终的加密输出。
在这里插入图片描述

c 函数内部代码:
在这里插入图片描述

处理技巧:

  • 使用 AST(抽象语法树)工具进行去混淆。
  • 或者在浏览器中直接扣取该函数,补充缺失的依赖变量,在 Node.js 环境中运行测试

第四阶段:测试与验证

逆向出的逻辑封装成 Python 或 Node.js 脚本,构造请求进行测试。

测试结果:
在这里插入图片描述

💡 重要提示:
除了 decode__1174 和 sign 参数外,Cookie 也是动态生成的。如果 Cookie 不正确或缺失,服务器会返回阿里滑块验证码。因此,完整的自动化方案还需要模拟 Cookie 的生成逻辑。


📚 总结

本次逆向分析涵盖了从反调试绕过到复杂混淆代码还原的全过程:

  1. 反调试:Hook 是应对无限 debugger 的利器。
  2. 定位:XHR 断点 + 调用栈是寻找参数生成位置的黄金组合。
  3. 混淆对抗:面对控制流平坦化,需要耐心跟踪数据流向,识别关键变量(如 SHA1、时间戳、随机数)。
  4. 整体观:加密参数往往不是孤立存在的,需结合 HTML 源码、Cookie、请求头等多维度信息。

作者:[青竹]
日期:2025.12.21

更多推荐