mirror of https://github.com/pwndbg/pwndbg.git
Remove files
parent
30a0de056a
commit
022ada59f8
@ -1,122 +0,0 @@
|
||||
|
||||
|
||||
def get_type(v):
|
||||
t = v.type
|
||||
while not t.name:
|
||||
if t.code == gdb.TYPE_CODE_PTR:
|
||||
t = t.target()
|
||||
return t.name
|
||||
|
||||
def get_typename(t):
|
||||
n = ''
|
||||
o = t
|
||||
p = ''
|
||||
if t.code == gdb.TYPE_CODE_ARRAY:
|
||||
t = t.target()
|
||||
while t.code == gdb.TYPE_CODE_PTR:
|
||||
t = t.target()
|
||||
p += '*'
|
||||
name = t.name
|
||||
if not p:
|
||||
return name
|
||||
return name + ' ' + p
|
||||
|
||||
def get_arrsize(f):
|
||||
t = f.type
|
||||
if t.code != gdb.TYPE_CODE_ARRAY:
|
||||
return 0
|
||||
t2 = t.target()
|
||||
s = t2.sizeof
|
||||
return int(t.sizeof / t2.sizeof)
|
||||
|
||||
def get_field_by_name(obj, field):
|
||||
# Dereference once
|
||||
if obj.type.code == gdb.TYPE_CODE_PTR:
|
||||
obj = obj.dereference()
|
||||
for f in re.split('(->|\.|\[\d+\])', field):
|
||||
if not f: continue
|
||||
if f == '->':
|
||||
obj = obj.dereference()
|
||||
elif f == '.':
|
||||
pass
|
||||
elif f.startswith('['):
|
||||
n = int(f.strip('[]'))
|
||||
obj = obj.cast(obj.dereference().type.pointer())
|
||||
obj += n
|
||||
obj = obj.dereference()
|
||||
else:
|
||||
obj = obj[f]
|
||||
return obj
|
||||
|
||||
|
||||
|
||||
def happy(typename):
|
||||
prefix = ''
|
||||
if 'unsigned' in typename:
|
||||
prefix = 'u'
|
||||
typename = typename.replace('unsigned ', '')
|
||||
return prefix + {
|
||||
'char': 'char',
|
||||
'short int': 'short',
|
||||
'long int': 'long',
|
||||
'int': 'int',
|
||||
'long long': 'longlong',
|
||||
'float': 'float',
|
||||
'double': 'double'
|
||||
}[typename]
|
||||
|
||||
def dt(name, addr=None, obj = None, field=None):
|
||||
"""
|
||||
Dump out a structure type Windbg style.
|
||||
"""
|
||||
# Return value is a list of strings.of
|
||||
# We concatenate at the end.
|
||||
rv = []
|
||||
|
||||
# Lookup the type name specified by the user
|
||||
t = gdb.lookup_type(name)
|
||||
|
||||
# If it's not a struct (e.g. int or char*), bail
|
||||
if t.code not in (gdb.TYPE_CODE_STRUCT, gdb.TYPE_CODE_TYPEDEF):
|
||||
raise Exception("Not a structure: %s" % t)
|
||||
|
||||
# If an address was specified, create a Value of the
|
||||
# specified type at that address.
|
||||
if addr is not None:
|
||||
obj = gdb.Value(addr).cast(t.pointer()).dereference()
|
||||
|
||||
# Header, optionally include the name
|
||||
header = name
|
||||
if obj: header = "%s @ %s" (header, str(obj.address))
|
||||
rv.append(name)
|
||||
|
||||
for name, field in t.items():
|
||||
# Get the actual name of the type, e.g. char***
|
||||
t = get_typename(field.type.strip_typedefs())
|
||||
|
||||
# How many entries are in the array, if any
|
||||
n = get_arrsize(field) or ''
|
||||
if n: n = '[%i]' % n
|
||||
|
||||
# Offset into the parent structure
|
||||
o = field.bitpos/8
|
||||
|
||||
line = " +0x%04x %-20s" (o, name)
|
||||
|
||||
if obj is None:
|
||||
line ='%s: %s' % (line, str(field.type))
|
||||
if obj:
|
||||
# Get the actual field Value out of the object
|
||||
v = obj[name]
|
||||
|
||||
# Strip off whatever typedef crap it has
|
||||
vt = v.type
|
||||
if vt.code == gdb.TYPE_CODE_TYPEDEF:
|
||||
vt = vt.strip_typedefs()
|
||||
if vt.code == gdb.TYPE_CODE_INT:
|
||||
v = hex(int(v))
|
||||
print(" +0x%04x %-20s : %s" % (o, name, v))
|
||||
|
||||
rv.append(field)
|
||||
if obj is None: print("}")
|
||||
|
||||
Loading…
Reference in new issue