极验滑块流程简单分析(内含ast源码)

原创
2020/07/17 00:00
阅读数 1.4K

之前比较难产

最近这两天有时间就水几篇文章

群友有提到极验的滑块

鸭鸭同志前面很多滑块的分析单单少了经典的极验

简单开个头,分享一个以前记过的流程

如果有需要可以整一篇详细的流程分析


该文章主要提供交流学习使用,请勿利用其进行不当行为!
如本篇文章侵犯了贵公司的隐私,请联系我立刻删除!

如因滥用解密技术而产生的风险与本人无关



极验滑块流程(以demo为例):

https://www.geetest.com/demo/slide-bind.html


1、获取 gt,challenge :

https://www.geetest.com/demo/gt/register-slide?t=时间戳获取


2、获取 validate(解决滑块验证码):

①获取滑块图片地址以及参数:

依次访问(其中 gt,challenge 为第一步获取的)

 

https://api.geetest.com/gettype.php?gt={}&callback= ,


https://api.geetest.com/get.php?gt={0}&challenge={1}&''lang=zhcn&pt=0&w=&callback=,

 

https://api.geetest.com/ajax.php?gt={0}&challenge={1}&lang=zhcn&pt=0&w=&callback=,

                 返回验证类型为 slide


可以发现上面的w直接传了空值,针对滑块可以这样子写,能过不就行了

 

https://api.geetest.com/get.php?is_next=true&type=slide3&gt={}&challenge={}&lang=zh-cn&https=true&protocol=https%3A%2F%2F&offline=false&product=embed&api_server=api.geetest.com&isPC=true&width=100%&callback=geetest_1,

 

返回验证码图片的地址,后续需要的 参数c,s !!!以及返回34位的challenge(后续需要的challenge为34位challenge)

 

②图片还原及缺口位置loc的获取:

上一步获取了图片的地址,将原图和缺口图片还原,同时图片还原的时间为imgload参数

 

③初始轨迹列表 track获取:

列表由[x, y, t], x为移动的距离,最后x的值为loc的大小,t为时间,最后t的值为passtime

极验成功率和轨迹关系很大噢!!!

 

④轨迹aa获取

由track经过第一次加密得到的字符串,再和参数c,s经过第二次加密得到


⑤关键参数w的获取:

所需参数: 

字典i:其中 

lang,ep为定值(其中tm参数可为空,其余为定值) ,

userresponse由loc和challenge(34位)加密得到 

passtime,imgload,aa上面获取的参数,

rp为gt,challenge(32位),passtime加密得到;

RSA加密生成的a和aes_key

AES加密生成的数组c(密钥aes_key,加密内容为i(字符串格式))

数组c加密生成字符串u

参数w = u + a

⑥验证即可


怎么样 看起来是不是很简单~


new new new  下面来看看极验的还原吧

这是关键的加密位置

还原后


这样子就够啦~ 至于套娃数组的处理想处理的可以参考之前苏宁的思路一样的~至于其他的。。都已经这样子了你还搞不定,,那你还追求还原度干嘛呢

只要得到方便自己破解的程度即可,下面附上源码:


首先找出解密函数,文件最上面一顿复制就好 形式都一样

const decrypt = {    CallExpression(path) {        const node = path.node        if (node.arguments.length !== 1 && !t.isNumericLiteral(node.arguments[0])) return        const number = node.arguments[0].value        if(typeof number !== "number") return;        # 修改函数名                var value = sN_mt.$_CU(number)        path.replaceWith(t.valueToNode(value))    },    // 处理编码混淆 \uxxxx \x    StringLiteral(path) {        const node = path.node        delete node.extra;    }}
traverse(ast, decrypt);

这样子就可以啦~



本文到此结束~看阅读量及反馈看后续是否需要详细的分析吧~

如果还可以关注一下公众号~点个在看~来个赞赏也可hhh

后续预告 周末或者下周时间可能准备一篇5代的流程或者后缀的分析吧gogogo!


本文分享自微信公众号 - python爬虫与js逆向(pythonORjs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部