diff options
| author | Glenn Smith <glenn@vector35.com> | 2024-09-23 17:15:17 -0400 |
|---|---|---|
| committer | Glenn Smith <glenn@vector35.com> | 2024-10-17 17:33:52 -0400 |
| commit | 8149774201203326096099394434871992996628 (patch) | |
| tree | d968976df167dc74090f61051c41ca30e5cc7c8e /rust/examples | |
| parent | 5353484086517832418955474757290903351986 (diff) | |
Demangler plugin API
Closes #467
Diffstat (limited to 'rust/examples')
| -rw-r--r-- | rust/examples/test_demangler/Cargo.toml | 17 | ||||
| -rw-r--r-- | rust/examples/test_demangler/src/lib.rs | 64 |
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 +} |
