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

工具和资料

  • 之前的文章1 - 记录了之前尝试的其它方法
  • 之前的文章2 - 对加密混淆后的js的一些初步分析
  • awesome-java-crawler - 我收集的爬虫相关工具和资料
  • java-curl - 我编写的java HTTP库
  • 另一个用了某数加密的网站的破解SDK

前端流程

  1. 请求页面,返回应答;如果有之前生成的有效FSSBBIl1UgzbN7N80T cookie值,请求时须带上。
  2. 应答的html中,包含以下关键数据:

    • <meta id="9DhefwqGPrzGxEp9hPaoag">元素的content,这是加密后的数据,里面包含字符串映射表、全局方法映射表、加解密算法密钥等;注意有些网站的meta.id不同
    • <script r="m">的元素,其中有一个是外部js链接,另一个则包含引导JS代码段,后面称为bootstrap.js。这段代码是动态生成的,每次请求均不相同。
  3. 如果应答中包含FSSBBIl1UgzbN7N80T的cookie,保存起来,后面更新此cookie时会用到
  4. 前面的外部js链接,其实内容是静态的,可以预先拿到并保存起来,里面的关键代码是:
    $_ts.FxJzG50F = '......';

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

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

某数加密的流程与原理简析相关推荐

  1. Android V1及V2签名原理简析

    Android为了保证系统及应用的安全性,在安装APK的时候需要校验包的完整性,同时,对于覆盖安装的场景还要校验新旧是否匹配,这两者都是通过Android签名机制来进行保证的,本文就简单看下Andro ...

  2. Android Handler与Looper原理简析

    一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...

  3. CRC原理简析——史上最清新脱俗简单易懂的CRC解析

    CRC原理简析 1. CRC校验原理 CRC校验原理根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端.当然,这个 ...

  4. Mysql锁机制及原理简析

    Mysql锁机制及原理简析 一.前言 1.什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制. 锁保证数据并发访问的一致性.有效性: 锁冲突也是影响数据库并发访问性能的一个重要因素. 锁是 ...

  5. Webpack模块化原理简析

    webpack模块化原理简析 1.webpack的核心原理 一切皆模块:在webpack中,css,html.js,静态资源文件等都可以视作模块:便于管理,利于重复利用: 按需加载:进行代码分割,实现 ...

  6. grpc通信原理_gRPC原理简析

    gRPC原理简析 gRPC是由谷歌提出并开发的RPC协议,gRPC提供了一套机制,使得应用程序之间可以进行通信. 降级开发者的使用门槛,屏蔽网络协议,调用对端的接口就像是调用本地的函数一样.而gRPC ...

  7. Java的定时器Timer和定时任务TimerTask应用以及原理简析

    记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析.在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.u ...

  8. 转子接地保护原理_发变组转子接地保护原理简析

    发变组转子接地保护原理简析 发电机转子接地故障是常见的故障之一, 发生一点接地, 对发电机本身并不直接构成危 害,此时可通过转移负荷,平稳停机后,再查故障点:若在此基础上又发生另外一点接地, 将会严重 ...

  9. JTAG、SWD调试原理简析

    JTAG.SWD调试原理简析 STM32F10xxx使用CortexM-M3内核,该内核内含硬件调试模块,支持复杂的调试操作.硬件调试模块允许内核在取指(指令断点)或访问数据(数据断点)时停止.内核停 ...

最新文章

  1. android studio 库项目管理,在Android Studio中将现有项目转换为库项目
  2. 【经典书】概率图模型:原理与技术
  3. 数据结构: 线索化二叉树
  4. C++匿名管道详解及简单案例(基于VS2013)
  5. java 继承调用_【JAVA学习】继承中函数调用机制
  6. 【十八】文件译文:graph.js.fmkr (测试报告模版配置文件)
  7. Vue.use 写多个_西双版纳能写立项报告收费公司
  8. 腾讯云 python接口_python调用腾讯云短信接口
  9. Atitit.月度计划日程表 每月流程表v5
  10. 频率单位Hz、MHz、GHz、THz、PHz、EHz换算关系
  11. 数据库的内连接和外连接的区别
  12. 题15 Oracle临时表有几种?临时表和普通表主要区别是什么?
  13. JAVAFX的table样式修改
  14. 阿里巴巴产品实习生9天
  15. Android热修复-Robust
  16. nlp自然语言处理_nlp满足可持续投资
  17. SICP读书笔记2---if和cond的区别
  18. 计算机房需要排风吗,机房新风排风系统怎么样 机房新风排风系统原理介绍【详解】...
  19. Flash和Javascript网页视频播放器
  20. 客户不去你网店买东西的15个理由

热门文章

  1. 洛谷——P1019 单词接龙
  2. 泛型的作用是什么?——Java系列学习笔记
  3. 【测试点分析】1088 三人行 (20分)_29行代码AC
  4. 解题报告+优化——试题 基础练习 矩形面积交——16行代码AC
  5. 为什么将老年代移动到方法区
  6. linux ctime 时间戳,Linux时间戳atime ctime mtime区别及相关命令
  7. mysql启动主机挂了_docker 启动mysql 挂载宿主机目录
  8. android ndk使用c 11,使用c 11 std :: async在android ndk中使用不完整类型无效
  9. android transfer error: Read-only file system
  10. 互换性与技术测量电子版_181套建设工程全套资料表格,从开工到完工,完整电子版手慢无...