首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【验证码逆向专栏】某验四代滑块验证码逆向分析

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标

目标:某验四代滑块验证码,w 参数逆向

主页:

加密算法:RSA、AES

通讯流程

验证码流程分析

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

:验证码 id,固定值,由  文件生成,后文分析;

:动态变化,由  文件生成,后文分析;

:表示 web 端;

:验证码类型,例如滑块为 slide,无感为 ai;

:语言;

:geetest_ + 时间戳,主要作用是防止缓存。

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

:背景图片地址;

:验证码类型;

:gct4 文件路径;

:后续生成 pow_msg、w 的关键参数;

:后续 verify 请求接口需要的参数;

:ISO 8601扩展格式的日期,后续生成 pow_msg 的关键参数;

:后续 verify 请求接口需要的参数;

:滑块图片地址。

点击按钮开始验证,弹出滑块验证码,滑动滑块,抓包到 , 同样包含了一些参数:

:与 load 接口请求头中的 captcha_id 一致;

:表示 web 端;

:load 接口返回的;

:与 load 接口中的一致,表示验证码类型;

:load 接口返回的;

:load 接口返回的;

:加密参数,由轨迹、滑动时间、滑动距离、userresponse、device_id、pow_msg 等参数加密得到;

:geetest_ + 时间戳,主要作用是防止缓存。

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

逆向分析

captcha_id 参数

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

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

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

challenge 参数

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

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

w 参数

从  接口的堆栈处跟栈进去:

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

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

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

接着跟到  中,e 定义在第 6201 行,下面几行定义了 e 中的 、、、:

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

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

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

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

由  得到, 定义在第 6960 行:

i:

r:

n:

s:

t:

e:

o:

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

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

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

下一行打下断点,下步断点,即执行完  后,这个参数值就生成了,证明是  方法生成的,跟进去:

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

执行了  后即生成:

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

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

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

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

跟进到  中,定义在第 852 行,又是熟悉的 16 位随机数:

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

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

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

c 参数最后又被  函数加密,跟进后,定义在第 547 行,直接扣下来改改即可:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230105A05IOC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券