高达盗版2d游戏 求解密思路

回 whomepack佬
不好意思,是我没搞清楚,上面解密是解json和atlas文件的 剩下差解密PKM文件

pkm解密是另一个帖子,这里的脚本是解的atlas和JSON,对话很清楚啊:anxious_face_with_sweat:

佬哥,能不能指路一下是哪篇贴子教解密这个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

1 个赞

非常感谢大佬的热心指点,已经成功解密,并且使用 GitHub - zhukunqian/pkm2png: convert pkm image to png 转成了png
D9D1931275627F8CB397A57D53273F8C

使用海底撈月法撈取遊戲資源

大部分的遊戲資源都在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文件

spine文件觀看

spine版本 : 3.8.99
這遊戲也算大亂鬥了
機戰裡面有孫悟空和海賊王

生成懶人包 : )

遊戲資源AB包與抽出資源懶人包載點詳情

遊戲資源AB包與抽出資源懶人包
com.gzqycs01.zhiqugame_20251202.rar (14.3GB) (RAR密碼 : 1234)

Google Drive載點

Mega.nz載點

百度盤載點
com.gzqycs01.zhiqugame_20251202.rar

2 个赞