From 6de77922a551a5db59eb0399c7d961629dc62cd4 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Thu, 27 Aug 2026 16:07:58 +0200 Subject: [PATCH] downloads: validate x86 PE DLLs before install --- remote_packages.py | 72 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/remote_packages.py b/remote_packages.py index 7d52345..4aef108 100644 --- a/remote_packages.py +++ b/remote_packages.py @@ -3,6 +3,7 @@ import json import os import shutil import stat +import struct import tempfile import urllib.error import urllib.request @@ -123,6 +124,68 @@ def _download_asset(asset, progress=None, label=None): raise RemotePackageError(f"Download failed for {asset.get('name', '?')}: {exc}") from exc +def _verify_x86_pe(path, label="downloaded DLL", min_size=1024): + """Validate a 32-bit x86 PE binary before it can reach the WoW folder.""" + try: + size = os.path.getsize(path) + if size < min_size: + raise RemotePackageError( + f"{label} is unexpectedly small ({size} bytes)." + ) + + with open(path, "rb") as handle: + dos = handle.read(64) + if len(dos) < 64 or dos[:2] != b"MZ": + raise RemotePackageError( + f"{label} is not a valid Windows PE binary (missing MZ header)." + ) + + pe_offset = struct.unpack_from(" size - 26: + raise RemotePackageError( + f"{label} has an invalid PE header offset." + ) + + handle.seek(pe_offset) + if handle.read(4) != b"PE\0\0": + raise RemotePackageError( + f"{label} is not a valid Windows PE binary (missing PE signature)." + ) + + coff = handle.read(20) + if len(coff) != 20: + raise RemotePackageError( + f"{label} has a truncated COFF header." + ) + + machine = struct.unpack_from("