From 9fdaf17aa71823a6111dab80530d3e198a59f2d8 Mon Sep 17 00:00:00 2001 From: admin <362324317@qq.com> Date: Sun, 17 May 2026 14:29:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Cash=5FBased/S=5FSKmfxs=5F?= =?UTF-8?q?loader.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cash_Based/S_SKmfxs_loader.py | 282 ++++++++++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 Cash_Based/S_SKmfxs_loader.py diff --git a/Cash_Based/S_SKmfxs_loader.py b/Cash_Based/S_SKmfxs_loader.py new file mode 100644 index 0000000..1bd4934 --- /dev/null +++ b/Cash_Based/S_SKmfxs_loader.py @@ -0,0 +1,282 @@ +# cron: 22 1 * * * +# new Env("速看免费小说") +""" +本工具仅用于学习 Python 加密与逆向工程技术,供研究和教学用途。 +请勿将其用于任何非法用途,包括但不限于: 加密恶意脚本 | 逃避安全审计 | 攻击他人系统 | 商业软件加壳绕过 +任何使用本工具所造成的直接或间接后果,包括但不限于法律责任、安全问题、数据损失,均由使用者自行承担,作者不对此承担任何责任。 +如果您不同意此免责声明,请立即停止使用并删除本文件。 + +Developed by Python Vorto加密系统 + +所需要的变量名称及格式,请运行脚本查看! +""" +import os +import sys +import hashlib +import json +import importlib.util +from pathlib import Path +from typing import Optional, Dict, Any + +# 配置(请勿修改) +PROJECT_ID = "ad31d28c-ab54-4692-8471-80bb1ba04a61" +BASE_URL = "https://auth.vzvv.de" +SO_FILENAME = "S_SUKAN" +SO_DIR = "S_SOFILE" +VERSION_FILE = os.path.join(SO_DIR, ".{0}_version.json".format("S_SUKAN")) +ENTRY_FUNCTION = "main" + +# 确保SO文件目录存在 +if not os.path.exists(SO_DIR): + os.makedirs(SO_DIR) + + +def get_python_version() -> str: + return "{0}.{1}".format(sys.version_info.major, sys.version_info.minor) + + +def calculate_md5(file_path: str) -> str: + """计算文件的MD5哈希值""" + md5_hash = hashlib.md5() + try: + with open(file_path, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + md5_hash.update(chunk) + return md5_hash.hexdigest() + except Exception as ex: + print("计算MD5失败: {0}".format(ex)) + return "" + + +def load_local_version() -> Optional[Dict[str, Any]]: + """加载本地版本信息""" + if not os.path.exists(VERSION_FILE): + return None + + try: + with open(VERSION_FILE, 'r', encoding='utf-8') as f: + return json.load(f) + except Exception as ex: + print("读取本地版本信息失败: {0}".format(ex)) + return None + + +def save_local_version(version_info: Dict[str, Any]): + """保存本地版本信息""" + try: + with open(VERSION_FILE, 'w', encoding='utf-8') as f: + json.dump(version_info, f, indent=2, ensure_ascii=False) + except Exception as ex: + print("保存版本信息失败: {0}".format(ex)) + + +def check_server_version() -> Optional[Dict[str, Any]]: + """检查服务器上的活跃版本信息""" + try: + import urllib.request + import urllib.error + + url = "{0}/api/version/{1}".format(BASE_URL, PROJECT_ID) + + try: + with urllib.request.urlopen(url, timeout=10) as response: + data = response.read() + return json.loads(data.decode('utf-8')) + except urllib.error.HTTPError as ex: + if ex.code == 404: + print("项目不存在或没有活跃版本") + else: + print("查询版本失败 (HTTP {0}): {1}".format(ex.code, ex.reason)) + return None + except urllib.error.URLError as ex: + print("网络连接失败: {0}".format(ex.reason)) + return None + + except ImportError: + print("urllib模块不可用,无法检查更新") + return None + except Exception as ex: + print("检查服务器版本失败: {0}".format(ex)) + return None + + +def fetch_changelog(version_id: str) -> Optional[str]: + """获取指定版本的更新描述""" + try: + import urllib.request + import urllib.error + + url = "{0}/api/changelog/{1}".format(BASE_URL, PROJECT_ID) + + try: + with urllib.request.urlopen(url, timeout=10) as response: + data = response.read() + changelog_data = json.loads(data.decode('utf-8')) + + # 查找匹配版本的描述 + for item in changelog_data.get('changelog', []): + if item.get('version_id') == version_id: + return item.get('description', '') + return None + except Exception: + return None + except Exception: + return None + + +def print_update_info(version_info: Dict[str, Any]): + """打印更新信息""" + print("=" * 50) + print("【更新日志】版本 {0}".format(version_info['version_number'])) + print("-" * 50) + + # 尝试获取版本描述 + desc = fetch_changelog(version_info['version_id']) + if desc: + print(desc) + else: + print("(无更新说明)") + + print("-" * 50) + print("查看更多更新日志: {0}/changelog/{1}".format(BASE_URL, PROJECT_ID)) + print("=" * 50) + + +def download_so_file(version_info: Dict[str, Any]) -> bool: + """下载SO文件""" + try: + import urllib.request + + python_ver = get_python_version() + version_id = version_info['version_id'] + + # 构建下载URL + url = "{0}/api/download/{1}/{2}/{3}".format(BASE_URL, PROJECT_ID, version_id, python_ver) + + # 确定SO文件名(包含Python版本),保存到SO_DIR目录 + so_file = os.path.join(SO_DIR, "{0}_{1}.so".format(SO_FILENAME, python_ver.replace('.', ''))) + + print("正在下载版本 {0}...".format(version_info['version_number'])) + + # 下载文件 + urllib.request.urlretrieve(url, so_file) + + # 验证文件完整性(使用对应Python版本的MD5) + md5_hashes = version_info.get('md5_hashes', {}) + expected_md5 = md5_hashes.get(python_ver) + + if expected_md5: + local_md5 = calculate_md5(so_file) + if local_md5 != expected_md5: + print("警告: 文件MD5校验失败") + print(" 期望: {0}".format(expected_md5)) + print(" 实际: {0}".format(local_md5)) + os.remove(so_file) + return False + print("MD5校验通过") + + # 保存版本信息 + save_local_version(version_info) + + print("下载完成: {0}".format(so_file)) + + # 显示更新日志 + print_update_info(version_info) + + return True + + except Exception as ex: + print("下载SO文件失败: {0}".format(ex)) + return False + + +def need_update(local_version: Optional[Dict[str, Any]], server_version: Optional[Dict[str, Any]]) -> bool: + """判断是否需要更新""" + if server_version is None: + # 服务器没有活跃版本 + return False + + if local_version is None: + # 本地没有版本信息 + return True + + # 比较version_id + if local_version.get('version_id') != server_version.get('version_id'): + return True + + # 检查SO文件是否存在 + python_ver = get_python_version() + so_file = os.path.join(SO_DIR, "{0}_{1}.so".format(SO_FILENAME, python_ver.replace('.', ''))) + if not os.path.exists(so_file): + return True + + return False + + +def load_so_module(): + """加载SO模块""" + python_ver = get_python_version() + so_file = os.path.join(SO_DIR, "{0}_{1}.so".format(SO_FILENAME, python_ver.replace('.', ''))) + + # 检查本地版本 + local_version = load_local_version() + + # 检查服务器版本 + server_version = check_server_version() + + # 判断是否需要更新 + if need_update(local_version, server_version): + if server_version: + print("发现新版本: {0}".format(server_version['version_number'])) + if not download_so_file(server_version): + if not os.path.exists(so_file): + raise RuntimeError("SO文件不存在且下载失败: {0}".format(so_file)) + print("下载失败,使用本地版本") + else: + if not os.path.exists(so_file): + raise RuntimeError("SO文件不存在或暂无可用版本: {0}".format(so_file)) + else: + if local_version: + print("使用本地版本: {0}".format(local_version['version_number'])) + + # 检查SO文件是否存在 + if not os.path.exists(so_file): + raise RuntimeError("SO文件不存在: {0}".format(so_file)) + + # 加载SO模块 + try: + spec = importlib.util.spec_from_file_location("encrypted_module", so_file) + if spec is None or spec.loader is None: + raise RuntimeError("无法加载SO模块: {0}".format(so_file)) + + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + + return module + + except Exception as ex: + raise RuntimeError("加载SO模块失败: {0}".format(ex)) + + +# 自动加载模块并执行 +try: + _module = load_so_module() + + # 导出入口函数 + if hasattr(_module, ENTRY_FUNCTION): + entry_func = getattr(_module, ENTRY_FUNCTION) + globals()[ENTRY_FUNCTION] = entry_func + + # 如果作为主程序运行,自动执行入口函数 + if __name__ == "__main__": + result = entry_func() + if result is not None: + print("返回值:", result) + else: + print("警告: SO模块中未找到入口函数 '{0}'".format(ENTRY_FUNCTION)) + # 导出模块本身,允许用户手动访问 + encrypted_module = _module + +except Exception as ex: + print("加载器初始化失败: {0}".format(ex)) + raise