嘘~ 正在从服务器偷取页面 . . .

极Y 无感 and 滑块


极验无感

写在最前面:

做 JS 逆向,一定要分析网页请求,然后再开始 JS 逆向。

分析请求


  • 首先网页会请求一个链接,拿到 gt 值和 challenge 值:
    请求拿gt和challenge
  • 之后再拿着 gt 值访问一个链接,会返回一个对象
    拿gt值访问验证链接
  • 然后请求了一个 js 之后,根据 gt 和 challenge 计算出了 w 值进行了一次请求
  • 就是这里,我一开始没有分析这个请求,直接去发点击验证的请求,导致我的随机 ce 值无法通过
  • 这里是先发送一个 ce 值(16 位随机数),然后后面的所有加密的参数内,都要带上这个随机数。
  • 我一开始没分析,导致只有复制网页生成的才可以通过,本地生成的就无法通过。
  • 所以我写了开头的那句话。:一定要分析网页请求。 > 第一次的w请求
  • 点击按钮之后会再次发起一个请求,还是 w 值和之前的 ce 值,gt 值,和 challenge 值。
  • 但这里的 w 值是有鼠标点击位置,以及浏览器环境参数的。
  • 第二次的请求只有一个对象,在调用加密方法的时候,传入随机生成的 ce 值;
    第二次请求需要的对象
  • 第三次请求,根据鼠标点击位置,浏览器环境以及之前 ce 值加密一下。服务器就会返回一个validate
  • 带上这个validatechallenge就可以通过验证了。。

分析完毕开始跟值。


  • 目前有两个 w 值需要处理,
  • 第一次是发送随机 ce 和浏览器环境要生成一个,
  • 第二次是带上之前的 ce 加密浏览器环境和鼠标点击位置。

第一次请求 w 值:


第一次的w值

  • 通过请求的调用栈,可以跟到这个位置,虽然混淆了,但只是增加了时间。
  • 可以看到w值是a+n的。
  • 极验的 JS 整个就是一个自执行,搜到加密方法之后,全局导出就可以用了。
  • 加密的数据是一个大对象,内部有一些信息根据网页变动,以及gt 值和 challenge的变动
  • 目前这个网站,我们只要修改gt 值和 challenge值进行加密就行了。
  • 最下面的 i 是浏览器环境,可以写死。
    第一次请求要加密的参数
  • 带上最终组合的w值进行访问,返回一段信息
    第一次请求返回的信息
  • 在第二次请求的加密对象内,是有这个 s 的,但我测试发现,那个 s 是可以写死的,并不需要第一次请求回来的 s 值,
  • 也就是说,这次返回的信息,只不过是让服务器记录一下 ce 值。
  • 现在 ce 值已经记录。开始第二次请求。

第二次请求 w 值


  • 第二次请求就是我们点击了验证按钮之后,发起的请求,也是用调用栈跟值。
  • 跟到以下位置,分析如下。
  • 在第一个参数e中可以看到以下列表,鼠标移动点击轨迹列表
    鼠标移动点击轨迹列表
  • 第二个参数t也是鼠标的轨迹,但好像每次获取的都是固定值。
  • 第三和第四个参数是环境参数,也是可以写死的。
    第三第四参数
  • 参数a就是加密的大对象了。
    第二次请求加密参数分析
  • 其中 s 值可以写死,上面的 aeskey 是之前生成的随机值
    aeskey
  • 参数 o 测试了多次,应该是按钮点击的时间。
  • 最后进行参数的组合
    组合出浏览器环境参数
  • 在组合 s 的时候,还会带上浏览器参数对象
  • 其中的时间戳我是做成动态修改的,其他值直接写死。
    浏览器参数对象
  • 最后进行一次拼接,然后加密,返回的就是 w 值。
    最终拼接w值。
  • 最后进行请求,返回一个参数,带上参数请求返回登录成功。
    最终登录成功

极验滑块

开始就是分析请求

请求分析

  • 走流程分析请求。
    请求分析
  • 可以看到也是请求了一个 gt 值和 challerge 值
  • 其实流程和无感是一样的,但需要把无感内部的加密参数做一点点修改。
  • 也就是说,要过滑块,先过无感
  • 验证随机 ce 值。
    验证ce值
  • 这里之前分析过,是给后端发一个 ce 值,之后的请求的加密内容都要带上这个 ce 值。
    请求不同之处
  • 在我们之前最终发起这个请求的时候,返回的就是通过口令了,但这里进行了一次验证。
  • 然后我们带上之前请求来的随机值,去获取滑块。
    网页获取的滑块图片地址
  • 本地修改一下之前的无感参数,就可以获取到图片地址了。
    拿取滑块乱码图
  • 请求的乱码图片是乱码的,但网页上是正确的。
    乱码底图
  • 当我们正确滑动之后,就可以返回通过口令了。
    通过口令

开始调试

问题有四个


  1. 请求到乱码图片。
  2. 将图片还原之后,还要识别出图片缺口的坐标。
  3. 并且生成相应的轨迹。(现在的滑块都是带轨迹的。)
  4. 最终进行加密之后进行一个请求。

还原底图

  • 通过修改原先的无感代码,已经成功请求到图片。
  • 现在跟值看一下图片是怎么被还原的。
  • 通过右侧事件断点,在创建画布的时候下断
    画布创建断点
  • 可以发现有一个平坦流,获取画布上下文
  • 然后在下面有一个循环,猜测就是根据这个循环以及列表进行图片的还原。
    图片还原循环
  • 看下这个putImageData的作用
    菜鸟教程上putImageData!的作用
  • 猜测是这样:循环下面的列表,将列表内的指定区域拿出来,然后通过putImageData函数,将他放回到画布上,组成新的一张图片。
  • 然后 Ge 内部是一个 52 长度的列表,猜测就是把图片分为 52 份,按顺序拿取进行组合。

  • 画布流程 1
    流程1
  • 画布流程 2
    画布流程2
  • drawImage 函数的功能如下
    drawimag函数作用
  • 也就是用drawImage函数将图片绘制在一个画布上,然后用putImageData将指定位置拿出来的画布,画回一个新的画布,最终返回。
  • Ge 的内容生成
    Ge的生成位置

  • 本地 V8 环境因为没有画布,所以无法还原,只能改写为 python 代码。

还原代码:

首先还原生成 Ge 代码

在这里插入图片描述

还原画布代码。

还原画布代码

还原之后获取坐标,以及轨迹

坐标 and 轨迹

扣下加密代码

  • 数据都有了,现在就是扣下网页的加密代码,把数据加密之后,发过去就可以了。
  • 流程都和无感差不多,但极验混淆了扣起来就很费劲。
    极验滑块结果

文章作者: 林木木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林木木 !
评论
 上一篇
playwright playwright
Playwright是一种进程外自动化驱动程序,不受页面内JavaScript执行范围的限制,并且可以自动执行具有多个页面的方案。
2021-11-07
下一篇 
Selenium Selenium
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
2021-10-27
  目录