回顾

  1. 上篇文章 介绍了’userresponse’ 参数调试和分析,并将js执行过程整理出来,整理成python代码。
  2. 今天我们继续进行极验破解,这次我们介绍 'aa’参数的生成,距离上篇文章,已经过去快三个月了,工作很忙,又忙着结婚,一直抽不出来空,或者静不下心来写博客,今天总算是忙里偷闲,也让自己沉淀一下,准备更新极验破解第4篇
  3. 正当我撸起袖子准备大干一番的时候,发现我得目标网站,关闭了相关功能页面,不过还好基础页面还在,我还能接着用它的极验滑块接着干,哈哈

不废话了,这次我们直接进入正题

1. 针对aa参数的js断点调试

根据前面的分析,我们先看一下文件geetest.6.0.9.js的第1387行,不知道为啥直接定位这一行的,可以看下之前的文章
我们先在1382行处打一个断点,期望能够获取变量‘F7z ’的值,而由

F7z = p7B["t"](V7z["A"] + p7B["B"]("REFb0UEJ") + F7z

我们知道,这里已经有了右侧F7z的值,因此,我们尝试在geetest.6.0.9.js文件中搜索’F7z’ ,看能否找到F7z的变量声明的地方,我们找到了 1410行
因此这里也需要打上断点

此时就可以开始js调试了,根据调试过程和变量追踪,还是要自己耐住性子一步步来,关于断点调试要说的东西太多,这里还是跳过调试过程,直接给出我整理出’aa’参数生成的js代码(用反混淆之后的js代码)

//V7z["b"] = 1562138812095   2019-07-03 15:26:52
// F7z = "B-/./.(!!Bs(y((((yyysssssssss(!!($)L34434343443B3VB$.3e$)G$,V"""
//           B-/./.(!!BsR(y((((yyysssssssss(!!($)L344343(43443B3VVB$.3e$)G$,V// var g7z = parseInt(a7z), F7z = e7B["t"](V7z["b"]);
function e7B_t(K1z) {var X8r = 27;while (X8r !== 19) {switch (X8r) {case 27:var o5r = 6;X8r = 24;break;case 24:var N1z, X1z = s6z(c7B["a"]("arr", K1z)), f1z = [], B1z = [], o1z = [], t1z = 0, j1z = X1z["length"];X8r = 13;break;case 13:X8r = o5r * (o5r + 1) % 2 + 8 && t1z < j1z ? 2 : 20;break;case 2:N1z = u6z(X1z[t1z]),N1z ? B1z["push"](N1z) : (f1z["push"](O6z(X1z[t1z][0])),B1z["push"](O6z(X1z[t1z][1]))),o1z["push"](O6z(X1z[t1z][2]));o5r = o5r >= 17705 ? o5r / 3 : o5r * 3;X8r = 28;break;case 20:return f1z["join"]("") + "!!" + B1z["join"]("") + "!!" + o1z["join"]("");X8r = 19;break;case 28:t1z++;X8r = 13;break;}}
};c7B["a"] = function(X2z, B2z) {var V0r = 27;while (V0r !== 24) {switch (V0r) {case 27:return c7B["Na"][B2z][X2z];V0r = 24;break;}}
};// F6z = [-21, -21, 0], [0, 0, 0], [1, 0, 96], [5, 0, 106], [8, 0, 117], [14, 0, 128], [19, 0, 138], [25, 0, 149], [30, 0, 159], [33, 0, 170], [36, 0, 180], [39, 0, 191], [40, 0, 202], [41, 0, 212], [42, 0, 233], [43, 0, 243], [44, 0, 284], [45, 0, 305], [46, 0, 640], [47, 0, 691], [48, 0, 782], [48, 0, 1018]
s6z = function(F6z) {var R1r = 27;while (R1r !== 19) {switch (R1r) {case 27:var N5r = 9;R1r = 24;break;case 13:R1r = J6z < l6z && N5r * (N5r + 1) % 2 + 7 ? 2 : 20;break;case 2:Y6z = Math["round"](F6z[J6z + 1][0] - F6z[J6z][0]),g6z = Math["round"](F6z[J6z + 1][1] - F6z[J6z][1]),a6z = Math["round"](F6z[J6z + 1][2] - F6z[J6z][2]),P6z["push"]([Y6z, g6z, a6z]),0 == Y6z && 0 == g6z && 0 == a6z || (0 == Y6z && 0 == g6z ? D6z += a6z : (E6z["push"]([Y6z, g6z, a6z + D6z]),D6z = 0));N5r = N5r > 34958 ? N5r / 6 : N5r * 6;R1r = 28;break;case 24:var Y6z, g6z, a6z, E6z = [], D6z = 0, P6z = [], J6z = 0, l6z = F6z["length"] - 1;R1r = 13;break;case 28:J6z++;R1r = 13;break;case 20:return 0 !== D6z && E6z["push"]([Y6z, g6z, D6z]),E6z;R1r = 19;break;}}
};// R6z = [21, 21, 0]
u6z = function(R6z) {var t8r = 27;while (t8r !== 21) {switch (t8r) {case 2:t8r = R6z[0] == z6z[h6z][0] && R6z[1] == z6z[h6z][1] ? 38 : 28;break;case 24:var z6z = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]], h6z = 0, C6z = z6z["length"];t8r = 13;break;case 27:var f5r = 9;t8r = 24;break;case 38:return "stuvwxyz~"[h6z];t8r = 21;break;case 13:t8r = h6z < C6z && f5r * (f5r + 1) % 2 + 7 ? 2 : 19;break;case 20:h6z++;t8r = 13;break;case 19:return 0;t8r = 21;break;case 28:f5r = f5r >= 62252 ? f5r - 6 : f5r + 6;t8r = 20;break;}}
};//r6z = 26
O6z = function (r6z) {var C1r = 27;while (C1r !== 38) {switch (C1r) {case 27:var d6z = "()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqr", m6z = d6z["length"], Z6z = "", H6z = Math["abs"](r6z), W6z = parseInt(H6z / m6z);W6z >= m6z && (W6z = m6z - 1),W6z && (Z6z = d6z["charAt"](W6z)),H6z %= m6z;var q6z = "";return r6z < 0 && (q6z += "!"),Z6z && (q6z += "$"),q6z + Z6z + d6z["charAt"](H6z);C1r = 38;break;}}
};
var F7z = e7B_t(V7z["b"]);
//v1z = [12, 58, 98, 36, 43, 95, 62, 15, 12]
// T1z = "764b354e"F7z = e7B["u"](F7z, V7z["d"]["c"], V7z["d"]["s"]);
function e7B_u(Q1z, v1z, T1z) {var B8r = 27;while (B8r !== 14) {switch (B8r) {case 20:x1z += 2;var n1z = parseInt(i1z, 16), M1z = String["fromCharCode"](n1z), I1z = (y1z * n1z * n1z + k1z * n1z + L1z) % Q1z["length"];c1z = c1z["substr"](0, I1z) + M1z + c1z["substr"](I1z);B8r = 31;break;case 27:var K5r = 2;var j5r = 4;B8r = 13;break;case 13:B8r = (!v1z || !T1z) && j5r * (j5r + 1) * j5r % 2 == 0 ? 2 : 38;break;case 2:return Q1z;B8r = 14;break;case 31:K5r = K5r > 10375 ? K5r / 8 : K5r * 8;B8r = 28;break;case 28:B8r = (i1z = T1z["substr"](x1z, 2)) && K5r * (K5r + 1) * K5r % 2 == 0 ? 20 : 23;break;case 38:var i1z, x1z = 0, c1z = Q1z, y1z = v1z[0], k1z = v1z[2], L1z = v1z[4];B8r = 28;break;case 23:return c1z;B8r = 14;break;}}
};

将js逻辑改写成pyhon代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-# @Time    : 2019/7/4 9:41
# @Author  : SpiritedAway1106
# @File    : aa
# @Software: PyCharm
# @Description : 获取aa参数的值# 对aa 进行二次加密,拿到最后结果
def e7B_u(Q1z=None, v1z=None, T1z=None):'''TODO对aa进行二次加密参数:Q1z 首次加密的aa值 eg 'B-/./.(!!Bs(y((((yyysssssssss(!!($)L34434343443B3VB$.3e$)G$,V'v1z 极验配置的c参数 eg [12, 58, 98, 36, 43, 95, 62, 15, 12]T1z 极验配置的参数 eg '764b354e'返回值:aa二次加密结果 eg'''Q1z, v1z, T1z = 'B-/./.(!!Bs(y((((yyysssssssss(!!($)L34434343443B3VB$.3e$)G$,V',[12, 58, 98, 36, 43, 95, 62, 15, 12],'764b354e'if v1z and T1z :i1z = ''x1z = 0c1z = Q1zy1z = v1z[0]k1z = v1z[2]L1z = v1z[4]while 1:i1z = T1z[x1z:x1z+2]if i1z:x1z += 2n1z = int(i1z, 16)M1z = chr(n1z)I1z = (y1z * n1z * n1z + k1z * n1z + L1z) % len(Q1z)c1z = c1z[:I1z] + M1z + c1z[I1z:]else:return c1zelse:return Q1z# 返回aa的首次加密值,传入滑动轨迹tracks
def e7B_t(tracks=[]):'''TODO对aa 进行首次加密参数:tracks 滑动路径,三元组列表[[x,y,time]] eg [[-21, -21, 0], [0, 0, 0], [1, 0, 96], [5, 0, 106], [8, 0, 117], [14, 0, 128], [19, 0, 138], [25, 0, 149],[30, 0, 159], [33, 0, 170], [36, 0, 180], [39, 0, 191], [40, 0, 202], [41, 0, 212], [42, 0, 233],[43, 0, 243], [44, 0, 284], [45, 0, 305], [46, 0, 640], [47, 0, 691], [48, 0, 782], [48, 0, 1018]]返回值:'''o5r = 6N1z = ''tracks = [[-21, -21, 0], [0, 0, 0], [1, 0, 96], [5, 0, 106], [8, 0, 117], [14, 0, 128], [19, 0, 138], [25, 0, 149],[30, 0, 159], [33, 0, 170], [36, 0, 180], [39, 0, 191], [40, 0, 202], [41, 0, 212], [42, 0, 233],[43, 0, 243], [44, 0, 284], [45, 0, 305], [46, 0, 640], [47, 0, 691], [48, 0, 782], [48, 0, 1018]]X1z = s6z(tracks)f1z = []B1z = []o1z = []for t1z, X in enumerate(X1z):if o5r * (o5r + 1) % 2 + 8:N1z = u6z(X)if N1z:B1z.append(N1z)else:f1z.append(O6z(X[0]))B1z.append(O6z(X[1]))o1z.append(O6z(X[2]))o5r = o5r / 3 if o5r >= 17705 else o5r * 3return ''.join(f1z) + "!!" + ''.join(B1z) + "!!" + ''.join(o1z)def O6z(r6z=26):'''TODO按规则映射数字和字符参数:r6z eg 26返回值:目标字符 G'''d6z = "()*,-./0123456789:?@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqr"m6z = len(d6z)Z6z = ""H6z = abs(r6z)W6z = int(H6z / m6z)if W6z >= m6z:W6z = m6z - 1if W6z:Z6z = d6z[W6z]H6z %= m6zq6z = ""if r6z < 0:q6z += "!"if Z6z:q6z += "$"return q6z + Z6z + d6z[H6z]def u6z(R6z=[]):'''TODO将路径映射成单个字符参数:R6z  处理后路径中的其中一个元组 eg [21, 21, 0]返回值:映射结果 eg 0'''R6z = [21, 21, 0]z6z = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]]for h6z ,z in enumerate(z6z):if R6z[0] == z6z[h6z][0] and R6z[1] == z6z[h6z][1]:return "stuvwxyz~"[h6z]return 0def s6z(F6z=[]):'''TODO规整滑动路径列表,整理成[x移动距离,y移动距离,时间间隔]元组参数:F6z  滑动路径 eg [[-21, -21, 0], [0, 0, 0], [1, 0, 96], [5, 0, 106], [8, 0, 117], [14, 0, 128], [19, 0, 138], [25, 0, 149],[30, 0, 159], [33, 0, 170], [36, 0, 180], [39, 0, 191], [40, 0, 202], [41, 0, 212], [42, 0, 233],[43, 0, 243], [44, 0, 284], [45, 0, 305], [46, 0, 640], [47, 0, 691], [48, 0, 782], [48, 0, 1018]]返回值:规整后路径位移元组 eg [[21, 21, 0], [1, 0, 96], [4, 0, 10], [3, 0, 11], [6, 0, 11], [5, 0, 10], [6, 0, 11], [5, 0, 10], [3, 0, 11], [3, 0, 10], [3, 0, 11], [1, 0, 11], [1, 0, 10], [1, 0, 21], [1, 0, 10], [1, 0, 41], [1, 0, 21], [1, 0, 335], [1, 0, 51], [1, 0, 91], [0, 0, 236]]'''# F6z = [[-21, -21, 0], [0, 0, 0], [1, 0, 96], [5, 0, 106], [8, 0, 117], [14, 0, 128], [19, 0, 138], [25, 0, 149],#        [30, 0, 159], [33, 0, 170], [36, 0, 180], [39, 0, 191], [40, 0, 202], [41, 0, 212], [42, 0, 233],#        [43, 0, 243], [44, 0, 284], [45, 0, 305], [46, 0, 640], [47, 0, 691], [48, 0, 782], [48, 0, 1018]]Y6z = 0g6z = 0a6z = 0E6z = []D6z = 0 # 滑动消耗总时间P6z = []l6z = len(F6z) - 1for J6z, F in enumerate(F6z):if J6z < l6z:Y6z = round(F6z[J6z + 1][0] - F6z[J6z][0])g6z = round(F6z[J6z + 1][1] - F6z[J6z][1])a6z = round(F6z[J6z + 1][2] - F6z[J6z][2])P6z.append([Y6z, g6z, a6z])if 0 == Y6z and 0 == g6z and 0 == a6z:passelse:if 0 == Y6z and 0 == g6z:D6z += a6zelse:E6z.append([Y6z, g6z, a6z + D6z])D6z = 0else:if 0 != D6z:E6z.append([Y6z, g6z, D6z])return E6zdef main():print(e7B_u())if __name__ == '__main__':main()

总结

  1. 再次强调,反混淆之后的js文件很重要,如果有耐心,甚至可以不在线调试js,直接剥离出‘aa’参数的相关js和执行顺序
  2. 调试一定要有耐心!!!!,几乎每次都会在总结里说
  3. js和python是我之前7月份就整理好的,直接拿来用了,且整理出来的js文件,进行了极小的改动,比如F7z = e7B"t",直接把e7B[“t”]的函数名字,写成了 e7B_t,这种级别的修改不会影响js逻辑,更不会影响跃度,这次只是把之前的文档梳理一下,分享出来,但是断点位置进行了重新确认,不会坑害小伙伴
  4. 代码中的注释还算详细,调试过程中,可根据js中实际变量值,替换py文件中的变量,验证代码是否有效和正确

文档仅作学习和记录使用,请不要用于商业和违法用途,如有侵权,请告知删除。

极验验证码(6.0.9)破解(四) 之 'aa' 参数调试和分析相关推荐

  1. 极验验证码(6.0.9)破解(二) 之 反混淆

    回顾 上篇文章主要分析了极验的请求过程,以及出现的各种参数和配置信息 我们认识到了gt和challenge,极验相关的各种js路径,极验的各种详细配置,以及滑动时生成的参数w 我们的目标是弄明白w参数 ...

  2. 极验验证码破解(二)

    一.网站http://www.gsxt.gov.cn滑动验证码概述 二.极验验证码破解-抓包分析 三.极验验证码破解-搭建本地验证码服务 四.极验验证码破解-分析geetest.js,得到所需参数 五 ...

  3. 极验验证码破解—超详细教程(二)

    极验验证码破解-超详细教程(二) Gayhub:FanhuaandLuomu/geetest_break 2017.8.21 代码以上传,可供参考 [国家企业信用信息公示系统为例] 目录 一.网站ht ...

  4. 极验验证码破解之selenium

    这一篇写完很久了,因为识别率一直很低,没办法拿出来见大家,所以一直隐藏着,今天终于可以拿出来见见阳光了. 哈喽,大家好,我是星星在线,我又来了,今天给大家带来的是极验验证码的selenium破解之法, ...

  5. 极验验证码破解—超详细教程(一)

    极验验证码破解-超详细教程(一) Gayhub:FanhuaandLuomu/geetest_break 2017.8.21 代码以上传,可供参考 目录 一.网站http://www.gsxt.gov ...

  6. 【Python爬虫系列教程 40-100】selenium结合拖拽实现极验验证码破解

    文章目录 前言 1. 破解极验验证码思路 2. B站登录界面 3. 极验缺口图和原始图的截取 4. 对比缺陷图和原始图的像素,确定拖拽的像素 5. 拖拽轨迹 6. 执行以上所有代码,实现破解B站极验验 ...

  7. 极验验证码破解(三)

    一.网站http://www.gsxt.gov.cn滑动验证码概述 二.极验验证码破解-抓包分析 三.极验验证码破解-搭建本地验证码服务 四.极验验证码破解-分析geetest.js,得到所需参数 五 ...

  8. 极验验证码的破解-开篇

    近几年有个拖动解锁的验证码风头很盛,用过12306的人就知道,它有段时间用的就是这个拖动解锁的验证码,据说就是极验验证码,虽然现在12306的验证码变成了看图识画,安全性和趣味性大大提高,但是也还是被 ...

  9. 极验验证码破解—超详细教程(三)

    极验验证码破解-超详细教程(三) Gayhub:FanhuaandLuomu/geetest_brek [国家企业信用信息公示系统为例] 目录 一.网站http://www.gsxt.gov.cn滑动 ...

最新文章

  1. 启动物料帐后不可更改物料价格的处理方法
  2. 水平输送水汽通量matlab,分享:水汽通量散度
  3. Django在admin.py中设置date_hierarchy时报错
  4. 【最详细】数据结构(C语言版 第2版)第二章课后习题答案 严蔚敏 等 编著
  5. python方格染色_Luogu P3631 [APIO2011]方格染色
  6. VS2013 加快编译速度 的方法整理
  7. PyCharm将制表符转换为空格并显示的配置方法
  8. 2019.7.27数组api
  9. ios部分阴影_iOS UIMenuController UIMenuItem第2部分
  10. C#调用大漠插件,发送QQ和微信消息
  11. fiddler 的AutoRespoder的使用(手动添加测试桩)
  12. 那些年学java遇到的好东西
  13. MATLAB绘图颜色、线型设置
  14. 每天一个JavaScript小特效——会魔法的旋转魔方相册
  15. 十分好用PDF转换成PPT转换器
  16. 美团外卖uml流程图_以美团外卖为例,区别业务流程图和页面流程图
  17. linux 显卡 1050ti,MAX-Q终于出中端卡了 GTX1050Ti MAX-Q显卡曝光
  18. Zebras CodeForces - 950C(思维)
  19. Vue Devtools下载使用
  20. DWH的保留原始历史数据的一种方法

热门文章

  1. 抖音的运营技巧是什么?分享5个小技巧
  2. javascript多维数组的排序
  3. CAD如何打印图纸啊,一个里面有好几张图纸,如何打印在A4纸上啊
  4. windows Android Studio连接手机无法识别为安卓设备
  5. DAFormer代码学习
  6. i5-10400H怎么样?相当于什么水平
  7. HashMap嵌套HashMap之遍历
  8. 一文带你看懂 MySQL 存储引擎
  9. 编译方舟编译器源码教程
  10. 华为方舟编译器理解:初探