#!/usr/bin/env python3 """ elf2opc - OpenCore Binary Converter Converts standard 64-bit ELF executables into native .opc (OpenCore Binary) format. """ import sys import struct import os OPC_MAGIC = 0x0143504F # 'O', 'P', 'C', '\x01' OPC_VERSION = 1 OPC_ARCH_X86_64 = 0x8664 PT_LOAD = 1 def convert_elf_to_opc(elf_path, opc_path, preferred_core=0xFF, caps=0xFFFFFFFF): with open(elf_path, "rb") as f: elf_data = f.read() if len(elf_data) < 64: raise ValueError("ELF file too small") if elf_data[0:4] != b"\x7fELF": raise ValueError("Invalid ELF magic") if elf_data[4] != 2: # 64-bit raise ValueError("Not a 64-bit ELF") # Parse ELF64 Header # 0x10: e_type(2), e_machine(2), e_version(4), e_entry(8), e_phoff(8), e_shoff(8) e_type, e_machine, e_version, e_entry, e_phoff, e_shoff = struct.unpack_from(" 0: seg_bytes = elf_data[p_offset : p_offset + p_filesz] load_segments.append({ "flags": p_flags, "vaddr": p_vaddr, "filesz": p_filesz, "memsz": p_memsz, "align": p_align, "data": seg_bytes }) if not load_segments: raise ValueError("No PT_LOAD segments found in ELF") header_fmt = " '{opc_path}'") print(f" Entry RIP: {e_entry:#x}, Segments: {len(load_segments)}, Size: {current_data_offset} bytes") if __name__ == "__main__": if len(sys.argv) < 3: print("Usage: elf2opc [preferred_core] [caps_mask]") sys.exit(1) pref_core = int(sys.argv[3]) if len(sys.argv) > 3 else 0xFF caps_val = int(sys.argv[4], 0) if len(sys.argv) > 4 else 0xFFFFFFFF convert_elf_to_opc(sys.argv[1], sys.argv[2], pref_core, caps_val)