SDGA Delivery原理学习研究笔记
SDGA.py 运行原理学习研究笔记
概述
SDGA.py
是一个用于从特定服务器下载文件的Python脚本。它通过HTTP请求与服务器通信,并使用自定义的加密和解密方法来处理数据。脚本的主要功能包括发送加密的请求、接收响应、解密数据并下载文件。
主要功能模块
1. 加密与解密
脚本使用了自定义的加密和解密方法,基于zlib
和base64
库。
加密 (
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请求,并处理响应。如果请求成功,脚本会解密响应内容并提取下载链接。
运行流程
初始化:
- 设置请求头,包括
User-Agent
和Pragma
。 - 定义加密密钥
keyChip
。
- 设置请求头,包括
加密请求数据:
- 构造包含
game_id
、ver
、serial
和encode
的字典。 - 使用
urlencode
将字典转换为URL编码字符串。 - 使用
to_dfi
函数对URL编码字符串进行加密。
- 构造包含
发送请求:
- 使用
session.post
方法向服务器发送加密的POST请求。 - 如果请求成功(状态码为200),解密响应内容并提取下载链接。
- 使用
下载文件:
- 使用
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请求处理、数据加密解密以及文件下载的实现原理。