"""Try all XXTEA key/layout variants on the encrypted Lua file.""" import hashlib import sys from pathlib import Path import xxtea if hasattr(sys.stdout, "reconfigure"): sys.stdout.reconfigure(encoding="utf-8", errors="replace") SRC = Path(r"D:\ProgramFiles\996box\GameBoxDownload\1\cq\cache_206923\mod_fgcq\stab\scripts\network\networkUtil.lua") raw = SRC.read_bytes() print(f"file: {len(raw)} bytes, sign={raw[:8]!r}") cands = { "key_null16": b"34UFXMgtkz".ljust(16, b"\0"), "key_space16": b"34UFXMgtkz".ljust(16, b" "), "key_rep16": (b"34UFXMgtkz" * 2)[:16], "key_sign16": (b"34UFXMgtkz" + b"4meJnPyl")[:16], "sign16": b"4meJnPyl".ljust(16, b"\0"), "md5key16": hashlib.md5(b"34UFXMgtkz").digest(), "md5sign16": hashlib.md5(b"4meJnPyl").digest(), "sign_key16": (b"4meJnPyl" + b"34UFXMgtkz")[:16], } blobs = { "after_sign": raw[8:], "whole": raw, "skip1": raw[9:], } def looks_lua(dec: bytes) -> bool: if not dec: return False head = dec[:80].lstrip() return head.startswith((b"--", b"local", b"function", b"require", b"return")) for blob_label, blob in blobs.items(): for key_label, key in cands.items(): try: dec = xxtea.decrypt(blob, key) except Exception: continue if dec and looks_lua(dec): print(f"\n*** SUCCESS: blob={blob_label} key={key_label} -> {len(dec)} bytes") print(dec[:600].decode("utf-8", errors="replace")) out = Path(f"decrypted_{blob_label}_{key_label}.lua") out.write_bytes(dec) print(f"\nsaved to {out}") sys.exit(0) elif dec: printable = sum(1 for b in dec[:100] if 32 <= b < 127 or b in (9, 10, 13)) if printable > 80: print(f"\n~ partial? blob={blob_label} key={key_label} printable={printable}%") print(dec[:200].decode("latin1")) print("\nno variant produced valid Lua")