tianai行为验证码JS逆向

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路
本文的验证码网址如下,使用base64解码获得
aHR0cDovL2NhcHRjaGEudGlhbmFpLmNsb3VkLw==

打开官网,由于有许多验证码类型,这里只讲一种,拿滑块验证码举例,通过刷新验证码后,请求验证码接口如下:
在这里插入图片描述
请求拿到本地后,需要解决的参数有两个custom和ki,跟栈进去,寻找加密逻辑,发现是混淆代码
在这里插入图片描述
大致看了下,都是最基本的混淆,拿出我们自己的混淆代码或者混淆网站还原混淆后,并成功找到加密位置,如下:
在这里插入图片描述
还原之后的逻辑非常显而易见了,拿标注库进行AES加密后,再用RSA加密,我们直接在本地也去实现一下
在这里插入图片描述
拿到加密值后,再次请求,成功拿到所需参数
在这里插入图片描述
接下来分析参数,backgroundImage是背景图片,是经过打乱之后的,templateImage是缺口图片,pos是还原的顺序
在这里插入图片描述
可以看到,分割成了两行五列,pos也是每个坐标对应的正确顺序,我们用cv2库简单还原即可

# 将图片切割,2行5列,切割成10块
# 获取图片的高度和宽度
height, width = image.shape[:2]# 计算每个小块的高度和宽度
block_height = height // 2
block_width = width // 5# 切割图片并保存
blocks = []
for i in range(2):  # 行数for j in range(5):  # 列数# 计算当前小块的起始和结束位置y_start = i * block_heighty_end = (i + 1) * block_heightx_start = j * block_widthx_end = (j + 1) * block_width# 切割图片block = image[y_start:y_end, x_start:x_end]blocks.append(block)# 加载并排列图片
arranged_images = []
for idx in pos:# 加载对应索引的图片image = blocks[int(idx)]arranged_images.append(image)# 创建一个空白画布,用于排列图片
canvas_height = blocks[0].shape[0] * 2  # 乘以 2 是因为有两行
canvas_width = blocks[0].shape[1] * 5   # 乘以 5 是因为有五列
canvas = np.zeros((canvas_height, canvas_width, 3), dtype=np.uint8)# 排列图片
for i in range(2):  # 行数for j in range(5):  # 列数idx = i * 5 + j  # 计算对应图片的索引if idx < len(arranged_images):# 将图片复制到画布上canvas[i * blocks[0].shape[0]: (i + 1) * blocks[0].shape[0], j * blocks[0].shape[1]: (j + 1) * blocks[0].shape[1]] = arranged_images[idx]# cv2.resize(canvas, (300, 180))
# 保存排列后的图片
cv2.imwrite('arranged_image.png', canvas)

还原之后效果如下:
在这里插入图片描述
经过多次请求发现,滑块有可能是两个缺口,有可能是一个缺口,针对这种情况,我们可以使用模板匹配的方法去校验缺口距离,具体可以参考我这篇文章:Python-Opencv 识别滑块验证码缺口位置

我这里也放出相关代码

# -*- coding: utf-8 -*-
import cv2
import numpy as np
import osdef cv_show(img): # 展示图片cv2.imshow("img", img)cv2.waitKey(0)cv2.destroyAllWindows()def get_q():# 转换颜色通道,保持颜色准确image = cv2.imread(r"arranged_image.png")gap = cv2.imread(r"que.png")image_gray = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY)gap_gray = cv2.cvtColor(gap.copy(), cv2.COLOR_BGR2GRAY)h, w = gap_gray.shapew_start_index, h_start_index = 0, 0w_end_index, h_end_index = w, h# 缺口图去除背景for i in range(h):if not any(gap_gray[i, :]):h_start_index = ielse:breakfor i in range(h - 1, 0, -1):if not any(gap_gray[i, :]):h_end_index = ielse:breakfor i in range(w):if not any(gap_gray[:, i]):w_start_index = ielse:breakfor i in range(w - 1, 0, -1):if not any(gap_gray[:, i]):w_end_index = ielse:break# 取出完整的缺口图gap_gray = gap_gray[h_start_index:h_end_index+1, w_start_index:w_end_index+1]image_gray = cv2.adaptiveThreshold(image_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 0)gap_gray = cv2.adaptiveThreshold(gap_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 0)image_v1 = cv2.Canny(image_gray, 0, 500)gray_v1 = cv2.Canny(gap_gray, 0, 500)# cv_show(gray_v1)result = cv2.matchTemplate(image_v1, gray_v1, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)x, y = max_loch, w = gap_gray.shaperesult = np.array(image.copy())color = (0, 0, 255)# print(check_box)cv2.rectangle(result, (x, y), (x + w, y + h), color, 2)# res = np.hstack([image_gray,gray_v1, image_v1, result])# cv_show(result)return x

经测试,准确率还是蛮高的,接下来,回到网页中去查找发送参数,可以看到,发送参数比之前多了个id和data
在这里插入图片描述
这里的id就是之前请求验证码的id,data就是我们需要破解的参数,继续回到之前加密的地方可以发现,加密还是同一个地方,只是这次多一次加密,加密的数据如下
在这里插入图片描述
这里就很简单了,我们把参数构造下,轨迹模拟下,再次请求,就能得到成功响应结果
在这里插入图片描述
这里,也感谢我的一位小伙伴,告诉我滑块轨迹非常严格,让我少走弯路

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/302644.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QGIS操作:制作速率专题图

1、修改配色色带 双击打开的矢量文件&#xff0c;弹出如下图所示的图层属性界面&#xff0c;如下图所示&#xff1b; 点击左侧 符号化&#xff0c;选择色带的变化方式、符号、颜色渐变等方式&#xff1b; 设置每个色带所表示的数值范围&#xff0c;变化模式等内容&#xff1…

猫头虎分享已解决Error: 解决“IndexError: list index out of range“

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 文章目录 猫头虎分享已解决Error: 解决"IndexError: list index out of range" &#x1f431;&#x1f989;&#x1f6e0;️摘要正文内容一、错误现场勘察 &#x1f575…

java报错:程序包XXXXXX不存在,但pom文件没报错

本地包找不到 直接找不到的包在生命周期重新install&#xff1b; 重新启动成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

电商系列之风控安全

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

11.python的字典dict(下) 遍历字典,结构优化

11.python的字典dict(下) 遍历所有的键值对 items()方法是字典的一个内置方法&#xff0c;用于返回字典中所有键值对的视图&#xff08;view&#xff09;。它返回一个可迭代的对象&#xff0c;每个元素都是一个包含键和对应值的元组。 下面用一个例子来说明items()方法的用法…

Flutter 解决NestedScrollView与TabBar双列表滚动位置同步问题

文章目录 前言一、需要实现的效果如下二、flutter实现代码如下&#xff1a;总结 前言 最近写flutter项目&#xff0c;遇到NestedScrollView与TabBar双列表滚动位置同步问题&#xff0c;下面是解决方案&#xff0c;希望帮助到大家。 一、需要实现的效果如下 1、UI图&#xff1…

安全左移是什么,如何为网络安全建设及运营带来更多可能性

长久以来&#xff0c;网络安全技术产品和市场需求都聚焦于在“右侧”防护&#xff0c;即在各种系统、业务已经投入使用的网络环境外围或边界&#xff0c;检测进出的流量、行为等是不是存在风险&#xff0c;并对其进行管控或调整。 然而事实上&#xff0c;安全风险不仅是“跑”…

Jackson 各种注解使用示例

参考资料 Jackson使い方メモ 目录 一. JsonIgnore二. JsonIgnoreProperties三. JsonProperty3.1 作用于entity属性上&#xff0c;指定json对象属性名3.2 作用于entity方法上&#xff0c;指定json对象属性名 四. JsonFormat4.1 日期格式化4.2 数字格式化4.3 枚举类返回code 五.…

记录一次hss不能防护主机的问题

场景&#xff1a;hss的控制台显示不在防护中&#xff0c;其他云主机并没有这个情况。 故障发生的时间是昨天下午15点半左右&#xff0c;运维同事做了重启网卡的操作。service network restart 排查分析&#xff1a; 于是仔细的查看日志&#xff0c;发现报错如下&#xff1a…

MySQL-用户与权限管理:用户管理、权限管理、角色管理

用户与权限管理 用户与权限管理1.用户管理1.1 登录MySQL服务器1.2 创建用户1.3 修改用户1.4 删除用户1.5 设置当前用户密码1.6 修改其它用户密码 2. 权限管理2.1 权限列表2.2 授予权限的原则2.3 授予权限2.4 查看权限2.5 收回权限 访问控制连接核实阶段请求核实阶段 3. 角色管理…

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开

扫描IP开放端口该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开 #/bin/bash #该脚本用于对特定目标主机进行常见端口扫描(加载端口字典)或者指定端口扫描,判断目标主机开放来哪些端口 #用telnet方式 IP$1 #IP119.254.3.28 #获得IP的前…

基于遗传优化的SVD水印嵌入提取算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化的的SVD水印嵌入提取算法。对比遗传优化前后SVD水印提取性能&#xff0c;并分析不同干扰情况下水印提取效果。 2.测试软件版本以及运行结果展示 MA…

Set及其实现类与常用方法

1.Set及其常用实现类 Set接口是java.util.Collection接口的子接口.用来存储一个一个的数据.后面学习到的Map接口则用来存储key-value键值对. Set : 存储无序的,不可重复的数据|----->HashSet : 主要实现类 : 底层使用的是HashMap,即使用数组单向链表红黑树来存储。|-----&…

[C语言]——柔性数组

目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…

机器学习模型——K—Means算法

目录 无监督学习概念&#xff1a; 有监督学习与无监督学习&#xff1a; 无监督学习 - 聚类分析 &#xff1a; 聚类算法应用场景&#xff1a; 常用聚类算法介绍&#xff1a; 对不同的聚类算法应用选择原则&#xff1a; 基于原型聚类&#xff1a; K-Means聚类算法概念及步…

访问网站时你的电脑都做了什么

电脑在访问百度时 首先在本地hosts文件里面查看本地有无域名对应的IP地址&#xff0c;若有就直接返回。若无&#xff0c;则本地DNS服务器当DNS的客户&#xff0c;向其它根域服务器发送报文查询IP地址&#xff0c;简单来说就是帮助主机查找IP&#xff0c;所以递归查询就在客户端…

秋招复习笔记——八股文部分:操作系统

笔试得刷算法题&#xff0c;那面试就离不开八股文&#xff0c;所以特地对着小林coding的图解八股文系列记一下笔记。 这一篇笔记是图解系统的内容。 硬件结构 CPU执行程序 计算机基本结构为 5 个部分&#xff0c;分别是运算器、控制器、存储器、输入设备、输出设备&#xf…

Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo

概述 本文探讨 Wails 框架的使用&#xff0c;从搭建环境到开发&#xff0c;再到最终的构建打包&#xff0c;本项目源码 GitHub 地址&#xff1a;https://github.com/mazeyqian/go-run-wechat-demo 前言 Wails 是一个跨平台桌面应用开发框架&#xff0c;他允许开发者利用 Go …

5.网络编程-socker(golang版)

目录 一、什么是socket&#xff1f; 二、Golang中使用TCP TCP服务端 TCP客户端​​​​​​​ 三、TCP黏包&#xff0c;拆包 1.什么是粘包&#xff0c;拆包&#xff1f; 2.为什么UDP没有粘包&#xff0c;拆包&#xff1f; 3.粘包拆包发生场景 4.TCP黏包 黏包服务端 …