From 8149774201203326096099394434871992996628 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Mon, 23 Sep 2024 17:15:17 -0400 Subject: Demangler plugin API Closes #467 --- view/elf/elfview.cpp | 18 +++++------------- view/macho/machoview.cpp | 35 ++++++++++++++-------------------- view/pe/coffview.cpp | 17 +++++++++-------- view/pe/peview.cpp | 49 +++++++++++------------------------------------- 4 files changed, 39 insertions(+), 80 deletions(-) (limited to 'view') diff --git a/view/elf/elfview.cpp b/view/elf/elfview.cpp index b90b18a7..e788b06d 100644 --- a/view/elf/elfview.cpp +++ b/view/elf/elfview.cpp @@ -2443,28 +2443,20 @@ void ElfView::DefineElfSymbol(BNSymbolType type, const string& incomingName, uin string shortName = rawName; string fullName = rawName; Ref typeRef = symbolTypeRef; - if (m_arch && IsGNU3MangledString(rawName)) + if (m_arch) { - QualifiedName varName; + QualifiedName demangledName; Ref demangledType; - if (DemangleGNU3(m_arch, rawName, demangledType, varName, m_simplifyTemplates)) + bool simplify = Settings::Instance()->Get("analysis.types.templateSimplifier", this); + if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, simplify)) { - shortName = varName.GetString(); + shortName = demangledName.GetString(); fullName = shortName; if (demangledType) fullName += demangledType->GetStringAfterName(); if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) typeRef = demangledType; } - else if (!m_extractMangledTypes && DemangleLLVM(rawName, varName, m_simplifyTemplates)) - { - shortName = varName.GetString(); - fullName = shortName; - } - else - { - m_logger->LogDebug("Failed to demangle name: '%s'\n", rawName.c_str()); - } } if (!typeRef && (size > 0 && size <= 8)) diff --git a/view/macho/machoview.cpp b/view/macho/machoview.cpp index d8a8a57f..5a118256 100644 --- a/view/macho/machoview.cpp +++ b/view/macho/machoview.cpp @@ -2428,30 +2428,23 @@ Ref MachoView::DefineMachoSymbol( string fullName = rawName; Ref typeRef = symbolTypeRef; - QualifiedName varName; if (m_arch) { - if (IsGNU3MangledString(rawName)) + QualifiedName demangledName; + Ref demangledType; + bool simplify = Settings::Instance()->Get("analysis.types.templateSimplifier", this); + if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, simplify)) { - Ref demangledType; - if (DemangleGNU3(m_arch, rawName, demangledType, varName, m_simplifyTemplates)) - { - shortName = varName.GetString(); - fullName = shortName; - if (demangledType) - fullName += demangledType->GetStringAfterName(); - if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) - typeRef = demangledType; - } - else if (!m_extractMangledTypes && DemangleLLVM(rawName, varName, m_simplifyTemplates)) - { - shortName = varName.GetString(); - fullName = shortName; - } - else - { - m_logger->LogDebug("Failed to demangle name: '%s'\n", rawName.c_str()); - } + shortName = demangledName.GetString(); + fullName = shortName; + if (demangledType) + fullName += demangledType->GetStringAfterName(); + if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) + typeRef = demangledType; + } + else + { + m_logger->LogDebug("Failed to demangle name: '%s'\n", rawName.c_str()); } } diff --git a/view/pe/coffview.cpp b/view/pe/coffview.cpp index be8cef8e..28103a4a 100644 --- a/view/pe/coffview.cpp +++ b/view/pe/coffview.cpp @@ -1518,22 +1518,23 @@ void COFFView::AddCOFFSymbol(BNSymbolType type, const string& dll, const string& string shortName = rawName; string fullName = rawName; - if (m_arch && name.size() > 0 && name[0] == '?') + if (m_arch && name.size() > 0) { - QualifiedName demangleName; + QualifiedName demangledName; Ref demangledType; - if (DemangleMS(m_arch, name, demangledType, demangleName, m_simplifyTemplates)) + bool simplify = Settings::Instance()->Get("analysis.types.templateSimplifier", this); + if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, simplify)) { - shortName = demangleName.GetString(); - fullName = shortName + demangledType->GetStringAfterName(); + shortName = demangledName.GetString(); + fullName = shortName; + if (demangledType) + fullName += demangledType->GetStringAfterName(); if (!symbolTypeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) symbolTypeRef = demangledType; } else { - // TODO: This is happening a lot, so figure out why the demangler can't handle symbols like "??_C@_0M@LLLPOAKG@hasChildren@" - // For now, disable the message because it's very noisy for some binaries - DEBUG_COFF(m_logger->LogDebug("COFF: Failed to demangle: '%s'\n", name.c_str())); + m_logger->LogDebug("Failed to demangle: '%s'\n", name.c_str()); } } diff --git a/view/pe/peview.cpp b/view/pe/peview.cpp index 2980d667..e299b0e5 100644 --- a/view/pe/peview.cpp +++ b/view/pe/peview.cpp @@ -2965,49 +2965,22 @@ void PEView::AddPESymbol(BNSymbolType type, const string& dll, const string& nam if (m_arch && name.size() > 0) { - QualifiedName demangleName; + QualifiedName demangledName; Ref demangledType; - if (name[0] == '?') + bool simplify = Settings::Instance()->Get("analysis.types.templateSimplifier", this); + if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, simplify)) { - if (DemangleMS(m_arch, name, demangledType, demangleName, m_simplifyTemplates)) - { - shortName = demangleName.GetString(); - fullName = shortName + demangledType->GetStringAfterName(); - if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) - typeRef = demangledType; - } - else if (!m_extractMangledTypes && DemangleLLVM(rawName, demangleName, m_simplifyTemplates)) - { - shortName = demangleName.GetString(); - fullName = shortName; - } - else - { - m_logger->LogDebug("Failed to demangle: '%s'\n", name.c_str()); - } + shortName = demangledName.GetString(); + fullName = shortName; + if (demangledType) + fullName += demangledType->GetStringAfterName(); + if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) + typeRef = demangledType; } - else if (IsGNU3MangledString(rawName)) + else { - if (DemangleGNU3(m_arch, rawName, demangledType, demangleName, m_simplifyTemplates)) - { - shortName = demangleName.GetString(); - fullName = shortName; - if (demangledType) - fullName += demangledType->GetStringAfterName(); - if (!typeRef && m_extractMangledTypes && !GetDefaultPlatform()->GetFunctionByName(rawName)) - typeRef = demangledType; - } - else if (!m_extractMangledTypes && DemangleLLVM(rawName, demangleName, m_simplifyTemplates)) - { - shortName = demangleName.GetString(); - fullName = shortName; - } - else - { - m_logger->LogDebug("Failed to demangle name: '%s'\n", rawName.c_str()); - } + m_logger->LogDebug("Failed to demangle: '%s'\n", name.c_str()); } - // Not a mangled string } NameSpace ns(dll); -- cgit v1.3.1