summaryrefslogtreecommitdiff
path: root/rust/examples/demangler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/examples/demangler.rs')
-rw-r--r--rust/examples/demangler.rs59
1 files changed, 59 insertions, 0 deletions
diff --git a/rust/examples/demangler.rs b/rust/examples/demangler.rs
new file mode 100644
index 00000000..b2e5eb66
--- /dev/null
+++ b/rust/examples/demangler.rs
@@ -0,0 +1,59 @@
+use binaryninja::architecture::CoreArchitecture;
+use binaryninja::binary_view::BinaryView;
+use binaryninja::demangle::{CustomDemangler, Demangler};
+use binaryninja::rc::Ref;
+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() {
+ println!("Starting session...");
+ // This loads all the core architecture, platform, etc plugins
+ let _headless_session =
+ binaryninja::headless::Session::new().expect("Failed to initialize session");
+
+ println!("Registering demangler...");
+ Demangler::register("Test", TestDemangler);
+
+ let placeholder_arch = CoreArchitecture::by_name("x86_64").expect("x86 exists");
+
+ for d in Demangler::list().iter() {
+ println!("{}", d.name());
+
+ println!(
+ " \"__ZN1AC2Ei\" is mangled? {}",
+ d.is_mangled_string("__ZN1AC2Ei")
+ );
+ println!(
+ " \"__ZN1AC2Ei\" : {:?}",
+ d.demangle(&placeholder_arch, "__ZN1AC2Ei", None)
+ );
+ println!(
+ " \"test_name\" : {:?}",
+ d.demangle(&placeholder_arch, "test_name", None)
+ );
+ println!(
+ " \"test_name2\" : {:?}",
+ d.demangle(&placeholder_arch, "test_name2", None)
+ );
+ }
+}