某税Tpass滑块验证逆向「已过时」
实战js逆向
本次测试全部在本地或授权环境中进行,内容仅用于学习、技术参考与交流讨论。严禁将本文所述方法或技术用于任何非法用途。
文中提及的所有漏洞均已上报并完成修复。若读者进行类似测试,务必确保所有操作在合法、合规且获得授权的前提下进行。
如有读者因使用本文内容从事危害网络安全的行为,相关后果由其自行承担,原作者不承担任何责任。
本文为原创内容,未经授权,禁止任何形式的转载、复制或引用。如需使用,请联系作者获取授权。
相关接口代码已失效且过时,为便于研究与参考,本文仅公开图形计算部分的代码。
使用方法
python3 example.py
完整代码
import cv2
import numpy as np
import base64
class ImageUtils:
"""图像处理工具类"""
@staticmethod
def fix_base64_padding(b64str: str) -> str:
"""修复base64填充"""
if "," in b64str:
b64str = b64str.split(",")[1]
return b64str + '=' * (-len(b64str) % 4)
@staticmethod
def save_base64_image(base64_str: str, filename: str) -> None:
"""保存base64图片到文件"""
if "," in base64_str:
base64_str = base64_str.split(",")[1]
image_data = base64.b64decode(base64_str)
with open(filename, "wb") as f:
f.write(image_data)
@staticmethod
def decode_base64_image(data_url: str) -> np.ndarray:
"""解码base64图片为numpy数组"""
if ',' in data_url:
_, base64_data = data_url.split(',', 1)
else:
base64_data = data_url
img_bytes = base64.b64decode(base64_data)
img_array = np.frombuffer(img_bytes, dtype=np.uint8)
return cv2.imdecode(img_array, cv2.IMREAD_COLOR)
@staticmethod
def identify_gap(bg_bytes: bytes, tp_bytes: bytes) -> int:
"""识别滑块缺口位置"""
# 读取图片
bg_img = cv2.imdecode(np.frombuffer(bg_bytes, np.uint8), cv2.IMREAD_GRAYSCALE)
tp_img = cv2.imdecode(np.frombuffer(tp_bytes, np.uint8), cv2.IMREAD_GRAYSCALE)
# 裁剪滑块图片(去除透明边缘)
yy, xx = [], []
for y in range(tp_img.shape[0]):
for x in range(tp_img.shape[1]):
if tp_img[y, x] < 200:
yy.append(y)
xx.append(x)
if yy and xx:
tp_img = tp_img[min(yy):max(yy), min(xx):max(xx)]
# 边缘检测
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 转换为RGB
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 模板匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
_, _, _, max_loc = cv2.minMaxLoc(res)
# 绘制结果并保存
th, tw = tp_pic.shape[:2]
tl = max_loc
br = (tl[0] + tw, tl[1] + th)
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2)
cv2.imwrite('distinguish.jpg', bg_img)
return max_loc[0]
class CaptchaSolver:
"""验证码求解器"""
def calculate_slide_distance(self, canvas_base64: str, block_base64: str) -> int:
"""计算滑动距离"""
print("🧮 正在计算滑动距离...")
try:
bg_bytes = base64.b64decode(ImageUtils.fix_base64_padding(canvas_base64))
tp_bytes = base64.b64decode(ImageUtils.fix_base64_padding(block_base64))
offset = ImageUtils.identify_gap(bg_bytes, tp_bytes)
print(f"🎯 计算得出滑动距离: {offset} px")
return offset
except Exception as ex:
print(f"❌ 计算滑动距离失败: {ex}")
return 0