声明

本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!

案例目标

验证码:aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9qaWdzYXc=

以上均做了脱敏处理,Base64 编码及解码方式:

import base64
# 编码
# result = base64.b64encode('待编码字符串'.encode('utf-8'))
# 解码
result = base64.b64decode('待解码字符串'.encode('utf-8'))
print(result)

案例分析

抓包

清空浏览器缓存(必须),刷新页面,network 中抓包到 d 接口和 b 接口:

d 接口请求头

d 接口响应内容

b 接口请求头

b 接口响应内容

由上可知,两个接口的请求参数都为 d、v、cb,d 经过加密,二者的 d 参数加密逻辑大致相同,有很多环境校验,比如鼠标事件、canvas、user-agent、document等等;cb 为 __wmjsonp+字符串,可以扣到也可以固定;v 为版本号,有几种,类似主备域名,对应的 js 也有几套,不过只是变量名不同,可以从 config/js 接口中获取到:

getconf 接口,bid、pn 不同网站不一样,可以理解为验证码的标识:

get?referer 接口返回滑块和背景图,请求参数中 cb、acToken 需要逆向分析:

check?referer 接口返回验证结果及 validate 参数的值,请求参数中 data、cb 需要逆向分析:

逆向分析

d、b 参数

清除浏览器缓存,刷新网页即会出现 d 接口,从 OC 跟进去,然后跟栈到 anonymous 中,在第 3720 行打下断点,第 3719 行的 d 及 d 接口请求参数中 d 的值:

d 是传进来的:

通过跟栈会发现,d 参数由下图位置传入,环境校验了 window.navigator、window.screen、window.document 等等:

回到开始位置,跟进到 Ya() 中,c、d 此时为空,l、d 为 undefined,m 为固定值,不用网站不一样,其他的扣即可,注意作用域,变量名可能冲突:

同样通过跟栈,b 接口请求参数 d 的生成位置即下图 e,扣即可,和 d 接口大差不差:

c、d 为 d 接口响应的第二、三个值,l、m 为固定值,不同网站不一样,q 为随机数,扣即可:

cb 参数

全局搜索 cb: ,跟进到 core.v2.21.3.min.js 文件中,在第 10398 行打下断点即会断住,c() 即生成 cb 参数的方法:

跟进去,e 为 uuid,将 e 及 P 方法扣下来即可,这个站点没校验 cb 参数:

fp 参数

一开始断在 cb 处的时候,fp 参数值就已经生成了,往上跟栈会发现 fingerprint 即 fp 参数的值:

fingerprint 位置为 Object ---> state ---> fingerprint,this.state 定义在第 5186 行,打断点后换个模式的滑块即会断住,因为 fp 参数在滑块图片生成之前生成:

接着向上跟栈到 a 中,此时的 fingerprint 已经生成值,参数 a 定义在第 3998 行,为 window["gdxidpyhxde"],可以通过 hook 的方式定位:

hook 代码如下:

(function() {'use strict';var fp_hook = "";Object.defineProperty(window,'gdxidpyhxde',{set:function(val){console.log("fp参数的值为: ", val);debugger;this._value = val;return val;},get:function(){return fp_hook;}});
})();

清除浏览器缓存后刷新网页即会断住:

此时 fp 参数的值已经生成,向上跟栈到 N 中,由下图可知,fp 参数的值为 Ri + : + 时间戳得到的:

这里看着扣就行了,需要注意的是 R 参数,扣完如果缺少环境会导致生成数字不全,校验了 canvas、languages、User-Agent、localStorage,toDataURL 等等,需要注意的是官网请求头中同样校验了 languages,其他的例如知乎登录、某税务局并没发现存在这个问题:

acToken 参数

全局搜索 acToken,逐个打断点,点击滑块验证,在第 10416 行断住后向上跟栈:

e[t(2332)] 即 acToken 的值,其定义在上面的 resolve 中:

在第 2480 行打断点,重新加载滑块,下步断点,直至 acToken 参数生成,向上跟栈到 g 中:

跳转到 watchman.min.js 文件中,红框处即生成 acToken 参数的真正位置:

跟进 dc 方法中,La(JSON[b[392]](a)) 即 acToken 参数值,a 字典中有三个值,r 为固定值 1,这里的 d 为请求时的 d 接口响应返回的第三个值,所以 d 请求扣的有问题会导致 acToken 也有问题,b 为上面红框处的 r 值,是个随机数,定义在第 3770 行,acToken 对于随机数校验并不严,但不能写成固定值,其他的慢慢扣就行了:

即 bc() 方法生成,跟进去将相关内容扣下来即可:

data 参数

向上跟栈到 onMouseUP 处,在 core.v2.21.3.min.js 文件的第3391 行打下断点,断住后于控制台打印 data: 后面部分的把内容,即 data 参数的值:

第 3385 行定义了 a、r 及 o,根据控制台打印的内容可以看出,a 为轨迹数组,并且经过了加密处理,s[e(986)](this[e(2236)], l),l 为固定值 50,意思是取原轨迹数组的前 50 位进行加密处理,不论轨迹有多长,只校验前 50 个,不过易盾对于轨迹的校验并不严格,易盾智能无感模式里面也有个滑块,那个滑块甚至没校验轨迹,只校验了缺口距离;r 为 get 接口响应返回的 token 值;o 即滑动滑块的距离经过相关计算后加密的得到的值,这里的 width 宽度需要与请求中的一致:

原始轨迹的位置在 onMouseMove 中:

[Math["round"](r["dragX"] < 0 ? 0 : r["dragX"]), Math["round"](r["clientY"] - r["startY"), s["now"]() - r["beginTime"]];
// [x, y, time]
Math["round"](r["dragX"] < 0 ? 0 : r["dragX"]) // index_0 ---> x
Math["round"](r["clientY"] - r["startY") // index_1 ---> y
s["now"]() - r["beginTime"]  // index_2 ---> time

相应地方用 console.log 打印一下,替换 js 后就能看到原始轨迹,也验证了只会加密前 50 个轨迹,根据打印出的情况对应写轨迹算法,其他的直接扣即可:

结果验证

结言

d 请求很关键,d 不对 acToken 就不对,如果失败大概率是 d 的问题,注意环境问题,轨迹几乎不校验,根据观察,最近可能是要更新一些逻辑,官网存在阉割情况,建议去实测,网易严选(js未混淆)、知乎、某苏税务局等。

【JavaScript 逆向】网易易盾滑块逆向分析相关推荐

  1. 网易易盾滑块逆向分析 js 滑动轨迹生成_1

    网易易盾无感逆向 提示:仅学习参考,如有涉及侵权联系本人删除 目标网站已做脱敏处理 aHR0cHM6Ly9kdW4uMTYzLmNvbS90cmlhbC9zZW5zZQ== 文章目录 网易易盾无感逆向 ...

  2. 网易易盾-滑块-cb参数

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵犯了您的合法权益,请告知,我将及时更正.删除,谢谢.邮箱地址:lc1139411732@163.com 在接下来的一段日子里,我将为大家分 ...

  3. 网易易盾js逆向分析

    目标url:滑动拼图验证码_拼图验证_图形验证_在线体验_网易易盾 抓包分析,先看看传递回来的参数 看起来有用的就这几个包.滑动滑块故意失败,发现传回来断点data传个false,并返回tonke,成 ...

  4. 网易易盾-滑块-fp参数-2022-9-5

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵犯了您的合法权益,请告知,我将及时更正.删除,谢谢.邮箱地址:lc1139411732@163.com 本专题属于系列文章,可以根据个人主 ...

  5. 第46篇-网易易盾滑块请求参数分析【2022-11-16】

    声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一.前言 二.流程分析 三.data参数 1.d值 2 ...

  6. 网易易盾,js逆向:★★★★★

    前言 可以关注我哟,一起学习,主页有更多练习例子 如果哪个练习我没有写清楚,可以留言我会补充 如果有加密的网站可以留言发给我,一起学习共享学习路程 如侵权,联系我,删 此文仅用于学习参考,请勿于商用, ...

  7. 网易易盾的“外挂对抗战”,游戏出海之路如何走得更安全?

    过去二十年,被称为"第九艺术"的游戏成为中国互联网的重要趋势,正前所未有地占据和改变着我们的生活.放眼未来,中国游戏确定了"走出去"的增长目标,在更广阔的海外市 ...

  8. 为物联网代码安全而生 网易易盾公测IoT安全编译器Maze

    ​​IoT时代的到来,让我们生活中物联网设备越来越多,然而设备的代码安全是一切安全的基础,如果设备代码不加以防护或防护不够,将会造成核心技术泄露,给IoT设备稳定运行带来威胁. 与此同时,当下仍有不少 ...

  9. “易+”开源网易易盾 GameSentry 正式开源,做游戏安全保障的尖兵利刃

    The First Line Of Defense - GameSentry 哨兵是守护安全的第一道防线,不停的监视着每一个外敌可能进行渗透的角落.网易易盾的 GameSentry 作为游戏安全战场上 ...

最新文章

  1. Thread start()方法和run()方法的区别
  2. openssl的实践应用
  3. WM有约II(二):持续改进
  4. who killed my time?
  5. CNN Long Short-Term Memory
  6. python计算能够包含两个圆的最小圆
  7. 高手与菜鸟,思想与技术
  8. 记账本开发小计(四)
  9. 计算机适配器有什么作用,例举适配器是什么
  10. 机器学习笔记——决策树之分类树
  11. 北航计算机专业怎么样,选计算机专业,北航、南大、中科大3校如何选择?选北航更有优势...
  12. Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类
  13. 【滤波跟踪】捷联惯导纯惯导解算matlab实现
  14. linux 查看链接文件,Linux下的链接文件详解
  15. cogs1570 KMP hash
  16. java将silk文件转换成MP3
  17. 【TUG 话题探讨 005】TiDB 生态工具(DM、TiCDC等)使用场景及常见问题
  18. python切割图片地图切图脚本
  19. 精确到秒!一位清华学霸的学习生活计划表,值得借鉴!
  20. CTFHub | Refer注入

热门文章

  1. fbd2fbs过采样转换的问题
  2. 计算机主板上的cmos芯片用途,CMOS芯片在主板上的位置(问答方式)
  3. rsync远程同步和inotify实时同步
  4. 概率抽奖工具类(支持概率大于100抽奖)
  5. 计算机网络吴功益ppt,网络技术毕业设计(论文).doc
  6. 短视频矩阵系统,抖音矩阵系统,抖音seo源码。
  7. 鸿蒙大陆鸿蒙之铠,【图说鸿蒙】鸿蒙设定之七柱神(二)
  8. 基于STM32的BMS电池管理系统源代码配官方参考原理图-带实时操作系统
  9. 文档识别档案OCR深度学习
  10. intercept和block的区别