返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >极验3代 加密分析
  • 780
分享到

极验3代 加密分析

爬虫加密算法分析及还原逆向极验验证码极验参数w 2023-09-02 18:09:50 780人浏览 安东尼
摘要

目标链接 'aHR0cHM6Ly93D3cuZ2Vhttps://blog.csdn.net/zhp980121/article/details/ldGVzdC5jb20vZGVtby9zbGHttp

目标链接
'aHR0cHM6Ly93D3cuZ2Vhttps://blog.csdn.net/zhp980121/article/details/ldGVzdC5jb20vZGVtby9zbGHttps://blog.csdn.net/zhp980121/article/details/lkZS1mbG9hdC5odG1s'
接口分析

极验参数重要信息 gt和chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge;gt是固定的,但是chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge每次请求会产生不同的,这里的请求的并没有什么加密参数。

下一个请求 gettype.PHP,传递了 gt 参数的值以及 cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback,cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback 为 geetest_ + 时间戳;响应预览中返回了一些 js 文件及对应的版本号。

get.php?xxx,传入的参数如下:
gt:reGISter-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 gt 值;
chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge 值;
w:对轨迹、滑动时间等进行加密后的参数,不存在轨迹直接置空
cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback:geetest_ + 时间戳。
响应数据好像也没啥,就是极验的帮助中心信息

点击按钮进行验证之后,Network 中抓包到了以下信息 ajax.php?xxx请求
gt:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 gt 值;
chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge 值;
w:对轨迹、滑动时间等进行加密后的参数, w 值也可以直接置空;
cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback:geetest_ + 时间戳。

响应返回验证码模式,滑块验证码为 shttps://blog.csdn.net/zhp980121/article/details/lide,点选验证码为 chttps://blog.csdn.net/zhp980121/article/details/lick

第二个 get.php?xxx,urhttps://blog.csdn.net/zhp980121/article/details/l 中传递了一些参数
gt:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 gt 值;
chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge 值;
cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback:geetest_ + 时间戳。
type:上个请求返回的验证码类型
重点响应参数:
bg:被打乱的带缺口背景图,需要还原
fuhttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lbg:被打乱的完整背景图,需要还原
shttps://blog.csdn.net/zhp980121/article/details/lice:滑块图片,不需要还原
c:关键参数,与后面 aa 参数的值有关,固定值;
s:关键参数,与后面 aa 参数的值有关。

接下来请求ajax.php?xxx
t:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 gt 值;
chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge:register-shttps://blog.csdn.net/zhp980121/article/details/lide 响应返回的 chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge 值 + 两位字符串,注意多了两位,是第二个 get.php?xxx 返回值中得到的;
w:对轨迹、滑动时间等进行加密后的参数,需要通过逆向得到;
cahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lback:geetest_ + 时间戳。

参数分析
需要分析的参数chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge+两位数、w参数

w参数:

w 参数在 js 文件中有特征码,点击按钮进行验证之后,ctrhttps://blog.csdn.net/zhp980121/article/details/l + shift + f 全局搜索 “\u0077”,因为 \u0077 就是 w 的 Unicode 编码,然后点击进入 shttps://blog.csdn.net/zhp980121/article/details/lide.7.8.9.js 文件中,7.8.9 为当前版本。

进入后点击左下角 {} 大括号,格式化文件,再 ctrhttps://blog.csdn.net/zhp980121/article/details/l + f 局部搜索 “\u0077”,只有一个结果,在第 6086 行,在第 6088 行打下断点,滑动滑块即会断住,h + u 即为 w 参数的值

参数是 h 和 u 相加得到的,所以找到定义的位置,看看是怎么构造生成的

var u = r[$_CAIAt(754)]()https://blog.csdn.net/zhp980121/article/details/l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]())h = m[$_CAIAt(782)](https://blog.csdn.net/zhp980121/article/details/l)"\u0077": h + u

可以看到,h 参数是传入了 https://blog.csdn.net/zhp980121/article/details/l 参数后经过 m[$_CAIAt(782)] 方法处理后得到的

u参数
1. u 参数通过 r[$_CAIAt(754)] 方法生成,选中后跟进到方法定义位置

2. 进入函数在 6227 行 return 处打下断点,重新拖动滑块,即会断住

加密地方

e = new U()[$_CBGAZ(353)](this[$_CBGAZ(756)](!0));//还原e = new U()["encrypt"](this["$_CCEc"](!0));

his[“$_CCEc”] 分析完了,那 new U()[“encrypt”] 是什么呢,选中 new U() 后,从原型链中可以看到 setPubhttps://blog.csdn.net/zhp980121/article/details/lic,根据经验很有可能就是 RSA 加密设置公钥

第 2908 行,ut 函数传入了两个值,t 为公钥值,e 为公钥模数,都是固定值:
t:“00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81”
e:“10001”
这里可以直接引库复现,也可以选择将算法部分扣下来,局部搜索 var U = function,在第 2043 行,将整个自执行函数扣下来,这里随机数后期写成固定值,后面也有随机数,不然会造成传参不匹配

剩下就一点点扣

参数https://blog.csdn.net/zhp980121/article/details/l

u 参数解决后,接着需要分析 https://blog.csdn.net/zhp980121/article/details/l 参数,内容如下:
// 混淆https://blog.csdn.net/zhp980121/article/details/l = V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]());// 未混淆https://blog.csdn.net/zhp980121/article/details/l = V["encrypt"](gt["stringify"](o), r["$_CCEc"]());

https://blog.csdn.net/zhp980121/article/details/l 参数的结果是将 gt.“stringify”(o)'和 r.“ C C E c " ( ) 加密后得到的,先来分析 r . " _CCEc"() 加密后得到的,先来分析 r." CCEc"()加密后得到的,先来分析r."_CCEc”() , r"$_CCEc"()还是16位字符串。(记得得干rsa同一个值

将这里写成跟之前一样的固定值, gt[“stringify”](o) 返回的是 JSON 格式的数据,由 o 参数生成

userresponse:滑动距离 + chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge 的值;
passtime:滑块滑动时间;
imghttps://blog.csdn.net/zhp980121/article/details/load:图片加载时间;
aa:轨迹加密;
ep-tm:window[“perfORMance”][“timing”] 相关;
mocq:每天 key、vahttps://blog.csdn.net/zhp980121/article/details/lue 会变,后文分析;
rp:gt + 32 位 chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge + passtime,再经过 MD5 加密。

键值进行分析,先来分析下 userresponse,o 定义在第 6012 行:

o = {    'https://blog.csdn.net/zhp980121/article/details/lang': i[$_CAIAt(116)] || $_CAHJd(103),    'userresponse': H(t, i[$_CAHJd(182)]),    'passtime': n,    'imghttps://blog.csdn.net/zhp980121/article/details/load': r[$_CAIAt(750)],    'aa': e,    'ep': r[$_CAHJd(714)]()};

userresponse 定义在第 6014 行,需要分析 H(t, i[$_CAHJd(182)]),控制台打印一下

见通过整个H函数扣下来补环境。

passtime需要跟轨迹的最后一个时间一样

接着分析aa 其定义在第 6017 行,值由参数 e 传递,同样向上跟栈到 $_CGhttps://blog.csdn.net/zhp980121/article/details/lj 中,为第 8168 行的 https://blog.csdn.net/zhp980121/article/details/l 值,https://blog.csdn.net/zhp980121/article/details/l 定义在第 8167 行,三个参数加密后得到:

n[ D A A A V ( 913 ) ] [ _DAAAV(913)][ DAAAV(913)][_CJJJb(1066)]() :轨迹加密后的结果;
n[ D A A A V ( 69 ) ] [ _DAAAV(69)][ DAAAV(69)][_CJJJb(1097)] :c 值,在第二个 get.php?xxx 返回的响应中得到;
n[ D A A A V ( 69 ) ] [ _DAAAV(69)][ DAAAV(69)][_CJJJb(319)] :s 值,在第二个 get.php?xxx 返回的响应中得到。
这里相当于就是得把轨迹进行加密,将其算法全扣下来。细节就是它加密了两次。
轨迹值:

ep 定义在第 6018 行,跟进到 r/[ C A H J d ( 714 ) ] 中, t m 参数定义在第 6239 行 ! [ 在这里插入图片描述 ] ( h t t p s : / / i m g − b https://blog.csdn.net/zhp980121/article/details/l o g . c s d n i m g . c n / b e 90376 d f 73 c 4 b 3 c 91 e 86 f 15195 c f b a 8. p n g ) 跟进 n e w b t ( ) [ _CAHJd(714)] 中,tm 参数定义在第 6239 行 ![在这里插入图片描述](https://img-bhttps://blog.csdn.net/zhp980121/article/details/log.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png) 跟进 new bt()[ CAHJd(714)]中,tm参数定义在第6239![在这里插入图片描述](https://imgbhttps://blog.csdn.net/zhp980121/article/details/log.csdnimg.cn/be90376df73c4b3c91e86f15195cfba8.png)跟进newbt()[_CBGEC(760)] 中,在第 5268 行打下断点,tm 结果如下

再把this$_BJBFK(666)补上即可

往下看可以发现o新增了两个参数的,接下来分析 rp 参数,定义在第 6076 行

o[$_CAIAt(791)] = X(i[$_CAIAt(104)] + i[$_CAIAt(182)][$_CAHJd(139)](0, 32) + o[$_CAHJd(704)]);o["rp"] = X(i['gt'] + i['chahttps://blog.csdn.net/zhp980121/article/details/lhttps://blog.csdn.net/zhp980121/article/details/lenge']['shttps://blog.csdn.net/zhp980121/article/details/lice'](0, 32) + o['passtime']);

经过验证X就是MD5,而且是没有魔改的

接下来每次请求会变的那个参数

接着往下找,第 6026 行 a = window[$_CAHJd(744)](s) 执行之后 s 中生成了以上的键值对,所以跟进到 window[$_CAHJd(744)] 中,会跳转到 GCt.xxxxxxxx.js 文件中,这个文件的路径可以从 get.php 接口获取到

在该文件的第 1253 行打下断点,可以看到此时的 t 中已经生成了 h9s9: “1803797734” :

参数 o 复现完毕,回到第 6078 行,分析完 V[$_CAIAt(353)] https://blog.csdn.net/zhp980121/article/details/l 即完成,跟进,定义在第 3218 行,在第 3230 行打下断点,这里为 AES 加密,初始向量 iv 值为 “0000000000000000”:

function V(o_text, random_str) {    var key = CryptoJS.enc.Utf8.parse(random_str);    var iv = CryptoJS.enc.Utf8.parse("0000000000000000");    var srcs = CryptoJS.enc.Utf8.parse(o_text);    var encrypted = CryptoJS.AES.encrypt(srcs, key, {        iv: iv,        mode: CryptoJS.mode.CBC,        padding: CryptoJS.pad.Pkcs7    });    for (var r = encrypted, o = r.ciphertext.Words, i = r.ciphertext.sigBytes, s = [], a = 0; a < i; a++) {        var c = o[a >>> 2] >>> 24 - a % 4 * 8 & 255;        s.push(c);    }    return s;};

对比结果一致

参数分析完毕,终于只剩下一个 h 了,m$_CAIAt(782) 即将 https://blog.csdn.net/zhp980121/article/details/l 加密后得到的,跟进 m[$_CAIAt(782)],定义在第 1568 行,在第 1575 行打下断点,为 e 中两个 vahttps://blog.csdn.net/zhp980121/article/details/lue 值相加:

e 定义在第 1574 行,t 为传入的 https://blog.csdn.net/zhp980121/article/details/l 参数,跟进到 this[$_GFJn(264)] 中,在第 1523 行,直接扣下来至此w参数复现完成。

现在已经将h和u还原成功了。

来源地址:https://bhttps://blog.csdn.net/zhp980121/article/details/log.csdn.net/zhp980121/artichttps://blog.csdn.net/zhp980121/article/details/le/detaihttps://blog.csdn.net/zhp980121/article/details/ls/129088754

--结束END--

本文标题: 极验3代 加密分析

本文链接: https://www.lsjlt.com/news/391193.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 极验3代 加密分析
    目标链接 'aHR0cHM6Ly93d3cuZ2Vhttps://blog.csdn.net/zhp980121/article/details/ldGVzdC5jb20vZGVtby9zbGhttp...
    99+
    2023-09-02
    爬虫 加密算法分析及还原 逆向 极验验证码 极验参数w
  • 【JavaScript 逆向】极验三代滑块验证码逆向分析
    声明 本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除! 案例目标 极验验证码 demo:aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby8= 滑动验证码:aHR0cHM6Ly93d...
    99+
    2023-09-09
    python 验证码 JavaScript 逆向
  • nginx添加账号密码验证的示例分析
    这篇文章主要介绍了nginx添加账号密码验证的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。nginx添加账号密码验证server&...
    99+
    2024-04-02
  • Python破解极验滑动验证码的示例分析
    这篇文章将为大家详细讲解有关Python破解极验滑动验证码的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。极验滑动验证码以上图片是最典型的要属于极验滑动认证了,极验官网:http://www.ge...
    99+
    2023-06-15
  • PHP代码加密和扩展解密的示例分析
    这篇文章主要介绍了PHP代码加密和扩展解密的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法...
    99+
    2023-06-14
  • php源代码保护——PHP加密方案分析&解密还原
    前言 php是一种解释型脚本语言.与编译型语言不同,php源代码不是直接翻译成机器语言.而是翻译成中间代码(OPCODE) ,再由解释器(ZEND引擎)对中间代码进行解释运行 . 在php源代码的保护...
    99+
    2023-08-31
    php ide 开发语言
  • 如何分析C# 加密中MD5和SHA1加密实现
    如何分析C# 加密中MD5和SHA1加密实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。对于C# 加密的认识,在C# 中可以很方便地进行MD5 和SHA1 加...
    99+
    2023-06-17
  • jQuery加密密码到cookie的示例分析
    这篇文章主要为大家展示了“jQuery加密密码到cookie的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery加密密码到cookie的示例分析...
    99+
    2024-04-02
  • Springboot实现密码加密解密的示例分析
    这篇文章主要介绍了Springboot实现密码加密解密的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。现今对于大多数公司来说,信息安全工作尤为重要,就像京东,阿里巴巴...
    99+
    2023-05-30
    springboot
  • Python AES加密模块用法分析
    本文实例讲述了Python AES加密模块用法。分享给大家供大家参考,具体如下: AES是新的一种加密模块。在上次介绍过在C语言中如何来OpenSSL中的DES。这次我们来看看Python自带的库如何来使用...
    99+
    2022-06-04
    模块 Python AES
  • Linux中GPG加密的示例分析
    这篇文章主要介绍了Linux中GPG加密的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GPG 可以用来签署和加密数据。方便发送和接收方进行数据加密和对方身份的确认。...
    99+
    2023-06-27
  • Python编程密码学文件加密与解密代码解析
    目录本章要点1 纯文本文件2 使用置换密码加密文件的源代码transpositionFileCipher.py3 运行置换密码加密文件程序的样例4 文件操作4.1 打开文件4.2 数...
    99+
    2024-04-02
  • Laravel中加密解密与哈希实例的分析
    这篇文章给大家分享的是有关Laravel中加密解密与哈希实例的分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、加密解密当你的应用程序中需要用到加密和解密的地方时可以使用Laravel自带的加密解密工具。La...
    99+
    2023-06-14
  • CentOS下Vim加密解密文本的示例分析
    这篇文章主要介绍了CentOS下Vim加密解密文本的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。CentOS用vim/vi给文件加密和解密一、 利用 vim/vi ...
    99+
    2023-06-10
  • MK趋势检验和MK突变检验(代码分享及结果分析)
    MK趋势检验 在时间序列趋势分析中,Mann-Kendall检验是世界气象组织推荐并已被广泛使用的非参数检验方法,最初由Mann和Kendall提出,现已被很多学者用来分析降雨、气温、径流和水质等要素...
    99+
    2023-09-10
    人工智能 python 数据挖掘
  • html5中sign加密算法的示例分析
    小编给大家分享一下html5中sign加密算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!淘宝对于h6的访问采用了和客户端不同的方式,由于在h6的js...
    99+
    2023-06-09
  • Fedora 21中加密政策的示例分析
    小编给大家分享一下Fedora 21中加密政策的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!红帽的下一个Fedora版本Fedora 21刚刚获得了一系列新特征。据Linux领先技术网站Phoronix,Fedo...
    99+
    2023-06-16
  • Android Room数据库加密的示例分析
    这篇“Android Room数据库加密的示例分析”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“Android Room数据库加密的示例分析”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细...
    99+
    2023-06-26
  • ThinkPHP自动加载机制代码分析
    PHP的自动加载机制个人感觉使用起来还是很方便的。关于PHP的自动加载机制,其核心的方法是__autoload()和spl_autoload_register()两个函数。 在PHP5之后,当加载P...
    99+
    2024-02-27
  • Spring源码剖析3:懒加载的单例Bean获取过程分析
    spring ioc 容器的加载流程...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作