Merge pull request #457 from GoD-Tony/vtable-dump-x64
Add x64 support to IDA vtable dump script (npotb).
This commit is contained in:
commit
3e1ba143bf
@ -42,26 +42,29 @@ innerclass = ""
|
||||
classname = None
|
||||
offsetdata = {}
|
||||
|
||||
# Detect address size based on ScreenEA object
|
||||
adr_size = (sys.getsizeof(ScreenEA()) - 8)
|
||||
|
||||
def ExtractTypeInfo(ea, level = 0):
|
||||
global catchclass
|
||||
global innerclass
|
||||
global classname
|
||||
global offsetdata
|
||||
|
||||
end = ea + 4
|
||||
end = ea + adr_size
|
||||
|
||||
while len(Name(end)) == 0:
|
||||
end += 4
|
||||
end += adr_size
|
||||
|
||||
while Dword(end - 4) == 0:
|
||||
end -= 4
|
||||
while Dword(end - adr_size) == 0:
|
||||
end -= adr_size
|
||||
|
||||
# Skip vtable
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
|
||||
# Get type name
|
||||
name = Demangle("_Z" + GetString(Dword(ea)), GetLongPrm(INF_LONG_DN))
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
|
||||
if classname is None and level == 0:
|
||||
classname = name
|
||||
@ -76,15 +79,15 @@ def ExtractTypeInfo(ea, level = 0):
|
||||
pass
|
||||
elif Dword(ea) != 0: #elif isData(GetFlags(Dword(ea))): # Single Inheritance
|
||||
ExtractTypeInfo(Dword(ea), level + 1)
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
else: # Multiple Inheritance
|
||||
ea += 8
|
||||
while ea < end:
|
||||
catchclass = True
|
||||
ExtractTypeInfo(Dword(ea), level + 1)
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
offset = Dword(ea)
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
#print "%*s Offset: 0x%06X" % (level, "", offset >> 8)
|
||||
if (offset >> 8) != 0:
|
||||
offsetdata[offset >> 8] = innerclass
|
||||
@ -106,15 +109,15 @@ def Analyze():
|
||||
|
||||
ea = ScreenEA()
|
||||
|
||||
end = ea + 4
|
||||
end = ea + adr_size
|
||||
while Demangle(Name(end), GetLongPrm(INF_LONG_DN)) is None:
|
||||
end += 4
|
||||
end += adr_size
|
||||
|
||||
while Dword(end - 4) == 0:
|
||||
end -= 4
|
||||
while Dword(end - adr_size) == 0:
|
||||
end -= adr_size
|
||||
|
||||
while Demangle(Name(ea), GetLongPrm(INF_LONG_DN)) is None:
|
||||
ea -= 4
|
||||
ea -= adr_size
|
||||
|
||||
name = Demangle(Name(ea), GetLongPrm(INF_LONG_DN))
|
||||
if ea == BADADDR or name is None or not re.search(r"vf?table(?: |'\{)for", name):
|
||||
@ -134,11 +137,11 @@ def Analyze():
|
||||
# Read thisoffs
|
||||
offset = -twos_comp(Dword(ea), 32)
|
||||
#print "Offset: 0x%08X (%08X)" % (offset, ea)
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
|
||||
# Read typeinfo address
|
||||
typeinfo = Dword(ea)
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
|
||||
if offset == 0: # We only need to read this once
|
||||
print "Inheritance Tree:"
|
||||
@ -175,7 +178,7 @@ def Analyze():
|
||||
#print "Stripping '%s' from windows vtable." % (name)
|
||||
temp_windows_vtable.remove(name)
|
||||
|
||||
ea += 4
|
||||
ea += adr_size
|
||||
|
||||
for i, v in enumerate(temp_windows_vtable):
|
||||
if "::~" in v:
|
||||
|
Loading…
Reference in New Issue
Block a user