From 8580baddc37780cdf0afe29a244c9d1283cd71d0 Mon Sep 17 00:00:00 2001 From: ghidra007 Date: Mon, 8 May 2023 21:11:53 +0000 Subject: [PATCH] GP-3417 fixed case where si vtable was not getting created bc too many refs. Added secondary check. Added check for same num special vtable and typeinfos. --- .../classrecovery/RTTIGccClassRecoverer.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java index f75fecc4ec..b151f16ee1 100644 --- a/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java +++ b/Ghidra/Features/Decompiler/ghidra_scripts/classrecovery/RTTIGccClassRecoverer.java @@ -204,6 +204,11 @@ public class RTTIGccClassRecoverer extends RTTIClassRecoverer { Msg.debug(this, "Could not create special vtables"); return null; } + + if(specialVtables.size() != specialTypeinfos.size()) { + Msg.debug(this, "Not equal number of special vtables and special typeinfos"); + return null; + } setComponentOffset(); @@ -3382,6 +3387,13 @@ private Address getReferencedAddress(Address address) { if (specialTypeinfoAddrSet.contains(refTo)) { continue; } + + // all special vtables have zeros just before the ref to typeinfo + Address vtableAddress = refTo.subtract(defaultPointerSize); + if (!isPossibleNullPointer(vtableAddress)) { + continue; + } + possibleRefsInVtable.add(refTo); } if (possibleRefsInVtable.size() != 1) {