回 whomepack佬
不好意思,是我没搞清楚,上面解密是解json和atlas文件的 剩下差解密PKM文件
pkm解密是另一个帖子,这里的脚本是解的atlas和JSON,对话很清楚啊![]()
佬哥,能不能指路一下是哪篇贴子教解密这个pkm文件的,试了几篇代码都不行,好像需要密钥
#!/usr/bin/env python3
import struct
import sys
import xxtea
from pathlib import Path
import os
KEY = bytes(
[
0xAB,
0xCD,
0xEF,
0x09,
0x08,
0x07,
0x06,
0x05,
0x04,
0x03,
0x02,
0x01,
0xCC,
0xDD,
0xBB,
0xAA,
]
)
def try_dec(d: bytes) -> bytes | None:
# Basic length sanity
if len(d) < 10 + 9:
return None
# Sum of first 8 bytes must be 1024
if sum(d[:8]) != 1024:
return None
# Read big-endian 16-bit length
dl = struct.unpack(">H", d[8:10])[0]
do = 10 + dl
# Check bounds
if do + 9 > len(d):
return None
# Magic trailer string
if d[do : do + 9] != b"1@#234ffd":
return None
enc = d[do + 9 :]
# Decrypt with XXTEA
dec = xxtea.decrypt(enc, KEY, padding=False)
if len(dec) < 8:
return None
# Last 4 bytes = little-endian length
lm = struct.unpack("<I", dec[-4:])[0]
tl = len(dec)
# Sanity check on length
if not ((tl - 7) <= lm <= (tl - 4)):
return None
return dec[:lm]
def process_file(path: Path):
with path.open("rb") as f:
data = f.read()
out = try_dec(data)
if out is None:
print(f"[skip] {path} (does not match encrypted format)")
return
# Write to a temporary file first, then atomically replace original
tmp_path = path.with_suffix(path.suffix + ".tmpdec")
with tmp_path.open("wb") as f:
f.write(out)
# Replace original with decrypted content
os.replace(tmp_path, path)
print(f"[ok] decrypted in place: {path}")
def main():
if len(sys.argv) < 2:
print("Usage: python ContofLight_Json_Atlas.py <file-or-folder>")
sys.exit(1)
target = Path(sys.argv[1])
if target.is_file():
process_file(target)
return
if not target.is_dir():
print(f"Not found: {target}")
sys.exit(1)
# Recursive over folder
for p in target.rglob("*"):
if not p.is_file():
continue
if p.suffix.lower() not in {".atlas", ".json"}:
continue
process_file(p)
if __name__ == "__main__":
main()
That will batch process all the .json and .atlas files and write decrypted files in place.
from pathlib import Path
from numpy import frombuffer as npfb, uint8
def batch(datPath: str = '', ext: str = '*.pkm', subfolder: bool = False):
path = Path(datPath) if datPath else Path.cwd()
need = [i for i in (path.rglob(ext) if subfolder else path.glob(ext)) if i.is_file()]
for i in need:
with open(i, 'rb') as f:
darr = npfb(bytearray(f.read()), dtype=uint8)
if len(darr) <= 2: continue
key = darr[0]
darr = darr[1:]
mask = (darr != 0) & (darr != key)
darr[mask] ^= key
with open(i, 'wb') as w:
w.write(darr.tobytes())
if __name__ == '__main__':
path = r'' # 游戏文件所在的路径
ext = '*.pkm' # 要解密的文件后缀
subfolder = False # 是否查找字文件夹内的文件
batch(path, ext, subfolder)
Credit d-miracle on June 3rd
非常感谢大佬的热心指点,已经成功解密,并且使用 GitHub - zhukunqian/pkm2png: convert pkm image to png 转成了png

使用海底撈月法撈取遊戲資源
大部分的遊戲資源都在APK內
實際上海底撈月法撈到的遊戲資料不多
整合遊戲資源 , 合併目錄
\res
\src
10570 files (4.55GB)
解密遊戲資源(pkm圖檔除外)
修改自 yjzyl9008 大的python腳本 (不只解密 *.atlas *.json文件)
改成遞迴瀏覽子目錄下所有 *.atlas *.json文件 *.txt *.plist文件 *.csv文件 *.csb文件 *.fui文件
這幾種類型文件都被加密需要解密
唯獨 *.csv文件需要先檢查是否為正確的csv格式
若不是正確的csv格式表示被加密才需要後續解密
若是正確的csv格式跳過不處理
唯獨 *.txt需要先檢查是否為binary格式
若是binary格式才需要解密
若不是binary格式跳過不處理
原解密腳本不變
解密後覆蓋原檔
將 decrypt.bat 與 decrypt.py 放在根目錄
運行decrypt.bat
自動運行decrypt.py
自動開始遞迴瀏覽子目錄解密特定後綴文件
解密後自動覆蓋原檔
pkm圖檔解密
修改自 d-miracle 大python腳本
遞迴瀏覽子目錄下所有 *.pkm文件
不用指定輸入目錄
解密腳本不變
解密後覆蓋原檔
將 decrypt_pkm.bat 與 decrypt_pkm.py 放在根目錄
運行decrypt_pkm.bat
自動運行decrypt_pkm.py
自動開始遞迴瀏覽子目錄解密pkm圖檔
解密後自動覆蓋原檔
分析pkm2png.bat
分析pkm2png.bat
@echo off
@echo welcome
@echo my github : zhukunqian (zhukunqian) · GitHub
@echo use: execute this bat file in pkm folder
for /r %%x in (*.pkm) do (
@echo “convert to png %%x”
Rem etc1tool.exe %%x --decode -o %%x.png
etcpack %%x export -ext PNG
)
pause
分析
@echo 後面為顯示文字 (可以拿掉)
Rem 後面為註解 , 表示etc1tool.exe實際上並未使用
實際使用程序 etcpack
for /r %%x in (*.pkm) 遞迴瀏覽所有子目錄下 *.pkm 文件
並記錄當前的目錄名和pkm文件名於變數 %%x (不包含後綴.pkm)
%%x 輸入目錄名輸入文件名 (不包含後綴.pkm)
export 輸出目錄名
-ext PNG 輸出參數 (PNG一定要大寫)
比如讀取到 input\kalinta2.pkm
記錄 input\kalinta2 於 %%x
輸出目錄改成與輸入目錄相同的話
輸出 input\kalinta2.png (kalinta2自動生成 , png後綴自動添加)
簡化pkm2png.bat
for /r %%x in (*.pkm) do (
etcpack %%x export -ext PNG
)
pause
簡化分析
etcpack <input_filename> <output_directory> [Options]
比如
etcpack.exe box_onhook.pkm test -ext PNG (Test OK)
etcpack %%x export -ext PNG (PNG一定要大寫)
etcpack 輸入文件名 輸出目錄名 輸出參數
比如
etcpack.exe pkmFiles\kalinta2.pkm export -ext PNG
etcpack {input folder rname}{input filename} {output folder name} -ext PNG
輸入目錄名 = 輸出目錄名 (表示輸出生成的png圖檔與輸入pkm圖檔放在一起)
比如
etcpack.exe input\kalinta2.pkm input -ext PNG
輸出生成kalinta2.png會與kalinta2.pkm放在同一個目錄下
簡化 (依序化簡)
etcpack {input folder name}{input filename} {input folder name} -ext PNG
etcpack {input folder}{input file} {input folder} -ext PNG
etcpack {path}{file} {path} -ext PNG
{path} : 當前相對路徑 (可含多層子目錄) (需要在etcpack.exe同目錄下)
{file} : 當前文件名 (不包含.pkm後綴)
範例
輸入 test\box_onhook\box_onhook.pkm
etcpack test\box_onhook\box_onhook.pkm test\box_onhook -ext PNG (Test OK)
etcpack \test\box_onhook\box_onhook.pkm test\box_onhook -ext PNG\ (Test Not OK) (不能有斜線)
不使用python腳本的話
原遊戲根目錄需要全部放在 etcpack.exe 所在目錄底下
生成的png圖檔會全部放同一個目錄下(還需要手動放回原來的目錄)
python腳本後續思路
目的 : 希望生成的png圖檔會和原始pkm圖檔放在一起
環境變數設定 - etcpack
要讓讓CMD命令有效呼叫程序etcpack.exe
Windows 需要先設定 PATH (環境變數)
將程序目錄放到C:
etcpack.exe 路徑
C:\pkm2png
01.本機
02.滑鼠右鍵
03.點選進階系統設定
04.跳出系統內容窗口
04.點選中間上方進階
05.點選右下角環境變數(N)
06.跳出環境變數窗口
07.選擇上方使用者變數(U)
08.點選PATH
09.編輯(E)
10.跳出編輯環境邊數窗口
11.新增(N)
12.新增PATH C:\pkm2png
13.編輯環境變數窗口按下確定
14.環境變數窗口按下確定
15.系統內容窗口按下確定
16.完成PATH設定
這樣python腳本就可以呼叫etcpack
pkm2png - python腳本思路
已知
etcpack {path}{file} {path} -ext PNG
{path} : 當前相對路徑 (可含多層子目錄) (需要在etcpack.exe同目錄下)
{file} : 當前文件名 (不包含.pkm後綴)
目的 : 希望生成的png圖檔會和原始pkm圖檔放在一起
python腳本
遞迴瀏覽所有子目錄下所有 *.pkm文件
記錄當前pkm文件相對路徑 , 存於變數 {path}
記錄當前pkm文件名(不包含副檔名.pkm) , 存於變數 {file}
比如 python腳本在根目錄 \root
pkm文件在 \root\1\2\3\test.pkm
記錄相對路徑 1\2\3 存於變數 {path} (不記錄root後面) (不記錄3後面)
記錄pkm文件名 test 存於變數 {file} (不包含副檔名.pkm)
使用python腳本呼叫etcpack
etcpack {path}{file} {path} -ext PNG
比如
etcpack 1\2\3\test.pkm 1\2\3\ -ext PNG
逐一瀏覽各子目錄
批次轉換
pkm2png - python腳本
將 pkm2png.bat 與 pkm2png.py 放到遊戲根目錄
運行pkm2png.bat
自動運行 pkm2png.py
自動呼叫etcpack
自動將各子目錄下pkm圖檔轉檔成png圖檔
自動在各子目錄下原目錄生成png圖檔
根目錄下會生成動態暫存文件 alphaout.pgm 與 tmp.ppm
轉檔時間會比較久
spine圖檔修改尺寸
將 png_resize.bat 與 png_resize.py 放到遊戲根目錄
運行png_resize.bat
自動運行 png_resize.py
自動修改spine圖檔修改尺寸 (根據.atlas文件描述)
只有幾張圖需要修改尺寸
抽出BANK音頻文件
使用epic7_debank_v1_0.zip
抽出BANK音頻文件
epic7_debank_v1_0.zip 解壓縮
將 \res\sound 目錄裡的bank文件放入 \epic7_debank_v1_0\input
運行epic7_debank.bat
自動運行epic7_debank.py
自動生成目錄result
自動生成抽出音頻wav文件
遊戲資源AB包與抽出資源懶人包載點詳情
遊戲資源AB包與抽出資源懶人包
com.gzqycs01.zhiqugame_20251202.rar (14.3GB) (RAR密碼 : 1234)
Google Drive載點
Mega.nz載點
百度盤載點
com.gzqycs01.zhiqugame_20251202.rar













