1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
use binaryninja::architecture::CoreArchitecture;
use binaryninja::binary_view::BinaryView;
use binaryninja::demangle::{CustomDemangler, Demangler};
use binaryninja::rc::Ref;
use binaryninja::tracing::TracingLogListener;
use binaryninja::types::{QualifiedName, Type};
struct TestDemangler;
impl CustomDemangler for TestDemangler {
fn is_mangled_string(&self, name: &str) -> bool {
name == "test_name" || name == "test_name2"
}
fn demangle(
&self,
_arch: &CoreArchitecture,
name: &str,
_view: Option<Ref<BinaryView>>,
) -> Option<(QualifiedName, Option<Ref<Type>>)> {
match name {
"test_name" => Some((QualifiedName::from(vec!["test_name"]), Some(Type::bool()))),
"test_name2" => Some((QualifiedName::from(vec!["test_name2", "aaa"]), None)),
_ => None,
}
}
}
fn main() {
tracing_subscriber::fmt::init();
let _listener = TracingLogListener::new().register();
// This loads all the core architecture, platform, etc plugins
let _headless_session =
binaryninja::headless::Session::new().expect("Failed to initialize session");
tracing::info!("Registering demangler...");
Demangler::register("Test", TestDemangler);
let placeholder_arch = CoreArchitecture::by_name("x86_64").expect("x86 exists");
for d in Demangler::list().iter() {
tracing::info!("{}", d.name());
tracing::info!(
" \"__ZN1AC2Ei\" is mangled? {}",
d.is_mangled_string("__ZN1AC2Ei")
);
tracing::info!(
" \"__ZN1AC2Ei\" : {:?}",
d.demangle(&placeholder_arch, "__ZN1AC2Ei", None)
);
tracing::info!(
" \"test_name\" : {:?}",
d.demangle(&placeholder_arch, "test_name", None)
);
tracing::info!(
" \"test_name2\" : {:?}",
d.demangle(&placeholder_arch, "test_name2", None)
);
}
}
|