| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- """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")
|