某明星辰滑块分析,AES、RSA、MD5、图片拼接

js逆向

本次测试全部在本地或授权环境中进行,内容仅用于学习、技术参考与交流讨论。严禁将本文所述方法或技术用于任何非法用途。

文中提及的所有漏洞均已上报并完成修复。若读者进行类似测试,务必确保所有操作在合法、合规且获得授权的前提下进行。

如有读者因使用本文内容从事危害网络安全的行为,相关后果由其自行承担,原作者不承担任何责任。

本文为原创内容,未经授权,禁止任何形式的转载、复制或引用。如需使用,请联系作者获取授权。

逆向目标

aHR0cHM6Ly93d3cud2FidWcuY24vbG9naW4=

本次js逆向全程由AI进行分析

本文以一个实际的滑块验证码脚本为例,讲解如何利用 Python 自动获取验证码图片、解密数据、识别滑块缺口并完成验证提交。整个流程涉及 AES、RSA、Base64 编码、图像拼接以及 OCR 滑块识别。

Snipaste_2025-08-20_10-56-24

一、整体流程概述

验证码系统一般会在前端使用复杂的加密和图片处理逻辑,保证滑块验证不被轻易绕过。本文的脚本处理流程如下:

  1. 向服务器请求验证码初始化接口 /verify/init,获取包含背景图、滑块图、AES 密钥、RSA 公钥等数据。
  2. 利用 AES 和 RSA 解密获取背景图和滑块图。
  3. 将背景图碎片按服务器给定的顺序拼接成完整图片。
  4. 使用 ddddocr 识别滑块缺口的 X 坐标。
  5. 模拟前端加密逻辑,将滑块坐标进行 RSA + AES 双重加密。
  6. 将加密后的坐标提交到 /verify/verify 接口,完成验证。

二、关键模块解析

1. AES 取中间 16 位作为密钥

def md5_16_from_key(k: str) -> str:
    return hashlib.md5(k.encode()).hexdigest()[8:24]
  • 服务器返回的 k 是原始密钥。
  • 先计算 MD5,再截取中间 16 个字符作为 AES-ECB 加解密的密钥。
  • AES-ECB 是无向量模式,方便单块加密解密,但不推荐用于生产安全传输。

2. AES-ECB-PKCS7 解密

def aes_decrypt_ecb_pkcs7(b64_ct: str, key16: str) -> str:
    cipher = AES.new(key16.encode("utf-8"), AES.MODE_ECB)
    data = base64.b64decode(b64_ct)
    pt = cipher.decrypt(data)
    pad = pt[-1]
    if 1 <= pad <= 16:
        pt = pt[:-pad]
    return pt.decode("utf-8", errors="ignore")
  • 先 Base64 解码,再使用 AES-ECB 解密。
  • 支持 PKCS7 填充去除。
  • 用于解密服务器返回的 rpk(RSA 公钥密文)、滑块信息等。

3. RSA 公钥解密(兼容 PEM/DER)

def import_rsa_public_key_any(pub_str: str) -> RSA.RsaKey:
    ...
  • 可以自动识别 PEM 格式(带 BEGIN PUBLIC KEY)或 Base64 编码的 DER。
  • 用于解析服务器返回的加密公钥。

4. 长消息的 RSA 公钥解密

def rsa_public_decrypt_long_pkcs1_v1_5(b64_ct: str, pub_key: RSA.RsaKey) -> bytes:
    ...
  • 由于 RSA 只能处理有限长度数据,需要分块处理。
  • 每块解密后拼接得到完整明文。
  • PKCS#1 v1.5 解码逻辑用于去除填充字节。

5. 图片拼接

pieces = [Image.open(BytesIO(base64.b64decode(x))) for x in resp["bg"]]
...
canvas.paste(pieces[pidx], (c * pw, r * ph))
  • 服务器通常会将背景图切成若干碎片。
  • 根据解密出的顺序 srs 拼接成完整图片。
  • 滑块图 gd 同样解密得到 PNG bytes。

6. 滑块 OCR 识别

ocr = ddddocr.DdddOcr(det=False, ocr=False)
result = ocr.slide_match(bg_bytes, gd_png)
x_pos = result.get("target", 0)
  • 使用 ddddocr 的滑块匹配功能。
  • 输入完整背景图和滑块图,返回缺口 X 坐标。
  • 这是自动完成滑块验证的核心步骤。

7. 模拟前端加密提交

  • 前端 JS 使用 rsaPubEncrypt + aesEncrypt 对滑块坐标加密。
  • Python 脚本中模拟:
    1. 将 X/Y 坐标用 RSA 公钥加密。
    2. 用 AES-ECB 进行二次加密。
    3. Base64 编码后形成提交数据。
encryptPositions.append([aesPosX, aesPosY])
payload = {"key": webKey, "clientPositions": encryptPositions}
requests.post(url, data=json.dumps(payload), headers=headers)
  • 最终 POST 到 /verify/verify 完成验证。

三、注意点与安全性分析

  1. AES-ECB 模式不安全,纯粹用于滑块模拟。
  2. RSA 公钥加密只提供数据防篡改能力,不保证加密强度。
  3. 滑块 OCR容易受背景变化影响,需要实际调试。
  4. 服务器偶尔会对解密数据进行填充或截断,脚本做了容错处理。
  5. 自动识别与提交验证,本质是模拟前端行为,需合理使用,避免触碰法律和网站使用条款。

四、总结

  • 本脚本完整复刻了前端滑块验证码处理流程:初始化 → AES/RSA 解密 → 图片拼接 → OCR → 加密提交。
  • 使用 Python + ddddocr 实现滑块自动识别和自动验证。
  • 技术亮点:
    1. 分块 RSA 公钥解密。
    2. AES-ECB 双重加密模拟前端。
    3. 滑块 OCR 与完整图片拼接。
  • 可以作为学习前端加密流程、图像验证码识别、Python 图像处理和加密结合的案例。