XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
"""Read-only signed header inventory, including FREE code-resource archives."""
import concurrent.futures
import json
import re
from collections import Counter
from pathlib import Path

root=Path(r'D:/SteamLibrary/steamapps/common/Elite Dangerous/Products/elite-dangerous-odyssey-64/Win64')
key=json.loads(Path('artifacts/ship-model-reference/local-asset-public-key.json').read_text())
n,e=int(key['n']),key['e']
pattern=re.compile(rb'galax|visualisation|visualization|map.?view|map.?colour|map.?color|colou?r.?map',re.I)
def scan(directory):
    counts=Counter();found=[]
    for path in directory.iterdir():
        if not path.is_file():continue
        with path.open('rb') as stream:header=stream.read(262)
        counts[header[:4].decode('ascii','replace')]+=1
        if header[:4] not in (b'FREA',b'FREE') or len(header)<262:continue
        raw=pow(int.from_bytes(header[6:262],'big'),e,n).to_bytes(256,'big')
        separator=raw.find(b'\0',2)
        if separator<10:continue
        metadata=raw[separator+37:]
        if pattern.search(metadata):
            found.append(dict(path=str(path),magic=header[:4].decode(),bytes=path.stat().st_size,
                signedHeader=metadata.hex(),strings=[m.group().decode('ascii') for m in re.finditer(rb'[ -~]{4,}',metadata)]))
    return counts,found
out=Path('artifacts/galaxy-query-research/palette-resources');out.mkdir(exist_ok=True)
counts=Counter();rows=[]
with concurrent.futures.ThreadPoolExecutor(max_workers=6) as pool:
    for observed,found in pool.map(scan,sorted(path for path in root.iterdir() if path.is_dir())):
        counts.update(observed);rows.extend(found)
        print(f'headers={sum(counts.values())} matches={len(rows)}',flush=True)
result=dict(scope='Original local resource signed headers only',magicCounts=dict(counts),resources=rows)
(out/'inventory.json').write_text(json.dumps(result,indent=2),encoding='utf-8')
print(json.dumps(dict(magicCounts=dict(counts),matches=len(rows))))