海盜王客戶端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://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;而巡邏是“治安巡查”。 以下將從多個維度進行詳細講解和對比。 一、核心概念與目…