summaryrefslogtreecommitdiff
path: root/rust/examples
diff options
context:
space:
mode:
authorGlenn Smith <glenn@vector35.com>2024-09-23 17:15:17 -0400
committerGlenn Smith <glenn@vector35.com>2024-10-17 17:33:52 -0400
commit8149774201203326096099394434871992996628 (patch)
treed968976df167dc74090f61051c41ca30e5cc7c8e /rust/examples
parent5353484086517832418955474757290903351986 (diff)
Demangler plugin API
Closes #467
Diffstat (limited to 'rust/examples')
-rw-r--r--rust/examples/test_demangler/Cargo.toml17
-rw-r--r--rust/examples/test_demangler/src/lib.rs64
2 files changed, 81 insertions, 0 deletions
diff --git a/rust/examples/test_demangler/Cargo.toml b/rust/examples/test_demangler/Cargo.toml
new file mode 100644
index 00000000..eb4daa34
--- /dev/null
+++ b/rust/examples/test_demangler/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "test_demangler"
+version = "0.1.0"
+edition = "2021"
+
+# Uncomment this if you're writing a plugin (plugins are shared objects loaded by the core):
+[lib]
+crate-type = ["cdylib"]
+
+# You can point at the BinaryNinja dependency in one of two ways, via path:
+[dependencies]
+binaryninja = {path="../../"}
+log = "0.4.21"
+
+# Or directly at the git repo:
+# [dependencies]
+# binaryninja = {git = "https://github.com/Vector35/binaryninja-api.git", branch = "dev"}
diff --git a/rust/examples/test_demangler/src/lib.rs b/rust/examples/test_demangler/src/lib.rs
new file mode 100644
index 00000000..eaa38dad
--- /dev/null
+++ b/rust/examples/test_demangler/src/lib.rs
@@ -0,0 +1,64 @@
+use log::{info, LevelFilter};
+use binaryninja::architecture::CoreArchitecture;
+use binaryninja::binaryview::BinaryView;
+use binaryninja::{command, logger};
+use binaryninja::command::Command;
+use binaryninja::demangle::{Demangler, CustomDemangler};
+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>>) -> Result<(Option<Ref<Type>>, QualifiedName), ()> {
+ match name {
+ "test_name" => Ok((Some(Type::bool()), QualifiedName::from(vec!["test_name"]))),
+ "test_name2" => Ok((None, QualifiedName::from(vec!["test_name2", "aaa"]))),
+ _ => Err(()),
+ }
+
+ }
+}
+
+struct DemangleCommand;
+
+impl Command for DemangleCommand {
+ fn action(&self, view: &BinaryView) {
+ for d in Demangler::list().iter() {
+ info!("{}", d.name());
+
+ info!("{}", d.is_mangled_string("__ZN1AC2Ei"));
+ info!("{:?}", d.demangle(
+ &CoreArchitecture::by_name("x86_64").expect("x86 exists"),
+ "__ZN1AC2Ei",
+ Some(view)
+ ));
+ info!("{:?}", d.demangle(
+ &CoreArchitecture::by_name("x86_64").expect("x86 exists"),
+ "test_name",
+ None
+ ));
+ info!("{:?}", d.demangle(
+ &CoreArchitecture::by_name("x86_64").expect("x86 exists"),
+ "test_name2",
+ None
+ ));
+ }
+ }
+
+ fn valid(&self, _view: &BinaryView) -> bool {
+ true
+ }
+}
+
+#[no_mangle]
+pub extern "C" fn CorePluginInit() -> bool {
+ let _ = logger::init(LevelFilter::Info);
+ Demangler::register("Test", TestDemangler {});
+ command::register("Demangle Test", "Test", DemangleCommand {});
+ true
+}