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>, ) -> Option<(QualifiedName, Option>)> { 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) ); } }