The Architecture class in Binary Ninja represents CPU architectures and instruction sets. It handles instruction disassembly, lifting to IL, register information, calling conventions, and architecture-specific semantics.
Binary Ninja supports multiple architectures out of the box, and you can create custom architecture plugins to add support for new instruction sets.
from binaryninja import Architecture# Get all registered architecturesfor arch_name in Architecture: arch = Architecture[arch_name] print(f"{arch.name}: {arch.full_name}")
from binaryninja import Architecture# Get specific architecturearch = Architecture['x86_64']arch = Architecture['aarch64']arch = Architecture['mips32']
# Get instruction alignmentalignment = arch.instr_alignmentprint(f"Instructions must be aligned to {alignment} bytes")# Some architectures have opcode display lengthopcode_len = arch.opcode_display_lengthprint(f"Opcode display length: {opcode_len}")
# Get all registersfor reg_name, reg_info in arch.regs.items(): print(f"{reg_name}: {reg_info.size} bytes") print(f" Full width: {reg_info.full_width_reg}") print(f" Offset: {reg_info.offset}")# Get specific registerrax_info = arch.regs['rax'] # x86_64print(f"RAX size: {rax_info.size} bytes")
# Get all flagsfor flag_name in arch.flags: flag_index = arch.get_flag_index(flag_name) print(f"Flag: {flag_name} (index {flag_index})")# Flag write types (groups of flags written together)for write_type in arch.flag_write_types: print(f"Flag write type: {write_type}")# Semantic flag classes (e.g., "zero", "negative", "carry")for class_name in arch.semantic_flag_classes: print(f"Semantic flag class: {class_name}")# Semantic flag groupsfor group_name in arch.semantic_flag_groups: print(f"Semantic flag group: {group_name}")
from binaryninja import InstructionInfo# Get instruction at addressinfo = arch.get_instruction_info(data, addr)if info: print(f"Length: {info.length}") print(f"Branches: {len(info.branches)}") for branch in info.branches: print(f" Branch to: 0x{branch.target:x}, type: {branch.type}")# Get instruction texttext_tokens, length = arch.get_instruction_text(data, addr)for token in text_tokens: print(token, end="")print()
# Get IL for instructionfrom binaryninja import LowLevelILFunction# This is typically done within the architecture plugin# or when analyzing functionsfunc = bv.get_function_at(addr)llil = func.low_level_ilfor instr in llil: print(instr)
# Get all calling conventions for this architecturefor cc_name, cc in arch.calling_conventions.items(): print(f"Calling convention: {cc_name}") print(f" Int args: {cc.int_arg_regs}") print(f" Return: {cc.int_return_reg}") print(f" Callee saved: {cc.callee_saved_regs}")# Get default calling conventiondefault_cc = arch.default_calling_conventionprint(f"Default: {default_cc.name}")
# Get all intrinsicsfor intrinsic_name, intrinsic_info in arch.intrinsics.items(): print(f"Intrinsic: {intrinsic_name}") print(f" Inputs: {intrinsic_info.inputs}") print(f" Outputs: {intrinsic_info.outputs}")# Get intrinsic by nameintrinsic = arch.get_intrinsic_name(intrinsic_index)