最新要闻
- 环球信息:爱奇艺APP投屏加钱 上海消保委点名批评:不合理、不厚道
- 特斯拉降价效果显著!友商会不会跟进降价?
- 焦点消息!阿凡达2不适合国人?国产科幻大片《流浪地球2》迎战 还有《满江红》等一次看爽
- 12306出现故障无法查车次 客服回应:网络问题 建议多次刷新
- 环球焦点!羡慕吗?微软宣布给员工“无限休假”福利:不再固定天数
- 环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
- 前沿资讯!微信隐藏功能无了!群空间助手小程序宣布3月下线:号称永久保存
- 世界滚动:腾讯优酷后!爱奇艺限制投屏 会员只能看480P:专家发声 用户只能接受
- 环球快看点丨SUV比亚迪卖爆!榜一大哥月销7万+、一代神车没落
- 《黑豹2》女主演利蒂西娅·赖特:续集已在计划中
- 头条:疑似零跑C11路边停车起火 车尾疯狂往外喷火
- 男子开豪车带马狗羊回家过年 它们都是自己的家人:画面让网友难受
- 公交司机边开车边抠脚引乘客担忧 官方回应:会研究处理
- 内存、SSD价格雪崩 韩国芯片双雄终于顶不住了?
- 又一日系品牌拥抱比亚迪 铃木EVX概念车首发:用上刀片电池
- 全球视点!美国最大私人地主 大量买地引质疑!比尔盖茨回应:只为提高产量
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球热文:【验证码逆向专栏】某验二代滑块验证码逆向分析
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在公众号【K哥爬虫】联系作者立即删除!
逆向目标
- 目标:某验二代滑块验证码逆向分析
- 主页:
aHR0cDovL3d3dy5qc2dzai5nb3YuY246NTg4ODgvbWluaS9uZXR3ZWIvU01MaWJyYXJ5LmpzcA==
- 说明:大多数逻辑其实和三四代都一样,相同的就简写了,有疑惑的地方可以看以前的文章
- 【验证码逆向专栏】某验三代滑块验证码逆向分析
- 【验证码逆向专栏】某验四代滑块验证码逆向分析
抓包情况
主页点击搜索就会跳出二代的验证码,netWebServlet.json
的请求,会返回 challenge
和 gt
。
(相关资料图)
有个 get.php
的请求,返回了一个新的 challenge
,这个请求之后的操作,都要用这个新的 challenge
,不然是验证不成功的,其他的还有验证码背景图片、乱序图片地址、c
、s
等值,之前写过三代的文章,都是类似的,这里就不一一分析了。
然后是 ajax.php
验证是否通过,通过之后返回一个 validate
,请求里同样是需要我们逆向的 w
参数:
然后同样还是 netWebServlet.json
接口,带上 get.php
请求返回的 challenge
以及 ajax.php
返回的 validate
,请求拿到一个 name
的字段。
后续的搜索数据,带上这个 name
就行了:
逆向分析
搞过三、四代的都知道我们可以直接搜索 w
的 Unicode 值 \u0077
即可定位,但是二代则不是 Unicode,而是16进制的编码,搜索 \x77
即可定位,当然按照正常流程,跟栈也能很容易找到加密的位置。
获取 H7z 值
从上图中可以知道 w
的值为 r7z + H7z
,先看 H7z
。
跟进这个方法,来到一大串控制流,这里还是推荐用 AST 还原一下,后续可能有一些循环啥的,硬跟的话容易出错,当然直接全部扣一把梭也是可以的,H7z
的核心其实就是 RSA 加密随机字符串,三代四代都有,这里就不细讲了。
获取 r7z 值
然后就是 r7z
,主要由以下两句代码生成:
q7z = n0B[M9r.R8z(699)](h7B[M9r.C8z(105)](Y7z), V7z[M9r.R8z(818)]())r7z = p7B[M9r.R8z(260)](q7z)
可以看到其中有个变量 Y7z
参与了计算,先来看看他是怎么来的,直接搜索即可定位,可以发现同样是16进制的编码,由五个值组成:userresponse
、passtime
、imgload
、aa
、ep
获取 userresponse 值
挨个分析,首先是 userresponse
,将滑动距离和 challenge
的值传入一个方法,得到一个 9 位字符串:
上图中 g7z
就是滑动距离,搜索可以看到定义的地方,尺子量一下对比一下,和滑动的距离是一致的:
然后再来看看那个方法,跟进去之后也是一大串 switch-case
控制流:
还原一下代码如下:
function getUserResponse(L0z, o0z) { for (var j0z = o0z.slice(32), c0z = [], X0z = 0; X0z < j0z.length; X0z++){ var K0z = j0z.charCodeAt(X0z); c0z[X0z] = K0z > 57 ? K0z - 87 : K0z - 48; } j0z = 36 * c0z[0] + c0z[1]; var k0z = Math.round(L0z) + j0z; o0z = o0z.slice(0, 32); var n0z, f0z = [[], [], [], [], []], Q0z = {}, N0z = 0; X0z = 0; for (var i0z = o0z.length; i0z > X0z; X0z++){ n0z = o0z.charAt(X0z), Q0z[n0z] || (Q0z[n0z] = 1, f0z[N0z].push(n0z), N0z++, N0z = 5 == N0z ? 0 : N0z); } var y0z, v0z = k0z, B0z = 4, x0z = "", I0z = [1, 2, 5, 10, 50]; while ( v0z > 0) { v0z - I0z[B0z] >= 0 ? (y0z = parseInt(Math.random() * f0z[B0z].length, 10), x0z += f0z[B0z][y0z], v0z -= I0z[B0z]) : (f0z.splice(B0z, 1), I0z.splice(B0z, 1), B0z -= 1); } return x0z;}
获取 passtime 值
passtime
不用考虑是怎么通过函数获取的,含义就是滑动完成所花费的时间,直接取轨迹的最后一个值即可,这个也和三四代是一样的,获取语句为:var passtime = track[track.length - 1][2]
,如下图所示,轨迹的最后一个值时间为 871,passtime
的值同样也为 871。
获取 imgload 值
imgload
也没啥特别的,从字面意思猜测应该是图片加载耗时,实测直接写死即可,或者整个随机值就行。
获取 aa 值
aa
的值就是 F7z
,如下图所示:
搜索 F7z
,定位到下图所示的地方,向一个方法中传入了一个时间戳:
跟进去同样是 switch-case
控制流,需要注意的是下图中 c7B[M9r.R8z(781)](M9r.R8z(764), K1z)
的值其实就是轨迹。
这段控制流还原一下就变成这样了:
function getF7z(track){ var o5r = 6; for (var N1z, X1z = s6z(track), f1z = [], B1z = [], o1z = [], t1z = 0, j1z = X1z.length; t1z < j1z; t1z++){ if (o5r * (o5r + 1) % 2 + 8) { 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; } } return f1z.join("") + "!!" + B1z.join("") + "!!" + o1z.join("");}function s6z(F6z){ for (var Y6z, g6z, a6z, E6z = [], D6z = 0, P6z = [], J6z = 0, l6z = F6z.length - 1; J6z < l6z; J6z++) { 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)); } return 0 !== D6z && E6z.push([Y6z, g6z, D6z]), E6z;}function O6z(r6z){ 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);}function u6z(R6z){ for (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; h6z < C6z; h6z++){ if (R6z[0] == z6z[h6z][0] && R6z[1] == z6z[h6z][1]){ return "stuvwxyz~"[h6z] } } return 0;}
以上只是 F7z
第一次生成的地方,后面还有二次处理,如下图所示:
同样跟进去,三个传入的参数分别是第一次生成的 F7z
、get.php
请求返回的 c
和 s
参数。
同样是一段控制流,还原后如下:
function getF7z2(Q1z, v1z, T1z){ var i1z, x1z = 0, c1z = Q1z, y1z = v1z[0], k1z = v1z[2], L1z = v1z[4]; while (1){ if (i1z = T1z.substr(x1z, 2)){ 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); }else { return c1z } } return Q1z}
至此 aa
参数分析完毕!
获取 ep 值
ep
的值就是一个版本号,此处是 {"v": "6.0.9"}
,写死即可。
获取 rp 值
自此 Y7z
的第一步生成就分析完毕了,注意接下来还有一步,向 Y7z
里新增了一个 rp
参数:
这个值的组成看起来很长,实际上是将 gt、challenge 前 32 位以及 passtime 相加经过 MD5 加密后得到的。
Y7z["rp"] = md5(gt + challenge.slice(0, 32) + passtime)
上图中 I0B
就是 MD5 方法,跟进去其实是可以看到很多 MD5 特征的,如下图所示:
自此 Y7z
的值就搞定了,然后接着前面的看,也就是 q7z
的值,同样和三四代一样的,encrypt
是 AES 加密,Y7z
经过 JSON.stringify()
处理为字符串作为待加密对象,后面是 16 为随机字符串作为 AES 的 Key,注意这里的随机字符串应该和获取 H7z
值时的随机字符串一致,不然是验证不成功的。
然后下一步就是获取 r7z
的值,将上一步得到的 q7z
经过一个方法进行处理,跟进方法,又是和三四代一样的,熟悉的 res + end
,如下图所示:
直接扣代码,或者直接使用三代的代码即可:
function $_GJF(e) { var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()"; return e < 0 || e >= t["length"] ? "." : t["charAt"](e);}function $_HBO(e, t) { return e >> t & 1;}function $_HCX(e, o) { var i = this; o || (o = i); for (var t = function(e, t) { for (var n = 0, r = 24 - 1; 0 <= r; r -= 1) 1 === $_HBO(t, r) && (n = (n << 1) + $_HBO(e, r)); return n; }, n = "", r = "", s = e.length, a = 0; a < s; a += 3) { var c; if (a + 2 < s) c = (e[a] << 16) + (e[a + 1] << 8) + e[a + 2], n += $_GJF(t(c, 7274496)) + $_GJF(t(c, 9483264)) + $_GJF(t(c, 19220)) + $_GJF(t(c, 235)); else { var _ = s % 3; 2 == _ ? (c = (e[a] << 16) + (e[a + 1] << 8), n += $_GJF(t(c, 7274496)) + $_GJF(t(c, 9483264)) + $_GJF(t(c, 19220)), r = ".") : 1 == _ && (c = e[a] << 16, n += $_GJF(t(c, 7274496)) + $_GJF(t(c, 9483264)), r = "." + "."); } } return { "res": n, "end": r };}
获取 w 值
自此 w
的就已经出来了,r7z + H7z
即为 w
的值。
结果验证
测试过掉验证码抓取数据成功:
环球热文:【验证码逆向专栏】某验二代滑块验证码逆向分析
开源动物行为分析实验箱(斯金纳箱)特色解析及试用条款
环球信息:爱奇艺APP投屏加钱 上海消保委点名批评:不合理、不厚道
特斯拉降价效果显著!友商会不会跟进降价?
焦点消息!阿凡达2不适合国人?国产科幻大片《流浪地球2》迎战 还有《满江红》等一次看爽
12306出现故障无法查车次 客服回应:网络问题 建议多次刷新
环球焦点!羡慕吗?微软宣布给员工“无限休假”福利:不再固定天数
C#、TS和Dart对比4.1:类型概述
全球速递!虚拟串口及其在串口转以太网中的应用
别催了,别催了,这篇文章我一次性把Shell的内容说完
环球观点:AMD RDNA3显卡架构底层细节公开!606页 应有尽有
前沿资讯!微信隐藏功能无了!群空间助手小程序宣布3月下线:号称永久保存
世界滚动:腾讯优酷后!爱奇艺限制投屏 会员只能看480P:专家发声 用户只能接受
环球快看点丨SUV比亚迪卖爆!榜一大哥月销7万+、一代神车没落
《黑豹2》女主演利蒂西娅·赖特:续集已在计划中
头条:疑似零跑C11路边停车起火 车尾疯狂往外喷火
男子开豪车带马狗羊回家过年 它们都是自己的家人:画面让网友难受
公交司机边开车边抠脚引乘客担忧 官方回应:会研究处理
焦点短讯!这些是最热门的机器学习方法!
【播资讯】通过事件总线EventBus/AsyncEventBus进行JAVA模块解耦 (史上最全)
内存、SSD价格雪崩 韩国芯片双雄终于顶不住了?
又一日系品牌拥抱比亚迪 铃木EVX概念车首发:用上刀片电池
全球视点!美国最大私人地主 大量买地引质疑!比尔盖茨回应:只为提高产量
国产家轿又一“黑马”诞生 长安逸达首发亮相
原长城汽车总裁王凤英将出任小鹏CEO 接替何小鹏?内部回应
围棋哪个国家最强?围棋哪个颜色先下?
都挺好苏明成知道自己不是亲生的是第几集?都挺好的结局是什么?
魂来枫林青的下一句是什么?魂来枫林青是什么意思?
李宁标志刺绣是真的吗?李宁标志设计含义
美的净水器好不好?净水器哪个牌子质量好性价比高?
ios7输入法怎么设置成搜狗?ios7输入法打不出汉字怎么办?
怎么修改系统启动项?修改系统启动项的方法有哪些?
新资讯:MySQL间隙锁、行锁的读写阻塞实验
win8如何找到硬件驱动程序?win8怎么进入安全模式?
港利通手机怎么样?港利通手机怎么恢复出厂设置密码?
当前播报:推特广告收入下跌严重:考虑出售15亿用户名创收
今日看点:春节正常发货:仁和N95灭菌级口罩25片15.9元发车
【全球独家】跟上Windows本步伐!苹果正开发触摸屏Mac笔记本:最早2025年发布
秒变战神!杰士邦延时避孕套大促:立减200元 不到20到手
全球新动态:文件出台!车险价格最高可再降23% 开车越稳越便宜
天天报道:TapTap 算法平台的 Serverless 探索之路
我用AI去讨债:一顿操作猛如虎 3000要回350
环球观察:不止投屏缩水 爱奇艺蓝光码率仅蓝光碟1/13 1080P也糊
4999元限量发售!雷军:小米13定制色水泥灰卖的最好
焦点关注:育碧《怒海战记》再度延期
网速比5G提升100倍 2023年我国将全面推进6G技术研发
环球热议:读编程与类型系统笔记05_函数类型
天天资讯:关于 Serverless 应用架构对企业价值的一些思考
焦点热文:男子高速撞鸟 鸟腿成三叉戟立标 丰田秒变“玛莎拉蒂”
世界关注:解除屏蔽!微信已可正常跳转抖音链接
环球最资讯丨造车新势力第一 广汽埃安宣布将涨价:最高涨6000元
全球今亮点!称雷军是导师、大哥 何小鹏:但不想成为他 太累了
每日热文:郭明錤:iPhone 15 Pro将搭载“固态按键” 取消实体键
【播资讯】东北夫妻去三亚 为省8千机票开电车3600公里 充11次电 比油便宜
新资讯:9499元割韭菜!厂商喷RTX 4080太贵 惹怒NV后帖子删除:用户叫好
短讯!24岁湖北小伙搭17个顺风车到格鲁吉亚求婚引羡慕:女子同意 结婚不要彩礼
全球速递!美国航空局系统故障 致全美航班停飞:已有8609架次延误 1251架次取消
每日快看:失灵事故再现?特斯拉刹车又出问题:八车连环相撞!这次不一样
【全球新视野】洛谷P1040. 加分二叉树
C#、TS和Dart对比2:变量和作用域
电脑故障影响数千架次航班!全美航班停飞限制取消
灵动岛只是过渡品!iPhone 16或配备屏下Face ID
当前要闻:小米将参加MWC2013:不会发布小米13 Ultra
弄疯了无数人的游戏:差点让我砸掉显示器!
焦点消息!登录、投屏处处受限!视频平台被指吃相难看 你还开会员吗?
网址导航
全球看点:P2448 无尽的生命
[概率论与数理统计]笔记:3.3 随机向量的函数的分布与数学期望
世界新资讯:React核心概念与JSX
热消息:伊利回应30支冰糕分30箱发货 被网友吐槽太浪费:订单推送失误造成
全球热点!网友拿到了一加11:真的跟老板说的一样巨流畅
mac下php环境搭建
天天快讯:MQ——如何保证消息不会丢失
144MB缓存游戏神U!AMD锐龙7000X3D定档:情人节大礼
【当前热闻】美国所有航班都已停飞 电脑系统竟突发故障:官方给出恢复时间
速看:偶数位(熟悉二进制)
当前信息:Mysql页分裂
焦点关注:日系首款电动B级轿车!本田雅阁插混版来了:可挂绿牌
广州一宝马SUV冲撞人群 官方通报:已致5死13伤 司机被控制
环球即时:太阳4天内发出两次X级耀斑:几天后指向地球、或引强烈地磁暴
世界视点!02-Sed语法介绍
每日聚焦:真我GT Neo5标准版曝光:不到200g机身塞进5000mAh和骁龙8+
天天微头条丨I Do钻戒母公司被申请破产:被年轻人摒弃 太不保值 有人1.8万买只值180元
新款魏牌拿铁DHT-PHEV亮相惹争议 网友吐槽:不能我一个人瞎
CQOI2007,洛谷P4710涂色
头条焦点:小米最好高端口碑!雷军:MIX Fold 2研发成本很高 屏幕是天价定制
奢侈服装品牌Acne新春广告片被批 网友称其“阴间兔”
男童放鞭炮炸飞井盖连砸两车 科普:炮仗遇上下水道堪比小炸弹
【环球播资讯】男子吐槽APP看天气预报要点8个广告 网友:手机自带的不好吗?
世界快看点丨雅迪参展CES:汽车级快充亮相 20分钟充满80%电池
全球快看点丨链表栈队列递归哈希表有序表
Codeforces 1278 F Cards 增强版 题解 (斯特林数,推式子)
热点在线丨sortablejs 列表拖拽排序,js vue2,解决拖拽排序乱序问题
世界快资讯:用低代码这把“剑”之前,要先看定位,各取所需
当前短讯!开源动物行为分析实验箱(斯金纳箱)研发总结
三星Galaxy S24系列或取消Plus版本:销量太惨淡
【天天时快讯】大碗更尽兴!海福盛香辣牛肉面大促:每桶到手3块钱
今日视点:特斯拉2022年中国销量44万辆 还不敌比亚迪一个宋
《咬文嚼字》公布年度十大语文差错:连花清瘟?莲花清瘟?
世界观焦点:荣耀二代骁龙8新机来了!Magic 5系列入网:春节后发布