前言
数美点选和数美滑块加密逻辑相同,详细分析过程可见文章【验证码的识别与逆向】数美滑块全流程分析-附代码 本文主要分析其中变动参数的明文。
一、目标网址
atob(‘aHR0cHM6Ly93d3cuaXNodW1laS5jb20vdHJpYWwvY2FwdGNoYS5odG1s’)
二、逆向分析
通过对数美滑块的分析,我们知道数美验证有register
获取验证码和fverify
提交验证两个接口,这里直接来看fverify
接口。
这个接口中我们可以很明显的看到两个特别长的加密参数,分别为ao
和gm
,这也是我们需要重点关注的两个参数,我们随便选择一个打开F12搜索,'ao'
或者'gm'
。
可以看到ao
搜索结果只有一行,gm
搜索结果有三行,这四行我们随便点击一行进入JS代码。
跳转到JS代码之后,又可以看到我们熟悉的三个大case块。与滑块不同的是,点选走的是第一个case,我们在ao
这一行打下断点,然后手动过点选验证,使断点断下。
和滑块相同,这里this[_0x551ddd(0x511)]
是加密函数,也就是DES ECB模式
,这个函数传入了两个参数,第一个是明文,第二个是密钥,我们在控制台输出一下这两个重点参数的明文和密钥。根据输出我们可以看出
ao
明文为归一化之后的坐标
密钥为1e28f551
gm
明文为归一化之后的坐标
密钥为995190d6
归一化
就是将坐标缩放到0-1
这个区间,我们获取到的背景图为600 * 300
,所以归一化的坐标为[x / 600, y / 300, t]
。
其他参数如果感兴趣也可以用同样的方式在控制台输出明文和密钥,由于数美点选的其他参数明文是固定的,加密结果直接抓包写死就行,这里就不再演示了。
三、坐标识别思路
对于点选类验证码的识别,目前有两种解决方法:
- 目标检测 + 分类网络
- 目标检测 + 孪生网络
目标检测
现在流行的是YOLO系列,GitHub-YOLOv5,用于识别图中文字的位置,使用起来十分简单,可以根据网上的教程进行标注训练。
分类网络
则是我们常说的CNN网络,将切割好的汉字图片标注之后进行训练,需要大量样本。
孪生网络
是将两张图片通过同一个CNN网络,计算出两个输出之间的距离,也就是我们所说的相似度,根据相似度来区分两张图片是否相同。相对于分类网络来说,需要的样本大量减少。
四、坐标识别代码
这里给出使用ddddocr
实现文字坐标识别的代码供大家参考。
from io import BytesIO
import ddddocr
from PIL import Image
# 实例化目标检测模型
detection = ddddocr.DdddOcr(show_ad=False, det=True)
# 实例化分类模型
classification = ddddocr.DdddOcr(show_ad=False)
def get_text_pos(image: bytes, order: list) -> list:
"""
:param image: 图片
:param order: ["享", "庖", "隶", "中"]
"""
# 目标检测 获取文字位置
pos_list = detection.detection(image)
# 将图片用PIL(Pillow)打开
ori_image = Image.open(BytesIO(image))
# 初始化数组
ans = [[]] * 4
for pos in pos_list:
# 切割图片
crop = ori_image.crop(pos)
# 分类网络识别文字
word = classification.classification(crop)
# 查找识别结果在 order (目标文字)中的下标
index = order.index(word) if word in order else -1
if index != -1:
# 找到下标之后将切割图片的中心点加入到ans中
ans[index] = [int((pos[0] + pos[2]) / 2), int((pos[1] + pos[3]) / 2)]
return ans
五、结果演示
需要坐标识别模型的可以私聊作者~