type: 修复虎牙信封解析偏移类型
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
解析与改写 WUP 信封中的 cert、uid、session 等字段。
|
解析与改写 WUP 信封中的 cert、uid、session 等字段。
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import base64
|
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
|
dt = d[p] & 0x0F
|
||||||
if dt == ZERO:
|
if dt == ZERO:
|
||||||
return 0, p + 1
|
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}")
|
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:
|
if dt == ZERO:
|
||||||
return p
|
return p
|
||||||
if dt == INT8:
|
if dt == INT8:
|
||||||
@@ -122,7 +123,11 @@ class Envelope:
|
|||||||
if p.exists():
|
if p.exists():
|
||||||
return cls._load_from_path(p)
|
return cls._load_from_path(p)
|
||||||
# 尝试查找 evidence/cert_keycap.json
|
# 尝试查找 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():
|
if candidate.exists():
|
||||||
try:
|
try:
|
||||||
return cls._load_from_path(candidate)
|
return cls._load_from_path(candidate)
|
||||||
@@ -134,7 +139,9 @@ class Envelope:
|
|||||||
def _load_from_path(cls, p: Path) -> "Envelope":
|
def _load_from_path(cls, p: Path) -> "Envelope":
|
||||||
if p.suffix == ".json":
|
if p.suffix == ".json":
|
||||||
j = json.loads(p.read_text("utf-8"))
|
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(base64.b64decode(q))
|
||||||
return cls(p.read_bytes())
|
return cls(p.read_bytes())
|
||||||
|
|
||||||
@@ -169,7 +176,7 @@ class Envelope:
|
|||||||
p += 1
|
p += 1
|
||||||
kln = d[p]
|
kln = d[p]
|
||||||
p += 1
|
p += 1
|
||||||
k = bytes(d[p:p + kln])
|
k = bytes(d[p : p + kln])
|
||||||
p += kln
|
p += kln
|
||||||
vh = d[p]
|
vh = d[p]
|
||||||
p += 1
|
p += 1
|
||||||
@@ -226,23 +233,27 @@ class Envelope:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def uid(self) -> int:
|
def uid(self) -> int:
|
||||||
|
assert self.uid_off is not None
|
||||||
return struct.unpack_from(">Q", self.raw, self.uid_off)[0]
|
return struct.unpack_from(">Q", self.raw, self.uid_off)[0]
|
||||||
|
|
||||||
def patch_uid(self, uid: int) -> "Envelope":
|
def patch_uid(self, uid: int) -> "Envelope":
|
||||||
|
assert self.uid_off is not None
|
||||||
struct.pack_into(">Q", self.raw, self.uid_off, uid)
|
struct.pack_into(">Q", self.raw, self.uid_off, uid)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cert_b64(self) -> bytes:
|
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":
|
def patch_cert(self, cert: bytes) -> "Envelope":
|
||||||
|
assert self.cert_off is not None
|
||||||
b64 = base64.b64encode(cert)
|
b64 = base64.b64encode(cert)
|
||||||
if len(b64) != self.cert_len:
|
if len(b64) != self.cert_len:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"证书b64长度不符: {len(b64)} != 模板 {self.cert_len} (cert {len(cert)}B)"
|
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
|
return self
|
||||||
|
|
||||||
def patch_session(self, session: int) -> "Envelope":
|
def patch_session(self, session: int) -> "Envelope":
|
||||||
|
|||||||
Reference in New Issue
Block a user