X程滑块与点选验证码逆向技术分析大纲

网址:

aHR0cHM6Ly9mbGlnaHRzLmN0cmlwLmNvbS9vbmxpbmUvbGlzdC9vbmV3YXktc2hhLWRveT9kZXBkYXRlPTIwMjYtMDEtMTMmY2FiaW49eV9zX2NfZiZhZHVsdD0xJmNoaWxkPTAmaW5mYW50PTA=

逆向分析的核心目标
  • 滑块验证
  • 点选验证
点选验证码逆向方法

        触发点选的接口如下。里面包含rid和token还有base64编码的大图和小图

断点分析:验证发包的参数如下,appid可以写死,token和rid分别是触发接口返回的值,business_site和version还有cdn可以写死。加密的参数为verify_msg,dimensions,extend_param,sign

verify_msg参数:跟栈分析。verify_msg是_0x1bbf7b生成传参为点选轨迹,这个步骤是将内容变成string,继续往下跟

发现轨迹最后复制了点选的三个点击的xy值

把轨迹固定,只将点选位置改为动态的。然后跟栈进入 _0x13332c方法看到encrypt和后面赋值为decrypt可以确定这是一个AES加密

AES用python来实现将key和ivcopy下来

def pkcs7_pad(data, block_size):
    """PKCS#7填充"""
    padding_length = block_size - (len(data) % block_size)
    padding = bytes([padding_length] * padding_length)
    return data + padding

def encrypt_aes_hex_iv(plaintext):
    # 将十六进制格式的密钥和初始化向量转换为字节串
    key = binascii.unhexlify('8f235bc1cac17a46530c616ff234be78')
    iv = binascii.unhexlify('69783956775867344e5853626b645431')

    # 创建AES加密对象,使用CBC模式
    cipher = AES.new(key, AES.MODE_CBC, iv)

    # 对明文进行填充
    padded_plaintext = pkcs7_pad(plaintext.encode('utf-8'), AES.block_size)

    # 进行加密
    ciphertext = cipher.encrypt(padded_plaintext)

    # 将加密后的字节串转换为Base64编码的字符串
    return binascii.b2a_base64(ciphertext).decode('utf-8')

dimensions:重复刚才的断点跟栈,dimensions是_0x438c2d赋值的,搜索发现重复刚才的aes加密,里面是环境信息。(该文章只讲验证码,登录不讲)将里面的user,login_id,ip等动态替换

extend_param:浏览器的宽高进行aes。可以写死,也可以替换

sign:sign是由_0x3f3255赋值,而这个变量是经过md5

里面的参数是body的别的参数进行拼接。

请求验证

区分成功与失败:

        响应成功后里面的字段process_type为Null是成功,如果是JIGSAW则正面是滑块,如果是icon则是点选。基本上是一层JIGSAW成功后是icon再成功则过

滑块验证码逆向方法

         滑块跟点选逻辑一样,唯一的区别是verify_msg里面的value值,点选是xy的数组,滑块是x距离

法律与伦理边界
  • 逆向技术的合法使用场景(授权测试、学术研究)
  • 风险提示(数据隐私、服务滥用责任)
工具与代码示例(可选)
  • 滑块距离运算----------------利用openvc图图片进行高斯滤波,锐度,灰度化等操作来计算缺口从边缘到缺口的距离(可以适当的调整图片比例来适应图片尺寸)
  • 点选坐标获取
    1------可以调用打码平台,普遍成功率在70%左右
    2------可以自己训练模型。将识别的距离进行扁平化处理传入
  • 主包采用是先打码平台使用,再自己搭建模型训练。在成功率上去之后替换掉打码平台
    主包采用yolov8m模型。成功率在40%-60%之间

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐