|
@@ -33,8 +33,12 @@ def read_cstring(
|
|
|
|
|
|
class VtableDisambiguator(angr.Analysis):
|
|
|
syms_by_addr: dict[int, set[Symbol]]
|
|
|
+
|
|
|
+
|
|
|
subclass_map: dict[Symbol, set[Symbol]]
|
|
|
- superclass_map: dict[Symbol, set[Symbol]]
|
|
|
+
|
|
|
+
|
|
|
+ superclass_map: dict[Symbol, list[Symbol]]
|
|
|
|
|
|
|
|
|
|
|
@@ -59,7 +63,7 @@ class VtableDisambiguator(angr.Analysis):
|
|
|
|
|
|
|
|
|
self.subclass_map = collections.defaultdict(set)
|
|
|
- self.superclass_map = collections.defaultdict(set)
|
|
|
+ self.superclass_map = collections.defaultdict(list)
|
|
|
|
|
|
for vtsym in vtable_syms:
|
|
|
if vtsym.is_import:
|
|
@@ -71,7 +75,7 @@ class VtableDisambiguator(angr.Analysis):
|
|
|
if not svtsym:
|
|
|
continue
|
|
|
self.subclass_map[svtsym].add(vtsym)
|
|
|
- self.superclass_map[vtsym].add(svtsym)
|
|
|
+ self.superclass_map[vtsym].append(svtsym)
|
|
|
|
|
|
def dump_class_parents(self, typeinfo_ptr: int) -> Iterable[tuple[int, str]]:
|
|
|
"""
|
|
@@ -164,21 +168,19 @@ class VtableDisambiguator(angr.Analysis):
|
|
|
def get_possible_vtable_set_candidates(
|
|
|
self, vtsym: Symbol, vtidx: int
|
|
|
) -> Iterable[set[Symbol]]:
|
|
|
-
|
|
|
- yield self.subclass_map[vtsym]
|
|
|
-
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- max_vtsize = 4 * (vtidx + 2)
|
|
|
- for parent_vtsym in sorted(
|
|
|
- filter(lambda vt: vt.size > max_vtsize, self.superclass_map[vtsym]),
|
|
|
- key=lambda vt: vt.size,
|
|
|
- ):
|
|
|
- yield self.subclass_map[parent_vtsym]
|
|
|
+
|
|
|
+
|
|
|
+ psym = self.get_parent_vt_implementing(vtsym, vtidx)
|
|
|
+ yield {psym} | self.subclass_map[psym]
|
|
|
+
|
|
|
+ def get_parent_vt_implementing(self, vtsym: Symbol, vtidx: int) -> Symbol:
|
|
|
+
|
|
|
+ for super_vtsym, gp_vtsym in itertools.pairwise(self.superclass_map[vtsym]):
|
|
|
+ vt_first, *_ = self.get_vfptrs_from_table(gp_vtsym)
|
|
|
+ if len(vt_first) < vtidx:
|
|
|
+ return super_vtsym
|
|
|
+ return self.superclass_map[vtsym][-1]
|
|
|
|
|
|
def get_vfptrs_from_table(self, vtsym: Symbol) -> list[list[int]]:
|
|
|
|