summaryrefslogtreecommitdiff
path: root/plugins/msvc_rtti
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2024-11-05 17:50:49 -0500
committerMason Reed <mason@vector35.com>2024-11-05 17:51:06 -0500
commit00622fa4829c3852ffad840fb7f94cc96ecee83f (patch)
tree6404a5125f67209c5e1bde15b5e64fe48828d1de /plugins/msvc_rtti
parent350726c8f8e149942aab677f7926aece536fc0e7 (diff)
MSVC RTTI: More robust CompleteObjectLocator verification
Must be within section now
Diffstat (limited to 'plugins/msvc_rtti')
-rw-r--r--plugins/msvc_rtti/rtti.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/plugins/msvc_rtti/rtti.cpp b/plugins/msvc_rtti/rtti.cpp
index 56b53477..073acdd6 100644
--- a/plugins/msvc_rtti/rtti.cpp
+++ b/plugins/msvc_rtti/rtti.cpp
@@ -75,7 +75,10 @@ std::optional<CompleteObjectLocator> ReadCompleteObjectorLocator(BinaryView *vie
{
auto coLocator = CompleteObjectLocator(view, address);
uint64_t startAddr = view->GetOriginalImageBase();
- uint64_t endAddr = view->GetEnd();
+
+ auto outsideSection = [&](uint64_t addr) {
+ return view->GetSectionsAt(addr).empty();
+ };
if (coLocator.signature > 1)
return std::nullopt;
@@ -86,18 +89,19 @@ std::optional<CompleteObjectLocator> ReadCompleteObjectorLocator(BinaryView *vie
return std::nullopt;
// Relative addrs
- if (coLocator.pTypeDescriptor + startAddr > endAddr)
+ if (outsideSection(coLocator.pTypeDescriptor + startAddr))
return std::nullopt;
- if (coLocator.pClassHeirarchyDescriptor + startAddr > endAddr)
+ if (outsideSection(coLocator.pClassHeirarchyDescriptor + startAddr))
return std::nullopt;
- } else
+ }
+ else
{
// Absolute addrs
- if (coLocator.pTypeDescriptor < startAddr || coLocator.pTypeDescriptor > endAddr)
+ if (outsideSection(coLocator.pTypeDescriptor))
return std::nullopt;
- if (coLocator.pClassHeirarchyDescriptor < startAddr || coLocator.pClassHeirarchyDescriptor > endAddr)
+ if (outsideSection(coLocator.pClassHeirarchyDescriptor))
return std::nullopt;
}