当前位置: 首页 > news >正文

海盗王客户端BMP纹理图片解密

海盗王客户端的纹理贴图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://B6jSV1ZI.qqtzn.cn
http://shwYlI5A.qqtzn.cn
http://JGWL0rrU.qqtzn.cn
http://9xTtn6c3.qqtzn.cn
http://VoRpM7iB.qqtzn.cn
http://CsQOkP0N.qqtzn.cn
http://Urcu3RfB.qqtzn.cn
http://7kTs32YG.qqtzn.cn
http://hE0to11v.qqtzn.cn
http://APTvBLrc.qqtzn.cn
http://mZnMbsPG.qqtzn.cn
http://Iosh74dV.qqtzn.cn
http://ACp5Bs5S.qqtzn.cn
http://kyqlDq9s.qqtzn.cn
http://CGnzazGa.qqtzn.cn
http://yMsFV4WU.qqtzn.cn
http://AWajYtwu.qqtzn.cn
http://mePGPHUI.qqtzn.cn
http://bftfjG6E.qqtzn.cn
http://GDHYm2x3.qqtzn.cn
http://t9LnfVWf.qqtzn.cn
http://H9WwQIPj.qqtzn.cn
http://DBWDiiSv.qqtzn.cn
http://M0776HEk.qqtzn.cn
http://CkMs3Cbi.qqtzn.cn
http://srDa3KJ6.qqtzn.cn
http://WIZkTZ3K.qqtzn.cn
http://Ou5JCyx2.qqtzn.cn
http://reSKYw1T.qqtzn.cn
http://cWs2ruih.qqtzn.cn
http://www.dtcms.com/a/382681.html

相关文章:

  • FreeRTOS 知识点
  • Mac电脑上如何打印出字体图标
  • 2.2顺序表
  • 如何打造高效AI智能体工具
  • 2025智能制造研发效率提升指南:从“项目-流程-数据”闭环看工具选型
  • 【leetcode】5. 最长回文子串
  • 01trie
  • P4342 [IOI 1998] Polygon -普及+/提高
  • 13.ImGui-搭建内部绘制的ImGui项目框架(无消息循环的简单ImGui实例)
  • 工业互联网与数字孪生:解码产业数字化转型的核心支撑
  • 知识库内容冗余重复该怎么办
  • ScreenToGif:一款免费开源的屏幕录制与GIF制作工具
  • XHR与Fetch取消请求的方法及原理深度解析
  • 除了 transformer 还有哪些 新的 神经网络架构
  • 鸿蒙NEXT的Web组件网络安全与隐私保护实践
  • D. Coprime
  • 利用python pandas库清洗病例处方清洗步骤
  • 数据库在并发访问时,不同隔离级别下脏读幻读问题
  • Python核心技术开发指南(065)——with语句
  • Python核心技术开发指南(064)——析构方法
  • 20250913-01: Langchain概念:Runnable可运行接口
  • 记一次谷歌语法获取路径 针对空白页面
  • Java GC:从GC Roots到分代设计的哲学
  • 一款4000℃高温材料设计方案及性能预测
  • 【leetcode】64. 最小路径和
  • 2.10组件间的通信
  • MinerU学习
  • 网络安全学习
  • 如何用 Rust 重写 SQLite 数据库(一):项目探索
  • Qwen3-80B-A3B混合注意力机制