summaryrefslogtreecommitdiff
path: root/rust/examples/demangler.rs
blob: edefaec19b180908120585637798cccc28a4dde9 (plain)
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)
        );
    }
}