海盗王客户端的纹理贴图bmp文件有些是加密,很多人想解密并修改替换,现在给出解密的python代码:

import os
import struct
import copy
from pathlib import Pathclass TexEncode:def __init__(self):self.MAGIC_BYTES = b'mp.x'  # 魔法字节标识符def _decode0(self, data):"""基础解密操作:交换数据前后部分"""i = 44  # 固定交换长度s = len(data)if s > i:# 保存前i字节tmp = data[:i]# 交换:前i字节替换为后i字节data[:i] = data[s-i:s]# 后i字节替换为之前保存的前i字节data[s-i:s] = tmpreturn datadef _decode1(self, data):"""带标识的解密"""# 检查是否已加密(末尾是否有魔法字节)if len(data) < 4 or data[-4:] != self.MAGIC_BYTES:return None  # 未加密或数据不完整# 移除魔法字节标识data = data[:-4]# 执行基础解密data = self._decode0(data)return datadef decode(self, data):"""对外接口:解密"""return self._decode1(data)def is_encrypted_bmp(file_path):"""检查文件是否为加密的BMP图片"""try:# 检查文件扩展名if file_path.suffix.lower() not in ['.bmp']:return False# 读取文件末尾检查魔法字节with open(file_path, 'rb') as f:f.seek(-4, 2)  # 定位到文件末尾4字节magic_bytes = f.read(4)return magic_bytes == b'mp.x'except:return Falsedef process_file(file_path, encoder):"""处理单个文件"""try:# 读取文件数据with open(file_path, 'rb') as f:data = bytearray(f.read())print(f"正在处理: {file_path}")# 尝试解密decrypted_data = encoder.decode(data)if decrypted_data is not None:# 解密成功,写回原文件with open(file_path, 'wb') as f:f.write(decrypted_data)print(f"✓ 成功解密并替换: {file_path}")return Trueelse:print(f"  文件未加密或解密失败: {file_path}")return Falseexcept Exception as e:print(f"✗ 处理文件时出错 {file_path}: {str(e)}")return Falsedef traverse_and_decrypt(root_folder):"""遍历文件夹,查找并解密加密的BMP图片"""root_path = Path(root_folder)encoder = TexEncode()if not root_path.exists():print(f"错误: 文件夹不存在 - {root_folder}")returnprocessed_count = 0decrypted_count = 0print(f"开始遍历文件夹: {root_folder}")print("=" * 50)# 遍历所有文件for file_path in root_path.rglob('*'):if file_path.is_file():processed_count += 1# 检查是否为加密的BMP文件if is_encrypted_bmp(file_path):if process_file(file_path, encoder):decrypted_count += 1print("=" * 50)print(f"处理完成!")print(f"总共检查文件数: {processed_count}")print(f"成功解密文件数: {decrypted_count}")def main():# 指定要处理的文件夹路径folder_path = input("请输入要处理的文件夹路径: ").strip()if not folder_path:# 默认使用当前目录folder_path = "."try:traverse_and_decrypt(folder_path)except KeyboardInterrupt:print("\n用户中断操作")except Exception as e:print(f"程序执行出错: {str(e)}")# 批量处理多个文件夹的版本
def batch_process_folders(folder_list):"""批量处理多个文件夹"""encoder = TexEncode()for folder_path in folder_list:print(f"\n处理文件夹: {folder_path}")print("-" * 30)traverse_and_decrypt(folder_path)# 安全版本:备份原文件后再处理
def safe_traverse_and_decrypt(root_folder, backup_suffix=".encrypted"):"""安全版本:先备份再处理"""root_path = Path(root_folder)encoder = TexEncode()if not root_path.exists():print(f"错误: 文件夹不存在 - {root_folder}")returnprocessed_count = 0decrypted_count = 0print(f"开始安全遍历文件夹: {root_folder}")print("=" * 50)# 遍历所有文件for file_path in root_path.rglob('*'):if file_path.is_file():processed_count += 1# 检查是否为加密的BMP文件if is_encrypted_bmp(file_path):try:# 创建备份backup_path = file_path.with_suffix(file_path.suffix + backup_suffix)if not backup_path.exists():file_path.rename(backup_path)print(f"已创建备份: {backup_path}")# 从备份文件读取并解密with open(backup_path, 'rb') as f:data = bytearray(f.read())decrypted_data = encoder.decode(data)if decrypted_data is not None:# 写入解密后的文件到原位置with open(file_path, 'wb') as f:f.write(decrypted_data)print(f"✓ 成功解密: {file_path}")decrypted_count += 1else:print(f"  解密失败,恢复原文件: {file_path}")backup_path.rename(file_path)  # 恢复原文件except Exception as e:print(f"✗ 处理文件时出错 {file_path}: {str(e)}")print("=" * 50)print(f"安全处理完成!")print(f"总共检查文件数: {processed_count}")print(f"成功解密文件数: {decrypted_count}")if __name__ == "__main__":# 运行主程序# main()# 或者使用安全版本safe_traverse_and_decrypt("E:/HDW2/hdw-2022-64/Client64/bin/texture2")# 或者批量处理# batch_process_folders(["./folder1", "./folder2", "./folder3"])

运行这段代码后,会将指定文件夹下的所有bmp文件解密,就可以用ps等编辑更换了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96819.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96819.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96819.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《链式二叉树常用操作全解析》

目录 一.求链式二叉树节点个数 二.求链式二叉树叶子节点个数 三.求链式二叉树第k层节点个数 四.求链式二叉树的深度/高度 五.链式二叉树查找值为x的节点 六.链式二叉树的销毁 七. 测试函数 八. 总结: 前言: 在学习链式二叉树的常用操作之前 我们需要手动创建一个二叉树 在…

YOLO11目标检测运行推理简约GUI界面

YOLO11推理简约GUI界面使用方法&#xff1a;支持pt和onnx格式模型,并且自动检测设备&#xff0c;选择推理设备选择推理图片所在的文件夹 选择推理后的结果保存地址选择所需要的置信度阈值点击开始推理&#xff0c;程序自动运行 并在下方实时显示推理进度非常方便不用每次都改代…

集值优化问题:理论、应用与前沿进展

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. &#x1f4da; 集值优化问题概述 集值优化问题主要研究目标函数为…

提示工程架构师分享:如何用提示词升级职业教育的实操案例教学?(万字长文来袭,高能预警!!!)

引言&#xff1a;实操案例教学的“困境”&#xff0c;终于有了破局思路&#xff1f; 晚上10点&#xff0c;汽修专业的王强老师还在电脑前修改《汽车发动机异响故障排查案例》——这已经是他本周第四次调整方案了&#xff1a; 第一次授课时&#xff0c;学生反馈“案例太理想化&a…

「日拱一码」087 机器学习——SPARROW

目录 SPARROW 介绍 核心思想&#xff1a;稀疏掩码训练 与 Lottery Ticket Hypothesis (LTH) 的关系 代码示例 代码关键点解释&#xff1a; 在机器学习领域&#xff0c;"SPARROW" 并不是一个像 Scikit-learn、TensorFlow 或 PyTorch 那样广为人知的通用框架或算法…

18、决策树与集成学习 - 从单一智慧到群体决策

学习目标:理解决策树的构建原理和分裂标准,掌握信息增益、基尼系数等概念,学会决策树的剪枝方法,深入理解集成学习的思想,掌握随机森林和梯度提升的基本原理。 > 从第17章到第18章:从概率模型到规则模型 在第17章中,我们学习了逻辑回归——一个基于概率的线性分类器…

王道计算机组成原理 学习笔记

第一章计算机系统概述1.1计算机的发展历程1.2计算机系统层次结构1.2.11.2.2 计算机硬件的基本组成1.2.2 各个硬件的工作原理1.2.3 计算机软件1.2.4 计算机系统的层次结1.2.5 计算机系统的工作原理1.3计算机的性能指标第二章数据的表示和运算第三章存储系统第四章指令系统第五章…

Oracle 笔记1 表空间及用户

Oracle 笔记1 表空间及用户1 安装Oracle2 创建表空间3 创建表空间用户1. 核心管理用户2. 示例与工具用户3. 系统与服务用户4. 创建表空间用户5. 修改表空间用户特性OracleMySQL开发商Oracle 公司最初由 MySQL AB 开发&#xff0c;后被 Sun 收购&#xff0c;现属 Oracle 公司数据…

MyBatis主键返回机制解析

关于 MyBatis 主键返回的深入解释 核心问题&#xff1a;信息隔离 数据库和应用程序是两个独立的系统&#xff1a; 数据库在服务器上执行 INSERT 操作并生成主键应用程序在另一个进程或甚至另一台机器上运行如果没有明确的机制&#xff0c;应用程序无法自动知道数据库生成了什么…

【Python】Python内置函数大全解析(附源码)

目录专栏导读前言&#x1f680; 功能特性1. 全面的函数覆盖2. 多种查询工具3. 完整的测试验证&#x1f6e0;️ 使用方法基本使用交互式查询运行测试&#x1f4da; 支持的内置函数分类数学运算 (13个)类型转换 (8个)序列操作 (8个)迭代器 (6个)输入输出 (3个)对象操作 (31个)&am…

每日算法题推送

题目1&#xff1a;快乐数 我们先来结合实例看一下判断快乐数的整个过程&#xff1a; 结合题目可以知道&#xff0c;如果一个数是快乐数&#xff0c;那么这个数最终就会变成1&#xff0c;如果一个数不是快乐数&#xff0c;那么变化序列最终就会陷入循环。想一下&#xff0c;如果…

Oracle体系结构-数据文件(Data Files)

一、 数据文件的本质与原理 物理存储的基石&#xff1a; 数据文件是 Oracle 数据库在操作系统层面最核心、最基础的物理存储单元。它们是存储在服务器硬盘&#xff08;或存储阵列&#xff09;上的操作系统文件&#xff08;如 .dbf, .ora 扩展名常见&#xff0c;但非强制&#x…

【C++练习】18.C++求两个整数的最小公倍数(LCM)

目录C求两个整数的最小公倍数(LCM)的方法方法一&#xff1a;利用最大公约数(GCD)计算代码实现方法二&#xff1a;逐次增加法代码实现方法三&#xff1a;质因数分解法代码实现方法比较处理大数和特殊情况改进版GCD方法实现 C求两个整数的最小公倍数(LCM)的方法 最小公倍数(LCM)是…

Linux网络:应用层协议http

前言 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的。但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用.HTTP(超文本传输协议)就是其中之一。 我们之前已经学了UDP与TCP套接字的简单使用&#xff0c;以及讲解了进程间的各种关系&a…

ffmpeg推流测试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、操作步骤1.测试12.测试2总结前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 环境信息&#xff1a; 摄像头&#xff1a;usb摄像头 &a…

Docker的使用及核心命令

文章目录Docker基础概念镜像管理命令镜像查看和搜索镜像下载和删除镜像构建容器生命周期管理创建和启动容器容器控制命令容器清理容器交互和调试进入容器文件操作日志和监控数据管理数据卷&#xff08;Volume&#xff09;绑定挂载网络管理网络基础操作端口映射Dockerfile和Dock…

考研408计算机网络第36题真题解析(2021-2023)

&#xff08;2023.36&#xff09;在使用 CSMA/CD 协议的环境中&#xff0c;使用截断二进制指数退避算法&#xff0c;来选择重传时机&#xff0c;算法 有如下规定&#xff1a; &#xff08;1&#xff09;基本的退避时间为争用期 2τ&#xff0c;假设某网络具体的争用期为 51.2us…

Asio C++ Library是用来做什么的

hriskohlhoff/asio 是由 Chris Kohlhoff 主导维护的开源 C 库&#xff0c;专注于提供高效、跨平台的异步 I/O 支持&#xff0c;广泛应用于网络编程、并发控制和高性能系统开发。 &#x1f4d8; 项目概述 项目名称&#xff1a;Asio C Library 下载地址&#xff1a;https://down…

ac791的按键ad_channel

每次ad_channel这个参数都要给我一定的迷惑性&#xff0c;让我以为这是通道的数量

机器人巡检与巡逻的区别进行详细讲解和对比

机器人巡检与巡逻的区别进行详细讲解和对比 尽管这两个词经常被混用&#xff0c;但在技术和应用层面上&#xff0c;它们有着本质的区别。核心区别在于&#xff1a;巡检是“深度体检”&#xff0c;而巡逻是“治安巡查”。 以下将从多个维度进行详细讲解和对比。 一、核心概念与目…