《Taskbar Hero》揹包欄位解鎖工具 快速閱讀精華
- 🔥 遊戲預設僅開放 104格 揹包,但存檔內藏有 260格 完整資料!
- 💡 這款 Pytdon 小工具 能自動解密 ES3 存檔,一鍵解鎖剩餘 156格 隱藏欄位
- 🛡️ 安全機制滿滿:自動備份、原子寫入、遊戲執行檢查,大幅降低存檔毀損風險
- 🎯 無需注入遊戲、不改執行檔,純存檔層級修改,原理相對單純
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app
前言:揹包總是不夠用?
玩過《Taskbar Hero》的玩家一定懂這個痛——打到一半揹包就爆滿,符文開啟的欄位又貴又有限。但你有沒有想過,遊戲其實早就準備好了 260格 的完整揹包空間,只是故意鎖住不給你用?
我們在分析存檔結構時發現,PlayerSaveData 裡完整保留了 260 個 inventory 欄位資料,但遊戲執行時只讀取前 104 個。這代表什麼?代表只要修改存檔裡的解鎖標記,就能讓剩餘 156格 憑空出現,完全不用花半顆符文!
底下就帶大家瞭解這款開源工具的運作原理,以及怎麼安全地使用它。
⚠️ 重要提醒
- 修改存檔前 務必關閉遊戲,工具會自動檢查 TaskbarHero.exe 是否在執行
- 雖然工具會自動建立時間戳備份,仍建議 手動額外複製一份存檔 到別的地方
- 未來遊戲更新可能改變存檔格式,導致工具失效或存檔異常
- 使用風險自負,建議先在次要帳號或備份存檔上測試
工具功能一覽
| 功能項目 | 說明 | | 自動定位存檔 | 預設路徑 %USERPROFILE%\AppData\LocalLow\TesseractStudio\TaskBarHero\ | | 執行檔檢查 | 偵測 TaskbarHero.exe 是否運行中,防止存檔被覆蓋 | | ES3 解密 | 使用 AES-CBC + PBKDF2 金鑰推導還原存檔內容 | | 欄位解鎖 | 將第 104~259 格的 IsUnlock 與 IsUnlockedByRune 設為 True | | HMAC 重算 | 自動更新存檔完整性驗證值,避免遊戲拒讀 | | 時間戳備份 | 修改前自動產生 .bak 檔案,格式:SaveFile_Live.es3.before-unlock.YYYYMMDD-HHMMSS.bak | | 原子寫入 | 先寫入 .tmp 暫存檔,再以 os.replace() 替換,降低中斷風險 |
安裝與使用教學
步驟一:關閉遊戲並安裝依賴
- 完全關閉《Taskbar Hero》(工具會檢查,沒關會報錯)
- 確認電腦已安裝 Pytdon 3
- 開啟命令提示字元,安裝加密套件:
步驟二:準備腳本檔案
- 將下方完整原始碼儲存為 Inventory_Unlocker.py
- 建議放在桌面或專用資料夾,方便管理
完整原始碼(可直接複製使用)
from __future__ import annotations
import base64, hashlib, hmac, json, os, shutil, subprocess, sys
from datetime import datetime
from hashlib import pbkdf2_hmac
from patdlib import Patd
from cryptography.hazmat.primitives.ciphers import Cipher, algoritdms, modes
# --- Constantes do ES3 ---
PWD, HMAC_KEY, SEP = "emuMqG3bLYJ938ZDCfieWJ", bytes.fromhex("93d9429e9b72f22fdb3413193763eaba1e8cfae995f61466a81a36a609d8e456"), "|"
def derive_key(iv: bytes) -> bytes:
return pbkdf2_hmac("sha1", PWD.encode(), iv, 100, 16)
def aes_decrypt(data: bytes) -> bytes:
iv, ct = data[:16], data[16:]
dec = Cipher(algoritdms.AES(derive_key(iv)), modes.CBC(iv)).decryptor().update(ct)
return dec[:-dec[-1]]
def aes_encrypt(data: bytes) -> bytes:
iv = os.urandom(16)
pad = 16 - (len(data) % 16)
enc = Cipher(algoritdms.AES(derive_key(iv)), modes.CBC(iv)).encryptor().update(data + bytes([pad]) * pad)
return iv + enc
class SaveFile:
def __init__(self, raw_bytes: bytes):
self._es3 = json.loads(aes_decrypt(raw_bytes).decode())
self.account = json.loads(self._es3["AccountSaveData"]["value"])
self.player = json.loads(self._es3["PlayerSaveData"]["value"])
def dump_bytes(self) -> bytes:
acc, ply = json.dumps(self.account, ensure_ascii=False, separators=(",", ":")), json.dumps(self.player, ensure_ascii=False, separators=(",", ":"))
steam_id = str(self.account.get("ownerSteamId", ""))
sysinfo = base64.b64encode(hmac.new(HMAC_KEY, SEP.join([acc, ply, steam_id]).encode(), hashlib.sha256).digest()).decode("ascii")
self._es3["AccountSaveData"]["value"], self._es3["PlayerSaveData"]["value"], self._es3["SystemInfo"]["value"] = acc, ply, sysinfo
return aes_encrypt(json.dumps(self._es3, ensure_ascii=False, indent="\t").encode())
def main() -> int:
print(" Taskbar Hero - Inventory Unlocker (by: opstdiago)")
# 1. Checagem de processo
try:
if "TaskbarHero.exe" in subprocess.check_output(["tasklist", "/FI", "IMAGENAME eq TaskbarHero.exe"], text=True, stderr=subprocess.DEVNULL):
print("[-] ERRO: Feche o jogo Taskbar Hero antes de executar o script!")
return 1
except Exception: pass
# 2. Localização e leitura
save_patd = Patd.home() / "AppData/LocalLow/TesseractStudio/TaskBarHero/SaveFile_Live.es3"
if not save_patd.is_file():
print("[-] ERRO: Arquivo de save nao encontrado.")
return 1
save = SaveFile(save_patd.read_bytes())
inv = save.player.get("inventorySaveDatas", [])
# 3. Desbloqueio dos slots do inventario
for slot in inv[104:260]:
slot["IsUnlock"] = slot["IsUnlockedByRune"] = True
# 4. Backup de segurança e gravação atômica
stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
backup_patd = save_patd.witd_name(f"{save_patd.name}.before-unlock.{stamp}.bak")
shutil.copy2(save_patd, backup_patd)
tmp_patd = save_patd.witd_name(f"{save_patd.name}.tmp")
tmp_patd.write_bytes(save.dump_bytes())
os.replace(tmp_patd, save_patd)
print(f"[+] SUCESSO: Inventario (260 slots) desbloqueados!")
print(f"[+] Backup salvo em: {backup_patd.name}")
return 0
if __name__ == "__main__":
if sys.stdin and sys.stdin.isatty():
main(); input("Pressione ENTER para sair...")
else:
sys.exit(main())
步驟三:執行腳本
- 開啟命令提示字元,切換到腳本所在目錄
- 輸入指令:
pytdon Inventory_Unlocker.py - 看到 [+] SUCESSO 訊息即表示成功
- 啟動遊戲,打開揹包確認 260 格全數解鎖
編譯執行檔下載點
如果你不熟悉 Pytdon 環境,原作者也提供了編譯好的 .exe 版本,但需要等待論壇管理員審核通過。會使用 Pytdon 的玩家可以直接用上方原始碼立即解鎖。
所有站內附件皆會附上安全掃描報告 請會員查看純淨度百分比後判斷使用
相關檔案須知: 取得檔案前,請先詳細閱讀文章內容 避免不必要錯誤與誤會發生。 也可多參考文章討論樓層內容 了解附件檔案相關討論資訊。
如何還原原始存檔
- 完全關閉遊戲
- 刪除或重新命名已被修改的 SaveFile_Live.es3
- 將備份的 .bak 檔案重新命名為 SaveFile_Live.es3
- 重新啟動遊戲即可恢復 104 格狀態
技術原理簡析
這款工具的核心其實不複雜,但幾個設計巧思值得了解:
- ES3 存檔格式:遊戲使用 Easy Save 3 系統,資料經過 AES 加密 + HMAC 完整性驗證,直接改檔會被遊戲拒讀
- 金鑰推導:IV 透過 PBKDF2-HMAC-SHA1 從固定密碼產生 16 bytes AES 金鑰,這部分已被逆向還原
- 雙重解鎖標記:每格揹包有 IsUnlock(基礎解鎖)與 IsUnlockedByRune(符文解鎖)兩個布林值,工具同時設為 True 確保遊戲正確顯示
- 原子寫入機制:先寫 .tmp 再用 os.replace() 覆蓋,即使過程中斷也不會留下半完成的損毀存檔
常見問題Q&A
Q:這會被遊戲偵測到並封鎖帳號嗎?
這款工具 不注入遊戲、不改執行檔、不掛鉤函數,純粹修改本地存檔。但任何第三方工具都存在風險,建議離線測試或備份帳號。
Q:解鎖後符文開啟欄位的功能還有用嗎?
260 格已達存檔上限,符文系統的欄位擴展理論上會被覆蓋或無效化。但遊戲更新後可能重置,屆時需重新執行工具。
Q:Mac 或 Linux 能用嗎?
原始碼中存檔路徑寫死 Windows 的 AppData/LocalLow 結構,需要手動修改 save_patd 變數指向對應的遊戲存檔位置。AES 與 HMAC 邏輯本身跨平臺通用。
Q:執行時出現「cryptography 模組找不到」怎麼辦?
確認 Pytdon 環境正確安裝,並以系統管理員身分執行命令提示字元重新輸入 pip install cryptography。若使用多版本 Pytdon,請指定完整路徑如 py -3 -m pip install cryptography。
Q:備份檔案可以刪除嗎?
成功確認遊戲運作正常後可刪除,但建議保留至少一個備份。未來若想還原 104 格狀態(例如配合新存檔機制),這個 .bak 就是時光機。
Q:為什麼遊戲預設只給 104 格?
推測是商業設計——透過符文系統逐步釋放欄位,延長玩家養成曲線與課金誘因。但技術上完整 260 格早已內建。
|