#!/usr/bin/env python3 """Extract one fileset entry (kext) from a kernelcache into a standalone Mach-O. Usage: python3 extract_kext.py """ import json import os import struct import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import ipswlib LC_SEGMENT_64 = 0x19 def extract(data, off, out): m = ipswlib.MachO(data, off) end = 32 + m.sizeofcmds for s in m.segments: base = s["fileoff"] if s["fileoff"] >= off else off + s["fileoff"] end = max(end, base + s["filesize"]) blob = bytearray(data[off:end]) o = 32 for _ in range(m.ncmds): cmd, cmdsize = struct.unpack_from("= off: struct.pack_into("= off: struct.pack_into("= off: struct.pack_into("= off: struct.pack_into("= off: struct.pack_into("= off: struct.pack_into("