decrypt_lua.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. """Try all XXTEA key/layout variants on the encrypted Lua file."""
  2. import hashlib
  3. import sys
  4. from pathlib import Path
  5. import xxtea
  6. if hasattr(sys.stdout, "reconfigure"):
  7. sys.stdout.reconfigure(encoding="utf-8", errors="replace")
  8. SRC = Path(r"D:\ProgramFiles\996box\GameBoxDownload\1\cq\cache_206923\mod_fgcq\stab\scripts\network\networkUtil.lua")
  9. raw = SRC.read_bytes()
  10. print(f"file: {len(raw)} bytes, sign={raw[:8]!r}")
  11. cands = {
  12. "key_null16": b"34UFXMgtkz".ljust(16, b"\0"),
  13. "key_space16": b"34UFXMgtkz".ljust(16, b" "),
  14. "key_rep16": (b"34UFXMgtkz" * 2)[:16],
  15. "key_sign16": (b"34UFXMgtkz" + b"4meJnPyl")[:16],
  16. "sign16": b"4meJnPyl".ljust(16, b"\0"),
  17. "md5key16": hashlib.md5(b"34UFXMgtkz").digest(),
  18. "md5sign16": hashlib.md5(b"4meJnPyl").digest(),
  19. "sign_key16": (b"4meJnPyl" + b"34UFXMgtkz")[:16],
  20. }
  21. blobs = {
  22. "after_sign": raw[8:],
  23. "whole": raw,
  24. "skip1": raw[9:],
  25. }
  26. def looks_lua(dec: bytes) -> bool:
  27. if not dec:
  28. return False
  29. head = dec[:80].lstrip()
  30. return head.startswith((b"--", b"local", b"function", b"require", b"return"))
  31. for blob_label, blob in blobs.items():
  32. for key_label, key in cands.items():
  33. try:
  34. dec = xxtea.decrypt(blob, key)
  35. except Exception:
  36. continue
  37. if dec and looks_lua(dec):
  38. print(f"\n*** SUCCESS: blob={blob_label} key={key_label} -> {len(dec)} bytes")
  39. print(dec[:600].decode("utf-8", errors="replace"))
  40. out = Path(f"decrypted_{blob_label}_{key_label}.lua")
  41. out.write_bytes(dec)
  42. print(f"\nsaved to {out}")
  43. sys.exit(0)
  44. elif dec:
  45. printable = sum(1 for b in dec[:100] if 32 <= b < 127 or b in (9, 10, 13))
  46. if printable > 80:
  47. print(f"\n~ partial? blob={blob_label} key={key_label} printable={printable}%")
  48. print(dec[:200].decode("latin1"))
  49. print("\nno variant produced valid Lua")