From 563477fde8d7519d05b75e7293adf4dcaaba32b2 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sun, 30 Aug 2026 20:05:06 +0800 Subject: [PATCH] =?UTF-8?q?type:=20=E4=BF=AE=E5=A4=8D=E8=99=8E=E7=89=99?= =?UTF-8?q?=E4=BF=A1=E5=B0=81=E8=A7=A3=E6=9E=90=E5=81=8F=E7=A7=BB=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/huya/envelope_forge.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/core/huya/envelope_forge.py b/core/huya/envelope_forge.py index f27dad1..e162160 100644 --- a/core/huya/envelope_forge.py +++ b/core/huya/envelope_forge.py @@ -2,6 +2,7 @@ 解析与改写 WUP 信封中的 cert、uid、session 等字段。 """ + from __future__ import annotations import base64 @@ -34,7 +35,7 @@ DEFAULT_QURL_B64 = ( ) -def _read_len_int(d: bytes, p: int) -> tuple[int, int]: +def _read_len_int(d: bytes | bytearray, p: int) -> tuple[int, int]: dt = d[p] & 0x0F if dt == ZERO: return 0, p + 1 @@ -47,7 +48,7 @@ def _read_len_int(d: bytes, p: int) -> tuple[int, int]: raise ValueError(f"长度int类型异常 {dt:#x}@{p}") -def _skip_value(d: bytes, p: int, dt: int) -> int: +def _skip_value(d: bytes | bytearray, p: int, dt: int) -> int: if dt == ZERO: return p if dt == INT8: @@ -122,7 +123,11 @@ class Envelope: if p.exists(): return cls._load_from_path(p) # 尝试查找 evidence/cert_keycap.json - candidate = Path(__file__).resolve().parent.parent.parent / "evidence" / "cert_keycap.json" + candidate = ( + Path(__file__).resolve().parent.parent.parent + / "evidence" + / "cert_keycap.json" + ) if candidate.exists(): try: return cls._load_from_path(candidate) @@ -134,7 +139,9 @@ class Envelope: def _load_from_path(cls, p: Path) -> "Envelope": if p.suffix == ".json": j = json.loads(p.read_text("utf-8")) - q = next(e["data"] for e in j if e.get("type") == "qurl_done" and e.get("data")) + q = next( + e["data"] for e in j if e.get("type") == "qurl_done" and e.get("data") + ) return cls(base64.b64decode(q)) return cls(p.read_bytes()) @@ -169,7 +176,7 @@ class Envelope: p += 1 kln = d[p] p += 1 - k = bytes(d[p:p + kln]) + k = bytes(d[p : p + kln]) p += kln vh = d[p] p += 1 @@ -226,23 +233,27 @@ class Envelope: @property def uid(self) -> int: + assert self.uid_off is not None return struct.unpack_from(">Q", self.raw, self.uid_off)[0] def patch_uid(self, uid: int) -> "Envelope": + assert self.uid_off is not None struct.pack_into(">Q", self.raw, self.uid_off, uid) return self @property def cert_b64(self) -> bytes: - return bytes(self.raw[self.cert_off:self.cert_off + self.cert_len]) + assert self.cert_off is not None + return bytes(self.raw[self.cert_off : self.cert_off + self.cert_len]) def patch_cert(self, cert: bytes) -> "Envelope": + assert self.cert_off is not None b64 = base64.b64encode(cert) if len(b64) != self.cert_len: raise ValueError( f"证书b64长度不符: {len(b64)} != 模板 {self.cert_len} (cert {len(cert)}B)" ) - self.raw[self.cert_off:self.cert_off + self.cert_len] = b64 + self.raw[self.cert_off : self.cert_off + self.cert_len] = b64 return self def patch_session(self, session: int) -> "Envelope":