Skip to content

Commit 02cebd9

Browse files
committed
Use platform and view context when finalizing demangled types
1 parent 1d3221b commit 02cebd9

6 files changed

Lines changed: 74 additions & 16 deletions

File tree

demangle.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,19 @@ namespace BinaryNinja {
4747
bool DemangleMS(Architecture* arch, const std::string& mangledName, Ref<Type>& outType, QualifiedName& outVarName,
4848
BinaryView* view)
4949
{
50-
const bool simplify = Settings::Instance()->Get<bool>("analysis.types.templateSimplifier", view);
51-
return DemangleMS(arch, mangledName, outType, outVarName, simplify);
50+
BNType* localType = nullptr;
51+
char** localVarName = nullptr;
52+
size_t localSize = 0;
53+
if (!BNDemangleMSWithOptions(arch->GetObject(), mangledName.c_str(), &localType, &localVarName, &localSize,
54+
view ? view->GetObject() : nullptr))
55+
return false;
56+
outType = localType ? new Type(localType) : nullptr;
57+
for (size_t i = 0; i < localSize; i++)
58+
{
59+
outVarName.push_back(localVarName[i]);
60+
}
61+
BNFreeDemangledName(&localVarName, localSize);
62+
return true;
5263
}
5364

5465
bool DemangleMS(Architecture* arch, const std::string& mangledName, Ref<Type>& outType, QualifiedName& outVarName,

plugins/pdb-ng/src/symbol_parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use crate::PDBParserInstance;
3939
use binaryninja::architecture::{Architecture, ArchitectureExt, Register, RegisterId};
4040
use binaryninja::binary_view::BinaryViewBase;
4141
use binaryninja::confidence::{Conf, MAX_CONFIDENCE, MIN_CONFIDENCE};
42-
use binaryninja::demangle::demangle_ms;
42+
use binaryninja::demangle::demangle_ms_with_view;
4343
use binaryninja::rc::Ref;
4444
use binaryninja::types::{FunctionParameter, QualifiedName, StructureBuilder, Type, TypeClass};
4545
use binaryninja::variable::{Variable, VariableSourceType};
@@ -1820,7 +1820,7 @@ impl<'a, S: Source<'a> + 'a> PDBParserInstance<'a, S> {
18201820
raw_name: &String,
18211821
rva: Rva,
18221822
) -> Result<(Option<Conf<Ref<Type>>>, Option<QualifiedName>)> {
1823-
let (mut t, mut name) = match demangle_ms(&self.arch, raw_name, true) {
1823+
let (mut t, mut name) = match demangle_ms_with_view(&self.arch, raw_name, Some(self.bv)) {
18241824
Some((name, Some(t))) => (Some(Conf::new(t, DEMANGLE_CONFIDENCE)), name),
18251825
Some((name, _)) => (None, name),
18261826
_ => (None, QualifiedName::new(vec![raw_name.clone()])),

plugins/rtti/rtti.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33
using namespace BinaryNinja;
44
using namespace BinaryNinja::RTTI;
55

6+
namespace
7+
{
8+
std::string NormalizeRTTIClassName(std::string name)
9+
{
10+
size_t beginFind = name.find_first_of(' ');
11+
if (beginFind != std::string::npos)
12+
name.erase(0, beginFind + 1);
13+
size_t endFind = name.find(" `RTTI Type Descriptor Name'");
14+
if (endFind != std::string::npos)
15+
name.erase(endFind, name.length());
16+
return name;
17+
}
18+
}
19+
620

721
Ref<Symbol> RTTI::GetRealSymbol(BinaryView *view, uint64_t relocAddr, uint64_t symAddr)
822
{
@@ -24,9 +38,9 @@ std::optional<std::string> RTTI::DemangleNameMS(BinaryView* view, bool allowMang
2438
{
2539
QualifiedName demangledName = {};
2640
Ref<Type> outType = {};
27-
if (!DemangleMS(view->GetDefaultArchitecture(), mangledName, outType, demangledName, true))
41+
if (!DemangleMS(view->GetDefaultArchitecture(), mangledName, outType, demangledName, view))
2842
return DemangleNameLLVM(allowMangled, mangledName);
29-
return demangledName.GetString();
43+
return NormalizeRTTIClassName(demangledName.GetString());
3044
}
3145

3246

@@ -90,14 +104,7 @@ std::optional<std::string> RTTI::DemangleNameLLVM(bool allowMangled, const std::
90104
Ref<Type> outType = {};
91105
if (!DemangleLLVM(mangledName, demangledName, true))
92106
return allowMangled ? std::optional(mangledName) : std::nullopt;
93-
auto demangledNameStr = demangledName.GetString();
94-
size_t beginFind = demangledNameStr.find_first_of(' ');
95-
if (beginFind != std::string::npos)
96-
demangledNameStr.erase(0, beginFind + 1);
97-
size_t endFind = demangledNameStr.find(" `RTTI Type Descriptor Name'");
98-
if (endFind != std::string::npos)
99-
demangledNameStr.erase(endFind, demangledNameStr.length());
100-
return demangledNameStr;
107+
return NormalizeRTTIClassName(demangledName.GetString());
101108
}
102109

103110

rust/src/demangle.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,46 @@ pub fn demangle_ms(
165165
}
166166
}
167167

168+
pub fn demangle_ms_with_view(
169+
arch: &CoreArchitecture,
170+
mangled_name: &str,
171+
view: Option<&BinaryView>,
172+
) -> Option<(QualifiedName, Option<Ref<Type>>)> {
173+
let mangled_name = mangled_name.to_cstr();
174+
let mut out_type: *mut BNType = std::ptr::null_mut();
175+
let mut out_name: *mut *mut std::os::raw::c_char = std::ptr::null_mut();
176+
let mut out_size: usize = 0;
177+
let res = unsafe {
178+
BNDemangleMSWithOptions(
179+
arch.handle,
180+
mangled_name.as_ptr(),
181+
&mut out_type,
182+
&mut out_name,
183+
&mut out_size,
184+
view.map(|v| v.handle).unwrap_or(std::ptr::null_mut()),
185+
)
186+
};
187+
188+
match res {
189+
true => {
190+
assert!(!out_name.is_null());
191+
let names: Vec<_> = unsafe { ArrayGuard::<BnString>::new(out_name, out_size, ()) }
192+
.iter()
193+
.map(str::to_string)
194+
.collect();
195+
unsafe { BNFreeDemangledName(&mut out_name, out_size) };
196+
197+
let out_type = match out_type.is_null() {
198+
true => None,
199+
false => Some(unsafe { Type::ref_from_raw(out_type) }),
200+
};
201+
202+
Some((names.into(), out_type))
203+
}
204+
false => None,
205+
}
206+
}
207+
168208
#[derive(PartialEq, Eq, Hash)]
169209
pub struct Demangler {
170210
pub(crate) handle: *mut BNDemangler,

view/pe/coffview.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ void COFFView::AddCOFFSymbol(BNSymbolType type, const string& dll, const string&
15311531
{
15321532
QualifiedName demangledName;
15331533
Ref<Type> demangledType;
1534-
if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, nullptr, m_simplifyTemplates))
1534+
if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, m_simplifyTemplates))
15351535
{
15361536
shortName = demangledName.GetString();
15371537
fullName = shortName;

view/pe/peview.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3562,7 +3562,7 @@ void PEView::AddPESymbol(BNSymbolType type, const string& dll, const string& nam
35623562
{
35633563
QualifiedName demangledName;
35643564
Ref<Type> demangledType;
3565-
if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, nullptr, m_simplifyTemplates))
3565+
if (DemangleGeneric(m_arch, rawName, demangledType, demangledName, this, m_simplifyTemplates))
35663566
{
35673567
shortName = demangledName.GetString();
35683568
fullName = shortName;

0 commit comments

Comments
 (0)