-
Notifications
You must be signed in to change notification settings - Fork 281
Expand file tree
/
Copy pathtypelib_dump.py
More file actions
executable file
·123 lines (104 loc) · 4.03 KB
/
typelib_dump.py
File metadata and controls
executable file
·123 lines (104 loc) · 4.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python
# binja type library info utility
import os, sys, re, random
import binaryninja
from binaryninja.enums import *
from binaryninja import typelibrary
# The class Type as defined in api/python/types.py is nearly a discriminated union.
# By examining the .type_class member you can decide which properties make sense to access.
#
# For example, if .type_class == FunctionTypeClass then you can access:
# .return_value binaryninja.types.Type
# .parameters [binaryninja.types.FunctionParameter]
#
# For example, if .type_class == StructureTypeClass then you can access:
# .structure binaryninja.types.Structure
#
# etc...
def obj2str(t, depth=0):
indent = ' ' * depth
result = ''
if type(t) == binaryninja.types.StructureType:
result = '%sStructure\n' % (indent)
for m in t.members:
result += obj2str(m, depth + 1)
elif type(t) == binaryninja.types.StructureMember:
result = '%sStructureMember "%s"\n' % (indent, t._name)
result += type2str(t.type, depth + 1)
elif type(t) == binaryninja.types.FunctionParameter:
result = '%sFunctionParameter "%s"\n' % (indent, t.name)
result += type2str(t.type, depth + 1)
elif type(t) == binaryninja.types.NamedTypeReferenceType:
result = '%sNamedTypeReference %s\n' % (indent, repr(t))
elif type(t) == binaryninja.types.EnumerationType:
result = '%sEnumeration\n' % indent
for m in t.members:
result += obj2str(m, depth + 1)
elif type(t) == binaryninja.types.EnumerationMember:
result = '%sEnumerationMember %s==%d\n' % (indent, t.name, t.value)
elif t == None:
result = 'unimplemented'
return result
def type2str(t: binaryninja.types.Type, depth=0):
indent = ' ' * depth
result = 'unimplemented'
assert isinstance(t, binaryninja.types.Type)
tc = t.type_class
if tc == TypeClass.VoidTypeClass:
result = '%sType class=Void\n' % indent
elif tc == TypeClass.BoolTypeClass:
result = '%sType class=Bool\n' % indent
elif tc == TypeClass.IntegerTypeClass:
result = '%sType class=Integer width=%d\n' % (indent, t.width)
elif tc == TypeClass.FloatTypeClass:
result = '%sType class=Float\n' % indent
elif tc == TypeClass.StructureTypeClass:
result = '%sType class=Structure\n' % indent
result += obj2str(t.structure, depth + 1)
elif tc == TypeClass.EnumerationTypeClass:
result = '%sType class=Enumeration\n' % indent
result += obj2str(t.enumeration, depth + 1)
elif tc == TypeClass.PointerTypeClass:
result = '%sType class=Pointer\n' % indent
result += type2str(t.target, depth + 1)
elif tc == TypeClass.ArrayTypeClass:
result = '%sType class=Array\n' % indent
elif tc == TypeClass.FunctionTypeClass:
result = '%sType class=Function\n' % indent
result += type2str(t.return_value, depth + 1)
for param in t.parameters:
result += obj2str(param, depth + 1)
elif tc == TypeClass.VarArgsTypeClass:
result = '%sType class=VarArgs\n' % indent
elif tc == TypeClass.ValueTypeClass:
result = '%sType class=Value\n' % indent
elif tc == TypeClass.NamedTypeReferenceClass:
result = '%sType class=NamedTypeReference\n' % indent
result += obj2str(t.named_type_reference, depth + 1)
elif tc == TypeClass.WideCharTypeClass:
result = '%sType class=WideChar\n' % indent
return result
if __name__ == '__main__':
binaryninja._init_plugins()
if len(sys.argv) <= 1:
raise Exception('supply typelib file')
fpath = sys.argv[-1]
print(' reading: %s' % fpath)
tl = typelibrary.TypeLibrary.load_from_file(fpath)
print(' name: %s' % tl.name)
print(' arch: %s' % tl.arch)
print(' guid: %s' % tl.guid)
print('dependency_name: %s' % tl.dependency_name)
print('alternate_names: %s' % tl.alternate_names)
print(' platform_names: %s' % tl.platform_names)
print('')
print(' named_objects: %d' % len(tl.named_objects))
for (key, val) in tl.named_objects.items():
print('\t"%s" %s' % (str(key), str(val)))
print('')
print(' named_types: %d' % len(tl.named_types))
for (key, val) in tl.named_types.items():
line = 'typelib.named_types["%s"] =' % (str(key))
print(line)
print('-' * len(line))
print(type2str(val))