乐趣区

某数加密的流程与原理简析

啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。注意:某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。
工具和资料

之前的文章 1 – 记录了之前尝试的其它方法

之前的文章 2 – 对加密混淆后的 js 的一些初步分析

awesome-java-crawler – 我收集的爬虫相关工具和资料

java-curl – 我编写的 java HTTP 库
另一个用了某数加密的网站的破解 SDK

前端流程

请求页面,返回应答;如果有之前生成的有效 FSSBBIl1UgzbN7N80T cookie 值,请求时须带上。

应答的 html 中,包含以下关键数据:

<meta id=”9DhefwqGPrzGxEp9hPaoag”> 元素的 content,这是加密后的数据,里面包含字符串映射表、全局方法映射表、加解密算法密钥等;注意有些网站的 meta.id 不同

<script r=”m”> 的元素,其中有一个是外部 js 链接,另一个则包含引导 JS 代码段,后面称为 bootstrap.js。这段代码是动态生成的,每次请求均不相同。

如果应答中包含 FSSBBIl1UgzbN7N80T 的 cookie,保存起来,后面更新此 cookie 时会用到

前面的外部 js 链接,其实内容是静态的,可以预先拿到并保存起来,里面的关键代码是:$_ts.FxJzG50F = ‘……’;

这个 FxJzG50F 的值就是加密后的核心 JS 代码段,后面称为 main.js。
这里比较奇妙的是:虽然加密后的内容是固定的,但是解密出来的 JS 里面的变量名、方法名、方法顺序却是随机的!

执行 bootstrap.js,包含以下关键步骤:

把常用值、常用方法赋值给全局变量,以迷惑黑客,比如_$wy = window; _$wG = undefined; _$a1 = String.prototype.charAt
获取页面中的 meta 的 content,分若干步骤解密之,这会在 window 中添加一堆全局变量和全局方法,包括所有的常量字符串映射
获取 window.$_ts.FxJzG50F 的值,结合 meta 中的数据,生成核心 JS 代码即 main.js

执行 main.js,这里的步骤就太多了,罗列一些关键的吧:

继续从 meta 中解密一部分关键数据
在以下事件上挂钩子,以记录用户行为:鼠标事件,触屏事件,键盘事件,输入事件,滚屏事件,加速器事件,屏幕方向改变事件,电池充电事件,窗口隐藏 / 显示事件
另外,按键、点击、滚屏等事件的钩子函数同时也会更新 FSSBBIl1UgzbN7N80T 的 cookie 值
在以下网络请求相关对象或方法上挂钩子,令其在发起请求时后面自动添加 MmEwMD 参数:ActiveXObject, XMLHttpRequest, Request, fetch, HTMLFormElement.submit
关键方法检测,测试 eval 等几个方法是否被替换成非 native 版本
添加一个频繁执行的定时器,其作用是检测 debugger 语句是否生效,如果生效说明有黑客在调试
检查 selenium, webdriver, PhantomJS, HeadlessChrome 等自动化框架的特征
检查浏览器类型,收集浏览器特征,收集渲染器特征
执行 WebGL 3D 渲染测试,执行 Canvas 2D 渲染测试,目前看其测试结果并未实际使用,但不排除其它网站会使用此数据标识浏览器指纹
添加一个 50 秒的定时器,其作用为更新 FSSBBIl1UgzbN7N80T 的 cookie 值
对 FSSBBIl1UgzbN7N80T cookie 值进行首次更新

FSSBBIl1UgzbN7N80T cookie 值的内容

这是整个某数加密的核心了,每次请求,无论 GET, POST,是否 XHR,都会带着这个 cookie
此 cookie 的值是很多数据加密后的内容,这里就不详细说了,至少是包含前面收集到的浏览器特征和用户行为数据的,简单的伪造 User-Agent 肯定是绕不过去的
更新前会验证和重用之前的 FSSBBIl1UgzbN7N80T 值

根据其内容可知,某数的后端是可以知道请求来源于何种浏览器,用户点击链接前有何行为等,这样他们可以做到:

验证是否大量请求来源于相同特征的浏览器
有选择的禁用某些浏览器
给用户行为存疑的来源下毒

MmEwMD 参数的内容

这个参数只会在 XHR, 表单提交等场合用到,感觉和 FSSBBIl1UgzbN7N80T 的作用有重复,不确定某数的后端是否真的会严格验证其内容
其内容的主体部分和 FSSBBIl1UgzbN7N80T 一致,另外会在前面连接上 URL 的摘要值

退出移动版