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/test_demangler/src | |
| parent | 5353484086517832418955474757290903351986 (diff) | |
Demangler plugin API
Closes #467
Diffstat (limited to 'rust/examples/test_demangler/src')
| -rw-r--r-- | rust/examples/test_demangler/src/lib.rs | 64 |
1 files changed, 64 insertions, 0 deletions
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 +} |
