Skip to content

Commit 02a7cfa

Browse files
committed
Improved handling string and relevant structures' xrefs in x86
1 parent eb500cf commit 02a7cfa

1 file changed

Lines changed: 5 additions & 9 deletions

File tree

pyclassinformer/pyclassinformer.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class RTTITypeDescriptor(RTTIStruc):
5757
else:
5858
idc.add_struc_member(msid, "pVFTable", ida_idaapi.BADADDR, ida_bytes.FF_DATA|u.PTR_TYPE|ida_bytes.FF_0OFF, u.mt_address().tid, u.PTR_SIZE)
5959
idc.add_struc_member(msid, "spare", ida_idaapi.BADADDR, ida_bytes.FF_DATA|u.PTR_TYPE, -1, u.PTR_SIZE)
60-
idc.add_struc_member(msid, "name", ida_idaapi.BADADDR, ida_bytes.FF_DATA|ida_bytes.FF_STRLIT, u.mt_ascii().tid, 0)
60+
idc.add_struc_member(msid, "name", ida_idaapi.BADADDR, ida_bytes.FF_DATA|ida_bytes.FF_STRLIT, ida_nalt.STRTYPE_C, 0)
6161

6262
# get structure related info
6363
tid = msid
@@ -75,7 +75,7 @@ def __init__(self, ea):
7575
if strlen is None:
7676
# not a real vtable
7777
return
78-
self.size = self.size + strlen
78+
self.size = self.size + strlen + 1 # for NULL byte
7979

8080
# get mangled name
8181
bmangled = ida_bytes.get_strlit_contents(name, strlen, 0)
@@ -240,13 +240,6 @@ def parse_bca(self, ea, nb_classes):
240240
for i in range(0, nb_classes):
241241
bcdoff = ea+i*4
242242

243-
# apply data type to items in BCA
244-
#ida_bytes.create_dword(bcdoff, 4)
245-
#if u.x64:
246-
# ida_offset.op_offset(bcdoff, ida_bytes.OPND_MASK, u.REF_OFF|ida_nalt.REFINFO_RVAOFF, -1, 0, 0)
247-
#else:
248-
# ida_offset.op_offset(bcdoff, ida_bytes.OPND_MASK, u.REF_OFF, -1, 0, 0)
249-
250243
# get relevant structures
251244
bcdea = ida_bytes.get_32bit(bcdoff) + u.x64_imagebase()
252245
bcd = RTTIBaseClassDescriptor(bcdea)
@@ -411,6 +404,9 @@ def parse_msvc_vftable():
411404
ida_auto.auto_wait()
412405
if len([xrea for xrea in u.get_refs_to(RTTIBaseClassArray.tid)]) == 0:
413406
[ida_bytes.create_struct(result[x].chd.bca.ea, result[x].chd.bca.size, RTTIBaseClassArray.tid, True) for x in result]
407+
if len([xrea for xrea in u.get_refs_to(RTTIClassHierarchyDescriptor.tid)]) == 0:
408+
[ida_bytes.create_struct(result[x].chd.ea, RTTIClassHierarchyDescriptor.size, RTTIClassHierarchyDescriptor.tid, True) for x in result]
409+
[[ida_bytes.create_struct(y.ea, RTTIBaseClassDescriptor.size, RTTIBaseClassDescriptor.tid, True) for y in result[x].chd.bca.bases] for x in result]
414410
ida_auto.auto_wait()
415411

416412
return result

0 commit comments

Comments
 (0)