验证码逆向专栏某验四代文字点选验证码逆向分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了验证码逆向专栏某验四代文字点选验证码逆向分析相关的知识,希望对你有一定的参考价值。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码

声明

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

本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!

逆向目标

  • 目标:某验四代文字点选证码,w 参数逆向
  • 主页:​​aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v​
  • 加密算法:RSA、AES

通讯流程

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_02

验证码流程分析

进入网页后,点击配置,选择文字点选验证。打开开发者人员工具进行​​抓包​​​,刷新页面,抓到了一个名为 ​​load?captcha_id=xxx​​​ 的包,​​Query String Parameters​​ 包含了一些参数。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_03

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

响应预览中返回的关键内容如下:

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_04

  • ​imgs​​:文字点选图片地址;
  • ​ques​​:  文字点选的次序;
  • ​captcha_type​​:验证码类型;
  • ​gct_path​​:gct4 文件路径;
  • ​lot_number​​:后续生成 pow_msg、pow_sign、w 的关键参数;
  • ​payload​​:后续 verify 请求接口需要的参数;
  • ​datetime​​:ISO 8601扩展格式的日期,后续生成 pow_msg 的关键参数;
  • ​process_token​​:后续 verify 请求接口需要的参数;

 点击按钮开始验证,弹出滑文字点选验证码,按次序点选,抓包到 ​​verify?captcha_id=xxx​​​,​​Query String Parameters​​ 同样包含了一些参数。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_05

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

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_06

逆向分析

captcha_id 参数

全局搜索 ​​captcha_id​​​,跟进到 gt4.js 文件中:进去后在第 309 行打上断点,刷新页面即会断住,此时 ​​captcha_id​​ 参数的值已经生成,同时 challenge 参数定义在下一行。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_极验_07

 全局搜索​​captcha_id​​​:,即 ​​index.ae3fec8e.js​​ 文件中,会发现其是个固定值,实际上这个值是每个网站不一样,是管理员在极验后台申请得到的。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_08

challenge 参数

前面提到,​​challenge​​​ 参数定义在 ​​captcha_id​​ 参数的下一行,在 gt4.js 文件的第 309 行。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_09

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

w 参数

从 ​​verify?captcha_id=xxx​​ 接口的堆栈处跟栈进去。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_逆向_10

在6710行打下断点,刷新页面点选文字断住后,发现参数w,r 即 w 参数的值。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_11

r 参数定义在第 6723 行,分析混淆后的代码,2个传参的格式为对象。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_极验_12

f[$_CBHHP(47)][$_CBHIU(541)]函数的作用是将 e参数转为字符串格式。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_13

继续向上跟栈到 $_BCFb函数,找到 e 参数中各部分定义生成的位置。$_BCFb中成了四个键值对。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_14

​device_id​​​ 同一个网站是固定值,​​lot_number​​​ 是 load 响应返回的,控制台打印一下 ​​pow_msg​​​、​​pow_sign​​ 的结果。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_15

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_逆向_16

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_极验_17

 跟进到 ​​v["default"]​​ 中,函数定义在第 7411行,于 7429行打下断点。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_JS_18

 ​​pow_msg​​​ 由 ​​_ + h​​​ 得到,​​_​​ 定义在第 7429行。

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

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_19

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_20

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_21

 下一行打下断点,下步断点,即执行完 ​​n[$_CBHIE(791)](e);​​​ 后,这个参数值就生成了,证明是 ​​n[$_CBHIE(791)]​​ 方法生成的,跟进去。跳转到第 6251行,在第 6257行打下断点,此时的 n 中还未生成此参数:

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_22

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_23

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_24

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_JS_25

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_极验_26

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_27

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_极验_28

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_逆向_29

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

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_30

 e 之前分析完了,i 为随机数,两个参数已经分析完了,跟进到加密方法中,很熟悉的东西,这里就是 AES 加密,iv 为初始向量,加密模式为 CBC,对各类加密算法不熟悉的,可以阅读 K 哥文章 ​​【爬虫知识】爬虫常见加密解密算法​​。

c 参数最后又被 ​​d[$_DIEHV(186)]​​ 函数加密,跟进后,定义在第 584行,直接扣下来改改即可。

【验证码逆向专栏】某验四代文字点选验证码逆向分析_打码_31

 结果验证

【验证码逆向专栏】某验四代文字点选验证码逆向分析_验证码_32

以上是关于验证码逆向专栏某验四代文字点选验证码逆向分析的主要内容,如果未能解决你的问题,请参考以下文章

验证码逆向专栏某验四代消消乐验证码逆向分析

验证码逆向专栏某验“初代”滑块验证码逆向分析

Js逆向-滑动验证码图片还原

Python开发文字点选验证码,有啥推荐的方法?

.net点选验证码实现思路分享

.net点选验证码实现思路分享