Source code for tools.headers
"""Tool: get_binary_headers — detailed header fields for a binary."""
from __future__ import annotations
from typing import Any
import lief
from app import mcp
from helpers import hex_addr, safe_enum, format_name, parse_binary, _error
[docs]
@mcp.tool()
def get_binary_headers(file_path: str) -> dict:
"""Detailed header fields for a binary.
PE: DOS header + COFF header + Optional header.
ELF: ELF header.
Mach-O: Mach header.
"""
try:
binary = parse_binary(file_path)
except ValueError as exc:
return _error(str(exc))
result: dict[str, Any] = {"format": format_name().get(binary.format, "Unknown")}
if isinstance(binary, lief.PE.Binary):
dos = binary.dos_header
result["dos_header"] = {
"magic": hex_addr(dos.magic),
"addressof_new_exeheader": hex_addr(dos.addressof_new_exeheader),
"addressof_relocation_table": hex_addr(dos.addressof_relocation_table),
}
hdr = binary.header
result["coff_header"] = {
"machine": safe_enum(hdr.machine),
"numberof_sections": hdr.numberof_sections,
"time_date_stamps": hdr.time_date_stamps,
"sizeof_optional_header": hdr.sizeof_optional_header,
"characteristics": [safe_enum(c) for c in hdr.characteristics_list],
}
opt = binary.optional_header
result["optional_header"] = {
"magic": safe_enum(opt.magic),
"major_linker_version": opt.major_linker_version,
"minor_linker_version": opt.minor_linker_version,
"sizeof_code": hex_addr(opt.sizeof_code),
"sizeof_initialized_data": hex_addr(opt.sizeof_initialized_data),
"sizeof_uninitialized_data": hex_addr(opt.sizeof_uninitialized_data),
"addressof_entrypoint": hex_addr(opt.addressof_entrypoint),
"baseof_code": hex_addr(opt.baseof_code),
"imagebase": hex_addr(opt.imagebase),
"section_alignment": hex_addr(opt.section_alignment),
"file_alignment": hex_addr(opt.file_alignment),
"major_operating_system_version": opt.major_operating_system_version,
"minor_operating_system_version": opt.minor_operating_system_version,
"major_image_version": opt.major_image_version,
"minor_image_version": opt.minor_image_version,
"major_subsystem_version": opt.major_subsystem_version,
"minor_subsystem_version": opt.minor_subsystem_version,
"sizeof_image": hex_addr(opt.sizeof_image),
"sizeof_headers": hex_addr(opt.sizeof_headers),
"checksum": hex_addr(opt.checksum),
"subsystem": safe_enum(opt.subsystem),
"dll_characteristics": [safe_enum(c) for c in opt.dll_characteristics_lists],
"sizeof_stack_reserve": hex_addr(opt.sizeof_stack_reserve),
"sizeof_stack_commit": hex_addr(opt.sizeof_stack_commit),
"sizeof_heap_reserve": hex_addr(opt.sizeof_heap_reserve),
"sizeof_heap_commit": hex_addr(opt.sizeof_heap_commit),
}
elif isinstance(binary, lief.ELF.Binary):
hdr = binary.header
result["elf_header"] = {
"identity_class": safe_enum(hdr.identity_class),
"identity_data": safe_enum(hdr.identity_data),
"identity_os_abi": safe_enum(hdr.identity_os_abi),
"identity_abi_version": hdr.identity_abi_version,
"file_type": safe_enum(hdr.file_type),
"machine_type": safe_enum(hdr.machine_type),
"entrypoint": hex_addr(hdr.entrypoint),
"program_header_offset": hex_addr(hdr.program_header_offset),
"section_header_offset": hex_addr(hdr.section_header_offset),
"processor_flag": hdr.processor_flag,
"header_size": hdr.header_size,
"program_header_size": hdr.program_header_size,
"numberof_segments": hdr.numberof_segments,
"section_header_size": hdr.section_header_size,
"numberof_sections": hdr.numberof_sections,
"section_name_table_idx": hdr.section_name_table_idx,
}
elif isinstance(binary, lief.MachO.Binary):
hdr = binary.header
result["macho_header"] = {
"magic": safe_enum(hdr.magic),
"cpu_type": safe_enum(hdr.cpu_type),
"cpu_subtype": hdr.cpu_subtype,
"file_type": safe_enum(hdr.file_type),
"nb_cmds": hdr.nb_cmds,
"sizeof_cmds": hdr.sizeof_cmds,
"flags": [safe_enum(f) for f in hdr.flags_list],
}
return result