前言
a_bogus 相比之前的 x-bogus 隐藏得更深,且裹挟着 JSVMP 混淆,给数据抓取带来了不小挑战。本文仅用于技术学习与交流,请勿用于非法爬取商业数据。
逆向分析环境准备
开始前需具备以下基础:
- 熟悉浏览器开发者工具(Network、Sources 面板)。
- 掌握 XHR 断点、条件断点及日志断点的用法。
- 了解基础 JavaScript 语法。
- 知道如何利用工具将 cURL 转换为 Python 代码以便测试。
实战拆解:追踪 a_bogus 的生成逻辑
1. 选取目标接口
以抖音关键词搜索接口为例:
https://www.douyin.com/aweme/v1/web/general/search/single/
该接口参数复杂且加密严密,是逆向分析的典型对象。
2. 接口参数分析
打开浏览器开发者工具刷新页面,在 Network 面板找到上述接口。复制其 cURL(bash) 并使用转换工具生成 Python 代码进行测试。 观察请求参数,除了常规的 keyword、offset 外,还有两个关键变量:msToken 和 a_bogus。注释掉任一参数都会导致请求失败。本文重点攻克 a_bogus。
3. 定位加密位置
全局搜索失效
直接在 Sources 面板搜索 a_bogus,发现代码已被混淆,无法搜到明文。此时需要换一种思路——使用 XHR 断点。
设置 XHR 断点
在 Sources 面板右侧找到 XHR/fetch Breakpoints,点击 +,输入接口路径关键词 general/search/single。
设置好后刷新页面,页面会自动断在发送请求的代码处。
分析堆栈调用
断下来后查看右侧的 Call Stack(调用堆栈)。堆栈是从下往上执行的,我们需要找到 生成 a_bogus 的那个堆栈帧。
- 往下翻堆栈,找到 请求参数中还没有 a_bogus 的地方。
- 往上翻,找到 请求参数中已经有了 a_bogus 的地方。 这两个位置之间的某个函数就是加密函数。关键点:不要只找一个堆栈就停下,要逐个查看作用域(Scope)中的 params 或 data 对象,确认是否有 a_bogus 字段。
4. 精细调试:日志断点与条件断点
最终我们定位到了一个混淆很严重的 JS 文件(通常是 bdms.js 之类),代码看起来像这样:
var result = s.apply(b, u);
这里很难一眼看出 s 是干什么的,但我们可以设置 日志断点。
在 s.apply(b, u) 这行右键,选择 Add logpoint,输出内容设为:
返回值:{result}
刷新页面,看控制台打印的日志,你会发现有很多 true、false、数字以及字符串。
观察那些字符串,短的那一串看起来像是 URL 参数拼接,长的那一串长度大约在 160 位左右,正是我们要找的 a_bogus。
为了精准定位,可以设置 条件断点:比如当返回值长度大于 150 时再断下来。
result.length > 150
最终,我们找到了生成 a_bogus 的核心函数,它在 e 函数内部。
补环境与代码封装
1. 补环境
直接运行这段 JS 会报错,因为缺少浏览器环境(window, document, navigator 等)。我们需要模拟这些环境:
window = global; delete ; ;
. = (){};
= () {};
= {};
navigator = {};
screen = { : , : , : , : , : , : }


