今日头条a_bogus参数加密逆向
概述
字节跳动系的反爬参数一脉相承,x-bogus、a_bogus分别适配移动端/部分产品端与PC端核心业务。本文以PC端头条新闻feed流接口为例,分享补全浏览器环境+混淆代码调试的逆向方法,最终生成可通过验证的a_bogus参数,附带Python调用demo。
网页分析(抓包+断点)
我们先通过Chrome开发者工具梳理加密调用的完整链路:
-
定位加密参数入口 打开PC端首页后滚动加载,在Network面板中过滤
feed找到目标接口,能看到Query String Parameters里有动态生成的a_bogus。
-
全局搜索定位调用点 在Sources面板全局搜索
a_bogus,会发现它出现在某个发起网络请求的封装函数里,点击断下调试,能追踪到它是由另一个混淆函数返回的。 -
找到混淆核心文件 继续断点调试调用链,最终会锁定到动态加载的
bdms.js文件——这就是字节跳动系常用的混淆指纹+加密脚本。
技术要点
核心难点
a_bogus是依赖浏览器指纹+请求参数的动态值bdms.js使用了高度混淆的JavaScript代码- 混淆逻辑会主动检测是否为真实浏览器环境
解决方案
- 补全模拟浏览器环境对象(核心)
- 逆向梳理加密调用链的关键参数
- 使用Proxy代理监控属性/方法调用,辅助补全环境
环境补全实现
基础环境配置
先初始化Node.js环境下的核心全局对象window,并模拟基础的窗口属性、SDK版本等静态信息:
存储对象模拟
localStorage和sessionStorage里的缓存数据(尤其是__tea_*开头的抖音/头条统计token)对环境验证很重要:
DOM与其他对象模拟
补全document、navigator等DOM核心对象的必要属性:
代理监控系统
为什么需要代理?
混淆后的bdms.js会偷偷访问很多浏览器属性(比如canvas.toDataURL()、window.screen.colorDepth等),如果直接补全静态值,可能会漏掉某些动态调用的内容。用Proxy可以实时打印出所有被访问的对象、属性、方法,帮助我们快速补全缺失的环境。
代理实现函数
加密参数生成
加密调用链梳理
通过断点调试bdms.js,最终会找到两个核心变量:
window._U._v:基础配置参数数组window._U._u:核心加密函数
get_a_bogus封装
完整Python调用流程
我们将上面的环境补全、代理(可选,调试完后可注释掉)、加密封装放在同一个env.js文件里,然后用Python的execjs库调用。

