摘要:前言啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。注意某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。
前言
啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。
注意:某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。
QQ群 - Javascript高级爬虫 - 作者自建群,欢迎加入!
中国商标网加密接口 - 仅作演示
之前的文章1 - 记录了之前尝试的其它方法
之前的文章2 - 对加密混淆后的js的一些初步分析
awesome-java-crawler - 我收集的爬虫相关工具和资料
java-curl - 我编写的java HTTP库
另一个用了某数加密的网站的破解SDK
前端流程请求页面,返回应答;如果有之前生成的有效FSSBBIl1UgzbN7N80T cookie值,请求时须带上。
应答的html中,包含以下关键数据:
元素的content,这是加密后的数据,里面包含字符串映射表、全局方法映射表、加解密算法密钥等;注意有些网站的meta.id不同
的元素,其中有一个是外部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的摘要值
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43268.html
摘要:前言啃了这么长时间,基本上已经把某数的套路摸了个八九不离十,不愧是中国反爬界的集大成者,感觉收获满满,这里就简单记录一下分析成果。注意某数在不同的网站上有不同的版本,其流程也略有不同,这里的流程不一定适用于其它网站。 showImg(https://segmentfault.com/img/remote/1460000018765904); 前言 啃了这么长时间,基本上已经把某数的套路...
摘要:上次提到过,模板引擎一般是要做三件事情变量值的输出条件判断和循环引入或继承其他文件现在就来看看的模板引擎是如何来处理这三件事情的。引擎接下来就是本文的重点是如何编译的。如果有兴趣的话,也可以实现一个自己的模板解析引擎。 上次提到过,模板引擎一般是要做三件事情: 变量值的输出(echo) 条件判断和循环(if ... else、for、foreach、while) 引入或继承其他文件 ...
摘要:模块化原理简析的核心原理一切皆模块在中,,静态资源文件等都可以视作模块便于管理,利于重复利用按需加载进行代码分割,实现按需加载。模块化原理以为例,分析构建的模块化方式。 webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块;便于管理,利于重复利用; 按需加载:进行代码分割,实现按需加载。 2...
摘要:碰撞检测边界检测在前端游戏,以及涉及拖拽交互的场景应用十分广泛。这就涉及到碰撞检测或者叫边界检测的问题了。若四边均未发生重合,则未发生碰撞,反之则发生碰撞。目前业务有遇到碰撞需求,所以抽时间整理了下。 碰撞检测(边界检测)在前端游戏,以及涉及拖拽交互的场景应用十分广泛。 那么啥叫碰撞?JavaScript 又是如何检测 DOM 发生碰撞的呢? 碰撞,顾名思义,就是两个物体碰撞在了一起,...
阅读 1079·2021-09-22 15:37
阅读 1101·2021-09-13 10:27
阅读 2409·2021-08-25 09:38
阅读 2396·2019-08-26 11:42
阅读 1490·2019-08-26 11:39
阅读 1519·2019-08-26 10:58
阅读 2235·2019-08-26 10:56
阅读 2540·2019-08-23 18:08