SC RY HO HU等航司btb 登录模块逆向 滑块验证 COOKIE加密
登录模块逆向分析技术大纲
该文章仅供学习参考,不接受商用价值---如有侵权,联系下架
目标登录模块抓包分析
网址:aHR0cHMlM0EvL3NjbmV3YjJiLnRyYXZlbHNreS5jb20uY24vc2NhZ2VudC9pbmRleC5odG1sJTIzL3VuYXV0aC9sb2dpbg==
该网站采用cookie加密以及验证码防护
前端代码逆向分析
进入页面会看到生成一个cookie名为lbinsertroute
一 验证码分析 首先可以看到loginSlide这个请求,这是获取验证码的请求

响应了一个token,两个base64的图片,通过base64转换。发现是验证码的背景图和滑块
以及响应了两个cookie
触发验证码请求 在loginSilde请求下断点分析。发现通过出发滑块,带有x的距离以及token来发送请求

图片处理
写一个base64转图片的方法保存图片
import base64
from io import BytesIO
from PIL import Image
def base64_to_image(base64_string, output_path=None):
"""
Convert base64 string to image
Args:
base64_string (str): Base64 encoded image string
output_path (str, optional): Path to save the image. If None, returns PIL Image object
Returns:
PIL.Image.Image: Image object if output_path is None
bool: True if image is saved successfully
"""
try:
# Remove base64 header if present
if ',' in base64_string:
header, base64_string = base64_string.split(',', 1)
# Decode base64 string
image_data = base64.b64decode(base64_string)
# Convert to image
image = Image.open(BytesIO(image_data))
# Save image if output path is provided
if output_path:
image.save(output_path)
return True
else:
return image
except Exception as e:
print(f"Error converting base64 to image: {e}")
return None if not output_path else False
图片获取距离: 通过opencv将图片进行反相和高斯滤波处理获取背景边缘和缺口的距离,最后通过微调图片比例来获取x的值
import time
import cv2
def dXImgSlider( origin, sliderImg):
slider = cv2.imread(sliderImg)
originImg = cv2.imread(origin)
bgImg = cv2.cvtColor(originImg, cv2.COLOR_BGR2GRAY)
sliderImg = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
# 反相
frame_gray_c = sliderImg.copy()
height, width = frame_gray_c.shape
for i in range(height):
for j in range(width):
pv = frame_gray_c[i, j]
frame_gray_c[i][j] = 255 - pv
# 高斯滤波
imgGaussianBlur1 = cv2.GaussianBlur(frame_gray_c, (3, 3), 0)
imgGaussianBlur2 = cv2.GaussianBlur(bgImg, (7, 7), 0)
# 获取模板图像的高和宽
th, tw = sliderImg.shape[:2]
# 使用标准相关系数匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性
result = cv2.matchTemplate(imgGaussianBlur2, imgGaussianBlur1, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
tl = max_loc
br = (tl[0] + tw, tl[1] + th)
# 绘制识别框
im = cv2.rectangle(originImg, tl, br, (0, 0, 255), 2)
t = time.time() - 60 * 60 * 24 * 30
time_string = time.strftime("%Y%m%d%H%M%S", time.localtime(t))
# save_path = "./img/result" + time_string + ".jpg"
save_path = "img/result1.jpg"
cv2.imwrite(save_path, im)
resObj = [tl[0], tl[1], br[0], br[1]]
resObj = [int(x * 1) for x in resObj]
print(resObj[0])
print(save_path)
return resObj[0]
请求成功后会标记cookie可用,否则生成的cookie可用

登录加密
点击登录会触发loginAgentUser接口,结构如下,可以看到password是加密处理。
打上断点,会发现此时password已经被加密处理了。跟栈处理,
往上跟栈发现此时password也是被加密了,继续往上跟
继续跟栈发现此时n.password调用了一个方法,传入了key和原始的密码

在次打上断点重新触发,可以看到是一个AES加密,而且是一个标准的AES。
登录成功后会响应四个cookie,将所有cookie整合到一起就可以请求查询接口了
总结
成果展示
该逻辑适用于SC HO HU RY NS 等旗下所有平台航司
法律与伦理边界
逆向工程的法律风险警示
授权测试与合规研究的重要性
安全研究的道德规范探讨
更多推荐

所有评论(0)