登录模块逆向分析技术大纲

该文章仅供学习参考,不接受商用价值---如有侵权,联系下架

目标登录模块抓包分析

网址: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 等旗下所有平台航司

法律与伦理边界

逆向工程的法律风险警示
授权测试与合规研究的重要性
安全研究的道德规范探讨

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐