feat: xxbb
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
"""Decrypt/encrypt xxbb details 7zAES wires (show.html / *.js)."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
import py7zr
|
||||
except ImportError as exc: # pragma: no cover
|
||||
raise SystemExit("py7zr required: pip install py7zr") from exc
|
||||
|
||||
SEVEN_ZIP_PASSWORD = "202800cfb1ad3de68e11239dcc26c30b"
|
||||
# Matches original corepayload.js wire size closely (~521913).
|
||||
_7Z_PACK_FILTER = "LZMA2"
|
||||
|
||||
|
||||
def _find_7z() -> str:
|
||||
for name in ("7z", "7za"):
|
||||
path = shutil.which(name)
|
||||
if path:
|
||||
return path
|
||||
raise SystemExit(
|
||||
"7z required to pack xxbb details archives. Install p7zip / 7-Zip."
|
||||
)
|
||||
|
||||
|
||||
def extract_member(archive: bytes, *, password: str = SEVEN_ZIP_PASSWORD) -> tuple[str, bytes]:
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
root = Path(tmp)
|
||||
arc = root / "in.7z"
|
||||
arc.write_bytes(archive)
|
||||
with py7zr.SevenZipFile(arc, mode="r", password=password) as handle:
|
||||
names = handle.getnames()
|
||||
if len(names) != 1:
|
||||
raise SystemExit(f"expected one archive member, got {names!r}")
|
||||
handle.extractall(path=root)
|
||||
member = names[0]
|
||||
data = (root / member).read_bytes()
|
||||
return Path(member).name, data
|
||||
|
||||
|
||||
def make_passworded_7z(
|
||||
member_name: str,
|
||||
payload: bytes,
|
||||
*,
|
||||
password: str = SEVEN_ZIP_PASSWORD,
|
||||
) -> bytes:
|
||||
arc_name = Path(member_name).name
|
||||
seven = _find_7z()
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
archive = Path(tmp) / "out.7z"
|
||||
cmd = [
|
||||
seven,
|
||||
"a",
|
||||
"-t7z",
|
||||
f"-m0={_7Z_PACK_FILTER}",
|
||||
"-mhe=on",
|
||||
f"-p{password}",
|
||||
f"-si{arc_name}",
|
||||
"-y",
|
||||
"-bso0",
|
||||
"-bsp0",
|
||||
str(archive),
|
||||
]
|
||||
proc = subprocess.run(cmd, input=payload, capture_output=True)
|
||||
if proc.returncode != 0 or not archive.is_file():
|
||||
detail = (proc.stderr or proc.stdout or b"").decode("utf-8", "replace").strip()
|
||||
raise RuntimeError(
|
||||
f"7z -si pack failed (code {proc.returncode}): {detail or 'no output'}"
|
||||
)
|
||||
return archive.read_bytes()
|
||||
Reference in New Issue
Block a user