#!/usr/bin/env python3 """Identify a .NET/managed assembly and surface basic CLR metadata signals. Parses the PE far enough to detect the COM descriptor (CLR) data directory and searches for the ``BSJB`` metadata-root signature. Static parsing only; the sample is never executed. """ from __future__ import annotations import argparse import json import struct import sys from pathlib import Path def identify(path: str) -> dict: data = Path(path).read_bytes() result = {"managed": False, "bsjb_metadata": False, "notes": []} if data[:2] != b"MZ": result["notes"].append("not a PE (no MZ)") return result e_lfanew = struct.unpack_from(" int: parser = argparse.ArgumentParser(description="Identify managed .NET assembly") sub = parser.add_subparsers(dest="cmd", required=True) p = sub.add_parser("identify") p.add_argument("file") args = parser.parse_args(argv) print(json.dumps(identify(args.file), indent=2)) return 0 if __name__ == "__main__": sys.exit(main())