某验四代滑块验证码逆向分析

逆向目标

  • 目标:某验四代滑块验证码,w 参数逆向
  • 主页:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
  • 加密算法:RSA、AES

通讯流程

01

验证码流程分析

进入网页后,打开开发者人员工具进行抓包,点击滑动拼图验证,此时还未点击按钮开始验证,抓到了一个名为 load?captcha_id=xxx 的包,Query String Parameters 包含了一些参数:

02

  • captcha_id:验证码 id,固定值,由 adaptive-captcha-demo.js 文件生成,后文分析;
  • challenge:动态变化,由 gtc4.js 文件生成,后文分析;
  • client_type:表示 web 端;
  • risk_type:验证码类型,例如滑块为 slide,无感为 ai;
  • lang:语言;
  • callback:geetest_ + 时间戳,主要作用是防止缓存。

响应预览中返回的关键内容如下,相较于三代,底图未做混淆:

03

  • bg:背景图片地址;
  • captcha_type:验证码类型;
  • gct_path:gct4 文件路径;
  • lot_number:后续生成 pow_msg、w 的关键参数;
  • payload:后续 verify 请求接口需要的参数;
  • datetime:ISO 8601扩展格式的日期,后续生成 pow_msg 的关键参数;
  • process_token:后续 verify 请求接口需要的参数;
  • slice:滑块图片地址。

点击按钮开始验证,弹出滑块验证码,滑动滑块,抓包到 verify?captcha_id=xxxQuery String Parameters 同样包含了一些参数:

04

  • captcha_id:与 load 接口请求头中的 captcha_id 一致;
  • client_type:表示 web 端;
  • lot_number:load 接口返回的;
  • risk_type:与 load 接口中的一致,表示验证码类型;
  • payload:load 接口返回的;
  • process_token:load 接口返回的;
  • w:加密参数,由轨迹、滑动时间、滑动距离、userresponse、device_id、pow_msg 等参数加密得到;
  • callback:geetest_ + 时间戳,主要作用是防止缓存。

响应预览中返回的内容如下,result 值为 fail 即校验失败,success 为校验通过,通过后携带 seccode 下的参数进行后续业务请求:

05

逆向分析

captcha_id 参数

全局搜索 captcha_id,跟进到 gt4.js 文件中:

06

进去后在第 307 行打上断点,刷新页面即会断住,此时 captcha_id 参数的值已经生成,同时 challenge 参数定义在下一行:

07

向上跟栈到 value,即 adaptive-captcha-demo.js 文件中,会发现其是个固定值,实际上这个值是每个网站不一样,是管理员在极验后台申请得到的:

08

challenge 参数

前面提到,challenge 参数定义在 captcha_id 参数的下一行,在 gt4.js 文件的第 309 行打下断点:

09

可以看到,challenge 参数的值由 uuid 函数生成,扣出即可。

w 参数

verify?captcha_id=xxx 接口的堆栈处跟栈进去:

10

打下断点滑动滑块断住后,向上跟栈到 s 处,如果做过某验三代滑块的话,第 6249 行有个很熟悉的东西,"\u0077": r"\u0077" 即字母 w 的 Unicode 值,r 即 w 参数的值:

11

r 参数定义在第 6237 行,e 也是跟三代类似的参数,r 是将 i 参数和转为字符串的 e 参数加密得到的:

12

向上跟栈,找到 e 参数中各部分定义生成的位置,跟到 $_BHIH 中,_ 中先生成了四个键值对:

13

passtimetrack 是熟悉的滑动时间和轨迹,setLeft 为识别出来的缺口距离,userresponse 定义在 19593 行, a 为 setLeft 参数的值,t[$_GDFCG(1909)] 为定值 1.0059466666666665:

 

JavaScript

复制代码

a / t[$_GDFCG(1909)] + 2

接着跟到 $_BCFj 中,e 定义在第 6201 行,下面几行定义了 e 中的 device_idlot_numberpow_msgpow_sign

14

device_id 同一个网站是固定值,lot_number 是 load 响应返回的,控制台打印一下 pow_msgpow_sign 的结果:

15

pow_msg 很明显是由几部分组成的,pow_sign 经过加密,向上跟栈到 init 中,分别定义在第 5837 行和第 5838 行,为 d 字典的键,根据键名取值:

16

d 定义在第 5835 行,这部分还原一下就很明显了:

 

JavaScript

复制代码

var c = t["toDataURL"]()["replace"]("data:image/png;base64,", "") , _ = new w["default"]["MD5"]()["hex"](c); a["options"]["deviceId"] = _; var h = a["options"] , l = h["powDetail"] , p = h["lotNumber"] , f = h["captchaId"] , d = v["default"](p, f, l["hashfunc"], l["version"], l["bits"], l["datetime"], "")

跟进到 v["default"] 中,函数定义在第 6945 行,于 6978 行打下断点:

17

pow_msg_ + h 得到,_ 定义在第 6960 行:

 

JavaScript

复制代码

_ = i + "|" + r + "|" + n + "|" + s + "|" + t + "|" + e + "|" + o + "|";

  • i:l["version"]
  • r:l["bits"]
  • n:l["hashfunc"]
  • s:l["datetime"]
  • t:f, h["captchaId"]
  • e:p, h["lotNumber"]
  • o:""

h 定义在第 6269 行,跟进去是 16 位随机数字符串,pow_sign 为 p,就是 pow_msg 经过 MD5 加密得到的:

18

至此这四个也分析完了,还差以下这部分:

19

em 等定值就不分析了,注意 kqg5:"1557244628",这个参数值和三代滑块中一样,每隔几个小时会改变,向上跟栈到 $_BCFj 中,在第 6207 行打下断点,此时 e 中这个值还未生成:

20

下一行打下断点,下步断点,即执行完 n[$_CBHIE(791)](e); 后,这个参数值就生成了,证明是 n[$_CBHIE(791)] 方法生成的,跟进去:

21

跳转到第 5766 行,在第 5779 行打下断点,此时的 n 中还未生成此参数:

22

执行了 _gct(n) 后即生成:

23

可见其生成位置在 _gct 方法中,跟进去后到 gct4.js 文件,和三代大差不差:

24

可以将值导出,至此 e 就分析完了,接着回到第 6238 行,跟进到加密函数 d[$_CBHHO(84)] 中,定义在第 11669 行,d[$_DIEHS(177)](c) + u 即 r 参数的值,c 为一个大数组,u 明显也经过加密了,所以 r 参数的值就是数组 c 加密后再加上 u 得到的:

25

先跟进到 u,其定义在第 11705 行,解混淆后如下:

 

JavaScript

复制代码

u = new l["default"]()["encrypt"](i);

所以 u 是 i 经过加密后得到的,i 定义在第 11702 行:

 

JavaScript

复制代码

i = (0,d[$_DIEIq(103)])()

跟进到 d[$_DIEIq(103)] 中,定义在第 852 行,又是熟悉的 16 位随机数:

26

i 是随机数,跟进到加密函数 l[($_DIEHS(84))] 中,在第 12725 行,于 12741 行打下断点,可以看到这里就是个 RSA 加密,扣代码或者直接引库即可:

27

回到 c 参数,c 参数的值为一个大数组,其定义在第 11705 行,解混淆后内容如下:

 

JavaScript

复制代码

var c = s[a]["symmetrical"]["encrypt"](e, i);

e 之前分析完了,i 为随机数,两个参数已经分析完了,跟进到加密方法中,在第 12174 行,于 12186 行打下断点,控制台打印一下混淆部分内容,很熟悉的东西,这里就是 AES 加密,iv 为初始向量,加密模式为 CBC,对各类加密算法不熟悉的,可以阅读 K 哥文章 【爬虫知识】爬虫常见加密解密算法:

28

c 参数最后又被 d[$_DIEHS(177)] 函数加密,跟进后,定义在第 547 行,直接扣下来改改即可:

29

结果验证

30

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/144778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

App分发的策略和注意事项

当今的数字化时代中,移动应用程序已经成为了人们生活中不可或缺的一部分。随着智能手机的普及和移动互联网的快速发展,应用程序的分发方式也变得越来越多样化。 App分发是指将移动应用程序通过特定的渠道传递给终端用户的过程。在应用程序开发完成后&am…

Jenkins环境部署与任务构建

一、CI/CD 1、CI/CD 概念: CI/CD 是一种软件开发和交付方法,旨在加速应用程序的开发、测试和部署过程,以提高软件交付的质量和效率。 (1) 持续集成 (CI Continuous Integration): 持续集成是开发团队频繁集成其代码更改的过程。开发者将其…

[Golang]多返回值函数、defer关键字、内置函数、变参函数、类成员函数、匿名函数

函数 文章目录 函数多返回值函数按值传递、按引用传递类成员函数改变外部变量变参函数defer和追踪说明一些常见操作实现 使用defer实现代码追踪记录函数的参数和返回值 常见的内置函数将函数作为参数闭包实例闭包将函数作为返回值 计算函数执行时间使用内存缓存来提升性能 参考…

数据结构 MapSet(搜索)

数据结构 Map&Set(搜索) 文章目录 数据结构 Map&Set(搜索)1. 搜索树1.1 概念1.2 初始构建1.3 操作-插入1.4 操作-查找1.5 操作-删除1.6 性能分析 2. 搜索介绍2.1 概念及场景2.2 模型 3. Map的使用3.1 关于Map的说明3.2 关于Map.Entry<K, V>的说明3.3 Map的常用方…

又哭又笑,这份面试宝典要是早遇到就好了

01、算法原理 选择排序(Selection sort)是一种简单直观的排序算法。 第一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后再从剩余的未排序元素中寻找到最小&#xff08;大&#xff09;元素&#…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件&#xff0c;但不知道哪个选项最好&#xff1f;没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外&#xff0c;前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

文档的重要性及接口文档模板

随着工作年限的增长&#xff0c;我们逐渐意识到工作中文档的重要性不可忽视。优质的文档不仅能提高工作效率&#xff0c;还能有效降低沟通成本&#xff0c;因此我们必须注重文档的撰写和格式。最近&#xff0c;由于未能及时更新文档&#xff0c;导致在项目开发中出现了信息冲突…

搭建网站七牛云CDN加速配置

打开七牛云后台&#xff1b;添加域名&#xff1b; 添加需要加速的域名&#xff0c;比如我添加的是motoshare.cn 源站配置&#xff0c;这里要用IP地址&#xff0c;访问的目录下面要有能访问测试的文件&#xff0c;尽量不要用源站域名&#xff0c;这个只能用加速二级域名&#x…

51单片机KeyWard

eg1&#xff1a; 单片机键盘的分类 键盘分为编码键盘和非编码键盘&#xff0c;键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值得称为编码键盘&#xff0c;如计算机键盘&#xff0c;而靠软件来识别的称为非编码键盘&#xff0c;在单片机组成的各种…

Leetcode-Easy题解1-回文数字

目录 解法1解法2 解法1 自己的想法,直接转成字符串首尾俩下标同时遍历比较 class Solution {public boolean isPalindrome(int x) {if(x<0){return false;}String strString.valueOf(x);int i0;for (;i<str.length()>>1;i){if(str.charAt(i)!str.charAt(str.leng…

AI篇-如何用AI辅助对图片进行鉴赏

前言 目录 前言 一、观众侧鉴赏图片 方法1&#xff1a;直接将图片发给文心一言&#xff0c;让文心一言分析。 方法2&#xff08;正确方法&#xff09;&#xff1a;将图片简单介绍并把图片发给文心一言&#xff0c;让文心一言分析。 二、作者介绍图片 方法&#xff08;正…

系统架构师考试科目一:综合知识

某软件公司欲开发一个 Windows 平台上的公告板系统。在明确用户需求后&#xff0c;该公司的 架构师决定采用 Command 模式实现该系统的界面显示部分&#xff0c;并设计 UML 类图如下 图所示。图中与 Command 模式中的 Invoker 角色相对应的类是( ) &#xff0c;与 ConcreteComm…