def define_cfstrings_plugin(view: BinaryView): log_debug("define_cfstrings_plugin") from_bytes = _get_from_bytes(view) cfstring_type = view.get_type_by_name('CFString') if cfstring_type is None: cfstring_type = view.platform.parse_types_from_source( _cfstring_definition).types['CFString'] view.define_user_type('CFString', cfstring_type) wchar_type = view.platform.parse_types_from_source( _wchar_definition).types['wchar'] cfstring = Type.named_type_from_type('CFString', cfstring_type) __cfstring = view.get_section_by_name('__cfstring') if __cfstring is None: return buffer = cfstring_type.structure['buffer'] length = cfstring_type.structure['length'] for addr in range(__cfstring.start, __cfstring.end, cfstring_type.width): view.define_user_data_var(addr, cfstring) for xref in view.get_data_refs(addr): view.define_user_data_var(xref, Type.pointer(view.arch, cfstring)) string_pointer = from_bytes( view.read(addr + buffer.offset, buffer.type.width)) string_length = from_bytes( view.read(addr + length.offset, length.type.width), ) + 1 string_section = view.get_sections_at(string_pointer) if not string_section: return if string_section[0].name == '__ustring': char_type = wchar_type else: char_type = Type.char() view.define_user_data_var(string_pointer, Type.array(char_type, string_length))
def _define_protocols(view: BinaryView): __objc_protorefs = view.get_section_by_name('__objc_protorefs') if __objc_protorefs is None: return protocol_t = Type.named_type_from_type('protocol_t', view.get_type_by_name('protocol_t')) for address in range(__objc_protorefs.start, __objc_protorefs.end, view.address_size): view.define_user_data_var(address, Type.pointer(view.arch, protocol_t)) protocol_ptr = int.from_bytes( view.read(address, view.address_size), "little" if view.endianness is Endianness.LittleEndian else "big") new_protocol = Protocol.from_address(protocol_ptr, view)