In 3.0, access structure members directly on the Type object
# Before (2.x)members = bv.types['MyStruct'].structure.members# After (3.0)members = bv.types['MyStruct'].membersfor member in members: print(f"{member.name}: {member.type} @ offset {member.offset}")
# Get structure typestruct_type = bv.types['MyStruct']# Access membersfor member in struct_type.members: print(f"{member.name}: {member.type} @ +{member.offset:#x}")# Get member by namemember = struct_type.member_by_name("field1")# Get member at offsetmember = struct_type.member_at_offset(4)# Add structure memberstruct_builder = StructureBuilder.create(struct_type)struct_builder.insert(8, Type.int(4), "new_field")bv.define_user_type("MyStruct", struct_builder.immutable_copy())
# Create named type referencetype_ref = Type.named_type_from_type( "MyStruct", bv.types['MyStruct'])# Or create reference directlytype_ref = Type.named_type(NamedTypeReferenceClass.StructNamedTypeClass, "MyStruct")# Use in other typesstruct_ptr = Type.pointer(bv.arch, type_ref)
# Parse type stringresult = bv.parse_type_string("struct MyStruct { int x; char* name; }")if result: type_obj, name = result bv.define_user_type(name, type_obj)# Parse function signatureresult = bv.parse_type_string("int add(int a, int b)")if result: func_type, func_name = result func = bv.get_function_at(0x401000) func.type = func_type# Parse with headersheader = """typedef struct { int x; int y;} Point;"""result = bv.parse_types_from_string(header)for name, type_obj in result.types.items(): bv.define_user_type(name, type_obj)
from binaryninja.types import QualifiedName# Create qualified namename = QualifiedName(["std", "vector", "iterator"])print(str(name)) # "std::vector::iterator"# Use with typesbv.define_user_type(name, struct_type)# Get type by qualified nametype_obj = bv.types[name]
# BinaryView is a type containerfor name, type_obj in bv.types.items(): print(f"{name}: {type_obj}")# Define typesbv.define_user_type("MyStruct", struct_type)# Get typemy_type = bv.types['MyStruct']# Remove typebv.undefine_user_type('MyStruct')
# Load type librarytype_lib = bv.platform.get_type_libraries_by_name("libc")[0]# Import specific typeif 'FILE' in type_lib.named_types: file_type = type_lib.named_types['FILE'] bv.import_library_type('FILE')# Import all types from libraryfor name in type_lib.named_types: bv.import_library_type(name)
# Get string representationtype_str = str(type_obj)# Get tokens for UI displaytokens = type_obj.get_tokens()for token in tokens: print(token.text, end="")# Get type before namebefore = type_obj.get_string_before_name()after = type_obj.get_string_after_name()print(f"{before} my_var{after};") # "int* my_var;"
def create_struct_from_accesses(func, base_reg): """Infer structure from memory accesses.""" from binaryninja import StructureBuilder # Track offsets accessed accesses = {} # offset -> size for block in func.llil: for instr in block: # Look for memory accesses with base register if hasattr(instr, 'src') and hasattr(instr.src, 'operands'): # Simplified - real implementation more complex pass # Build structure struct_builder = StructureBuilder.create() for offset in sorted(accesses.keys()): size = accesses[offset] field_type = Type.int(size) struct_builder.insert(offset, field_type, f"field_{offset:x}") return struct_builder.immutable_copy()
import jsondef apply_types_from_json(bv, json_path): """Apply type information from JSON file.""" with open(json_path) as f: type_info = json.load(f) # Define structures for name, members in type_info.get('structures', {}).items(): struct_builder = StructureBuilder.create() for member in members: # Parse member type result = bv.parse_type_string(member['type']) if result: member_type, _ = result struct_builder.append( member_type, member['name'] ) bv.define_user_type(name, struct_builder.immutable_copy()) # Apply function types for addr_str, sig in type_info.get('functions', {}).items(): addr = int(addr_str, 16) result = bv.parse_type_string(sig) if result: func_type, _ = result func = bv.get_function_at(addr) if func: func.type = func_type