SDGA.py 运行原理学习研究笔记

概述

SDGA.py 是一个用于从特定服务器下载文件的Python脚本。它通过HTTP请求与服务器通信,并使用自定义的加密和解密方法来处理数据。脚本的主要功能包括发送加密的请求、接收响应、解密数据并下载文件。

主要功能模块

1. 加密与解密

脚本使用了自定义的加密和解密方法,基于zlibbase64库。

  • 加密 (to_dfi 函数):

    • 将字符串数据编码为UTF-8格式。
    • 使用zlib.compress进行压缩。
    • 使用base64.b64encode进行Base64编码。
  • 解密 (from_dfi 函数):

    • 使用base64.b64decode进行Base64解码。
    • 使用zlib.decompress进行解压缩。
    • 将解压缩后的数据解码为UTF-8字符串。

2. 文件名提取

get_file_name 函数从URL中提取文件名。它通过解析URL路径并获取最后一个部分作为文件名。

3. 文件下载

download_file 函数负责从指定的URL下载文件。它使用requests库发送HTTP GET请求,并启用流式下载以处理大文件。下载过程中使用tqdm库显示进度条。

4. 请求与响应处理

脚本通过session.post方法向服务器发送加密的POST请求,并处理响应。如果请求成功,脚本会解密响应内容并提取下载链接。

运行流程

  1. 初始化:

    • 设置请求头,包括User-AgentPragma
    • 定义加密密钥keyChip
  2. 加密请求数据:

    • 构造包含game_idverserialencode的字典。
    • 使用urlencode将字典转换为URL编码字符串。
    • 使用to_dfi函数对URL编码字符串进行加密。
  3. 发送请求:

    • 使用session.post方法向服务器发送加密的POST请求。
    • 如果请求成功(状态码为200),解密响应内容并提取下载链接。
  4. 下载文件:

    • 使用download_file函数从提取的下载链接下载文件。
    • 下载过程中显示进度条。

代码示例

import base64
import zlib
from urllib.parse import urlencode, urlparse
from urllib.parse import parse_qs
import requests
from requests import session
from tqdm import tqdm

session = session()
keyChip = 'Hidden'
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': keyChip,
    'Pragma': 'DFI'
}

def to_dfi(data: str) -> bytes:
    unzipped = data.encode('utf-8')
    zipped = zlib.compress(unzipped)
    return base64.b64encode(zipped)

def from_dfi(data: bytes) -> str:
    zipped = base64.b64decode(data)
    unzipped = zlib.decompress(zipped)
    return unzipped.decode("utf-8")

def get_file_name(url: str) -> str:
    parsed_url = urlparse(url)
    file_name = parsed_url.path.split('/')[-1]
    return file_name

def download_file(url: str) -> None:
    print('开始下载'+get_file_name(url))
    response = requests.get(url, headers=headers, stream=True)
    total_size = int(response.headers.get('content-length', 0))
    with open(get_file_name(url), 'wb') as file:
        with tqdm(total=total_size, unit='B', unit_scale=True, desc='Downloading') as progress_bar:
            for chunk in response.iter_content(chunk_size=1024):
                if chunk:
                    file.write(chunk)
                    progress_bar.update(len(chunk))
    print("文件已成功下载")

print("※※开始请求※※")
data = {
    'game_id': 'SDGA',
    'ver': '1.50',
    'serial': keyChip,
    'encode': 'UTF-8',
}
url_data = urlencode(data)
data = to_dfi(url_data)
print('加密前:', url_data)
print('加密后:', data)

txt_Url = []
res = session.post('http://naomi***.***/s**/ser****/Down********', data=data, headers=headers)
if res.status_code == 200:
    print("※※请求成功※※")
    print("响应:", res.content)
    decode_data = from_dfi(res.content)
    print("解密:", decode_data)
    uri_data = parse_qs(decode_data)['uri'][0].split('|')
    for i in range(len(uri_data)):
        if uri_data[i] == '':
            continue
        else:
            print("uri"+str(i)+":",uri_data[i])
            txt_Url.append(uri_data[i])
else:
    print("※※请求失败※※")

总结

SDGA.py 脚本通过自定义的加密和解密方法,实现了与特定服务器的安全通信,并能够高效地下载文件。脚本的结构清晰,功能模块化,便于理解和扩展。通过学习该脚本,可以深入了解HTTP请求处理、数据加密解密以及文件下载的实现原理。