diff options
| author | Xusheng <xusheng@vector35.com> | 2021-05-05 17:23:49 +0800 |
|---|---|---|
| committer | Xusheng <xusheng@vector35.com> | 2021-05-26 17:46:13 +0800 |
| commit | 7c9ada78241e08bf36bd04d989f742a6de721575 (patch) | |
| tree | 4134fd2f12a504ab17cc0b9acc1fb8d27552490f /python/binaryview.py | |
| parent | fd1974b407be042fd84f0267a328a5adabce28e1 (diff) | |
Add the ability to automatically create struct members
Diffstat (limited to 'python/binaryview.py')
| -rw-r--r-- | python/binaryview.py | 149 |
1 files changed, 140 insertions, 9 deletions
diff --git a/python/binaryview.py b/python/binaryview.py index 7fc37287..84dde18c 100644 --- a/python/binaryview.py +++ b/python/binaryview.py @@ -3505,12 +3505,12 @@ class BinaryView(object): def get_code_refs_for_type_field(self, name, offset): """ - ``get_code_refs_for_type`` returns a list of ReferenceSource objects (xrefs or cross-references) that reference the provided type field. + ``get_code_refs_for_type`` returns a list of TypeFieldReference objects (xrefs or cross-references) that reference the provided type field. :param QualifiedName name: name of type to query for references :param int offset: offset of the field, relative to the type :return: List of References for the given type - :rtype: list(ReferenceSource) + :rtype: list(TypeFieldReference) :Example: >>> bv.get_code_refs_for_type_field('A', 0x8) @@ -3533,8 +3533,9 @@ class BinaryView(object): else: arch = None addr = refs[i].addr - result.append(binaryninja.architecture.ReferenceSource(func, arch, addr)) - core.BNFreeCodeReferences(refs, count.value) + size = refs[i].size + result.append(binaryninja.architecture.TypeFieldReference(func, arch, addr, size)) + core.BNFreeTypeFieldReferences(refs, count.value) return result @@ -3730,9 +3731,9 @@ class BinaryView(object): core.BNRemoveUserDataReference(self.handle, from_addr, to_addr) - def get_all_type_fields_referenced_by_code(self, name): + def get_all_fields_referenced(self, name): """ - ``get_all_type_fields_referenced_by_code`` returns a list of offsets in the QualifiedName + ``get_all_fields_referenced`` returns a list of offsets in the QualifiedName specified by name, which are referenced by code. :param QualifiedName name: name of type to query for references @@ -3740,14 +3741,14 @@ class BinaryView(object): :rtype: list(integer) :Example: - >>> bv.get_all_type_fields_referenced_by_code('A') - ['<type D, offset 0x8, direct>', '<type C, offset 0x10, indirect>'] + >>> bv.get_all_fields_referenced('A') + [0, 8, 16, 24, 32, 40] >>> """ count = ctypes.c_ulonglong(0) name = types.QualifiedName(name)._get_core_struct() - refs = core.BNGetAllFieldsReferencedByCode(self.handle, name, count) + refs = core.BNGetAllFieldsReferenced(self.handle, name, count) result = [] for i in range(0, count.value): @@ -3756,6 +3757,136 @@ class BinaryView(object): core.BNFreeDataReferences(refs, count.value) return result + def get_all_sizes_referenced(self, name): + """ + ``get_all_sizes_referenced`` returns a map from field offset to a list of sizes of + the accesses to it. + + :param QualifiedName name: name of type to query for references + :return: A map from field offset to the size of the code accesses to it + :rtype: map + :Example: + + >>> bv.get_all_sizes_referenced('B') + {0: [1, 8], 8: [8], 16: [1, 8]} + >>> + + """ + count = ctypes.c_ulonglong(0) + name = types.QualifiedName(name)._get_core_struct() + refs = core.BNGetAllSizesReferenced(self.handle, name, count) + + result = {} + for i in range(0, count.value): + result[refs[i].offset] = [] + for j in range(0, refs[i].count): + result[refs[i].offset].append(refs[i].sizes[j]) + + core.BNFreeTypeFieldReferenceSizeInfo(refs, count.value) + return result + + def get_all_types_referenced(self, name): + """ + ``get_all_types_referenced`` returns a map from field offset to a related to the + type field access. + + :param QualifiedName name: name of type to query for references + :return: A map from field offset to a list of incoming types written to it + :rtype: map + :Example: + + >>> bv.get_all_types_referenced('B') + {0: [<type: char, 0% confidence>], 8: [<type: int64_t, 0% confidence>], + 16: [<type: char, 0% confidence>, <type: bool>]} + >>> + + """ + count = ctypes.c_ulonglong(0) + name = types.QualifiedName(name)._get_core_struct() + refs = core.BNGetAllTypesReferenced(self.handle, name, count) + + result = {} + for i in range(0, count.value): + result[refs[i].offset] = [] + for j in range(0, refs[i].count): + typeObj = types.Type(core.BNNewTypeReference(refs[i].types[j].type),\ + confidence = refs[i].types[j].confidence) + result[refs[i].offset].append(typeObj) + + core.BNFreeTypeFieldReferenceTypeInfo(refs, count.value) + return result + + def get_sizes_referenced(self, name, offset): + """ + ``get_sizes_referenced`` returns a list of sizes of the accesses to it. + + :param QualifiedName name: name of type to query for references + :param int offset: offset of the field + :return: a list of sizes of the accesses to it. + :rtype: list + :Example: + + >>> bv.get_sizes_referenced('B', 16) + [1, 8] + >>> + + """ + count = ctypes.c_ulonglong(0) + name = types.QualifiedName(name)._get_core_struct() + refs = core.BNGetSizesReferenced(self.handle, name, offset, count) + + result = [] + for i in range(0, count.value): + result.append(refs[i]) + + core.BNFreeTypeFieldReferenceSizes(refs, count.value) + return result + + def get_types_referenced(self, name, offset): + """ + ``get_types_referenced`` returns a list of types related to the type field access. + + :param QualifiedName name: name of type to query for references + :param int offset: offset of the field + :return: a list of types related to the type field access. + :rtype: list + :Example: + + >>> bv.get_types_referenced('B', 0x10) + [<type: bool>, <type: char, 0% confidence>] + >>> + """ + count = ctypes.c_ulonglong(0) + name = types.QualifiedName(name)._get_core_struct() + refs = core.BNGetTypesReferenced(self.handle, name, offset, count) + + result = [] + for i in range(0, count.value): + typeObj = types.Type(core.BNNewTypeReference(refs[i].type),\ + confidence = refs[i].confidence) + result.append(typeObj) + + core.BNFreeTypeFieldReferenceTypes(refs, count.value) + return result + + def create_structure_from_offset_access(self, name): + newMemberAdded = ctypes.c_bool(False) + name = types.QualifiedName(name)._get_core_struct() + struct = core.BNCreateStructureFromOffsetAccess(self.handle, name, newMemberAdded) + if struct is None: + return None + return types.Structure(struct) + + @classmethod + def create_structure_member_from_access(self, name, offset): + name = types.QualifiedName(name)._get_core_struct() + result = core.BNCreateStructureMemberFromAccess(self.handle, name, offset) + if not result.type: + return None + + return types.Type(core.BNNewTypeReference(result.type),\ + confidence = result.confidence) + def get_callers(self, addr): """ ``get_callers`` returns a list of ReferenceSource objects (xrefs or cross-references) that call the provided virtual address. |
