From 22359694c75ede4a7bade3685da302fc251c5afd Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Tue, 21 Apr 2026 18:10:51 -0700 Subject: [PATCH 1/2] [Rust] Refactor `binary_view` module - Remove the "viral" `BinaryViewExt` trait and its blanket impl - Split up the binary view type from the custom trait impl - Simplify and fix bugs regarding custom binary view initialization - Rewrite Minidump binary view example, parses the PE headers to create proper sections now - Add some extra documentation - Add unit test for custom binary view --- Cargo.lock | 71 +- arch/msp430/src/lib.rs | 9 +- arch/riscv/src/lib.rs | 5 +- plugins/bntl_utils/src/command/create.rs | 2 +- plugins/bntl_utils/src/dump.rs | 2 +- plugins/bntl_utils/src/process.rs | 3 +- plugins/dwarf/dwarf_export/src/lib.rs | 2 +- .../dwarf/dwarf_import/src/dwarfdebuginfo.rs | 2 +- plugins/dwarf/dwarf_import/src/helpers.rs | 2 +- plugins/dwarf/dwarf_import/src/lib.rs | 2 +- plugins/dwarf/dwarfdump/src/lib.rs | 2 +- plugins/dwarf/shared/src/lib.rs | 2 +- plugins/idb_import/src/commands/load_file.rs | 2 +- plugins/idb_import/src/mapper.rs | 2 +- plugins/idb_import/src/types.rs | 2 +- plugins/pdb-ng/src/lib.rs | 19 +- plugins/pdb-ng/src/parser.rs | 2 +- plugins/pdb-ng/src/type_parser.rs | 1 - plugins/svd/src/lib.rs | 2 +- plugins/svd/src/mapper.rs | 2 +- plugins/svd/tests/mapper.rs | 1 - plugins/warp/benches/convert.rs | 1 - plugins/warp/benches/function.rs | 1 - plugins/warp/benches/guid.rs | 1 - plugins/warp/src/cache.rs | 2 +- plugins/warp/src/cache/function.rs | 1 - plugins/warp/src/cache/guid.rs | 1 - plugins/warp/src/convert/symbol.rs | 2 +- plugins/warp/src/convert/types.rs | 1 - plugins/warp/src/lib.rs | 2 +- plugins/warp/src/matcher.rs | 2 +- plugins/warp/src/plugin/load.rs | 2 +- plugins/warp/src/plugin/workflow.rs | 2 +- plugins/warp/src/processor.rs | 2 +- plugins/warp/tests/determinism.rs | 1 - plugins/warp/tests/matcher.rs | 2 +- .../src/activities/alloc_init.rs | 5 +- .../src/activities/objc_msg_send_calls.rs | 2 +- .../objc_msg_send_calls/adjust_call_type.rs | 2 +- .../activities/remove_memory_management.rs | 2 +- .../src/activities/super_init.rs | 2 +- plugins/workflow_objc/src/activities/util.rs | 2 +- .../src/metadata/global_state.rs | 7 +- .../workflow_objc/src/metadata/selector.rs | 2 +- rust/README.md | 2 - rust/examples/bndb_to_type_library.rs | 1 - rust/examples/decompile.rs | 2 +- rust/examples/disassemble.rs | 2 +- rust/examples/flowgraph.rs | 2 +- rust/examples/high_level_il.rs | 2 +- rust/examples/medium_level_il.rs | 2 +- rust/examples/simple.rs | 2 +- rust/examples/workflow.rs | 1 - rust/src/binary_view.rs | 1910 +++++++++++------ rust/src/binary_view/writer.rs | 2 +- rust/src/collaboration/file.rs | 2 +- rust/src/collaboration/project.rs | 2 +- rust/src/collaboration/snapshot.rs | 2 +- rust/src/collaboration/sync.rs | 4 +- rust/src/component.rs | 2 +- rust/src/custom_binary_view.rs | 961 --------- rust/src/debuginfo.rs | 1 - rust/src/ffi.rs | 1 - rust/src/file_metadata.rs | 5 +- rust/src/function.rs | 6 +- rust/src/lib.rs | 1 - rust/src/platform.rs | 2 +- rust/src/section.rs | 1 - rust/src/segment.rs | 4 +- rust/src/types.rs | 3 +- rust/src/types/library.rs | 10 +- rust/src/types/structure.rs | 9 +- rust/src/workflow.rs | 2 +- rust/tests/base_detection.rs | 1 - rust/tests/binary_reader.rs | 2 +- rust/tests/binary_view.rs | 77 +- rust/tests/binary_writer.rs | 2 +- rust/tests/collaboration.rs | 1 - rust/tests/component.rs | 1 - rust/tests/data_notification.rs | 2 +- rust/tests/data_renderer.rs | 2 +- rust/tests/debug_info.rs | 2 +- rust/tests/function.rs | 2 +- rust/tests/high_level_il.rs | 2 +- rust/tests/language_representation.rs | 2 +- rust/tests/low_level_il.rs | 1 - rust/tests/medium_level_il.rs | 1 - rust/tests/render_layer.rs | 1 - rust/tests/section.rs | 1 - rust/tests/type_container.rs | 2 +- rust/tests/type_library.rs | 1 - rust/tests/types.rs | 2 +- view/minidump/.gitignore | 2 - view/minidump/Cargo.toml | 5 +- view/minidump/README.md | 38 +- .../loaded-minidump-screenshot-border.png | Bin 266633 -> 0 bytes ...ump-binary-view-type-screenshot-border.png | Bin 31215 -> 0 bytes ...mp-segments-sections-screenshot-border.png | Bin 122117 -> 0 bytes view/minidump/src/command.rs | 40 - view/minidump/src/lib.rs | 29 +- view/minidump/src/view.rs | 605 +++--- 101 files changed, 1786 insertions(+), 2168 deletions(-) delete mode 100644 rust/src/custom_binary_view.rs delete mode 100644 view/minidump/.gitignore delete mode 100644 view/minidump/images/loaded-minidump-screenshot-border.png delete mode 100644 view/minidump/images/minidump-binary-view-type-screenshot-border.png delete mode 100644 view/minidump/images/minidump-segments-sections-screenshot-border.png delete mode 100644 view/minidump/src/command.rs diff --git a/Cargo.lock b/Cargo.lock index ed74c1416c..efe2bfe067 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -377,6 +377,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + [[package]] name = "cast" version = "0.3.0" @@ -1527,9 +1533,9 @@ dependencies = [ [[package]] name = "minidump" -version = "0.23.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24e8d3964f4a60ee45309dc76cfc3023588b0b62fcb79baa3e9134d4298c7ac" +checksum = "a902ca21d9772a66d3d1b050b3436dcadb192694be01409e0219902dcf4bc1e8" dependencies = [ "debugid", "encoding_rs", @@ -1537,9 +1543,10 @@ dependencies = [ "minidump-common", "num-traits", "procfs-core", + "prost", "range-map", "scroll 0.12.0", - "thiserror 1.0.69", + "thiserror 2.0.18", "time", "tracing", "uuid", @@ -1547,9 +1554,9 @@ dependencies = [ [[package]] name = "minidump-common" -version = "0.23.0" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c464c28d59ae40fd48a1da695e338910f19f71e1e585dd37261d81eaa3adbee" +checksum = "2e16d10087ae9e375bad7a40e8ef5504bc08e808ccc6019067ff9de42a84570f" dependencies = [ "bitflags 2.9.1", "debugid", @@ -1567,6 +1574,7 @@ dependencies = [ "binaryninja", "binaryninjacore-sys", "minidump", + "object 0.39.1", "tracing", ] @@ -1819,6 +1827,17 @@ dependencies = [ "ruzstd 0.7.3", ] +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "flate2", + "memchr", + "ruzstd 0.8.2", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -2045,6 +2064,29 @@ dependencies = [ "hex", ] +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "quote" version = "1.0.40" @@ -2337,7 +2379,7 @@ checksum = "58c4eb8a81997cf040a091d1f7e1938aeab6749d3a0dfa73af43cdc32393483d" dependencies = [ "byteorder", "derive_more", - "twox-hash", + "twox-hash 1.6.3", ] [[package]] @@ -2346,7 +2388,16 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" dependencies = [ - "twox-hash", + "twox-hash 1.6.3", +] + +[[package]] +name = "ruzstd" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" +dependencies = [ + "twox-hash 2.1.2", ] [[package]] @@ -2915,6 +2966,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "twox-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" + [[package]] name = "unicode-ident" version = "1.0.18" diff --git a/arch/msp430/src/lib.rs b/arch/msp430/src/lib.rs index 892e617dc5..0655cc853f 100644 --- a/arch/msp430/src/lib.rs +++ b/arch/msp430/src/lib.rs @@ -1,9 +1,6 @@ use binaryninja::{ - add_optional_plugin_dependency, - architecture::ArchitectureExt, - calling_convention, - custom_binary_view::{BinaryViewType, BinaryViewTypeExt}, - Endianness, + add_optional_plugin_dependency, architecture::ArchitectureExt, binary_view::BinaryViewType, + calling_convention, Endianness, }; mod architecture; @@ -45,7 +42,7 @@ pub extern "C" fn CorePluginInit() -> bool { arch.set_default_calling_convention(&default); - if let Ok(bvt) = BinaryViewType::by_name("ELF") { + if let Some(bvt) = BinaryViewType::by_name("ELF") { bvt.register_arch(105, Endianness::LittleEndian, arch); } diff --git a/arch/riscv/src/lib.rs b/arch/riscv/src/lib.rs index 2bc0427c30..3537a082f0 100644 --- a/arch/riscv/src/lib.rs +++ b/arch/riscv/src/lib.rs @@ -13,9 +13,8 @@ use binaryninja::{ ImplicitRegisterExtend, InstructionInfo, Register as Reg, RegisterInfo, UnusedFlag, UnusedRegisterStack, }, - binary_view::{BinaryView, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewType}, calling_convention::{register_calling_convention, CallingConvention, ConventionBuilder}, - custom_binary_view::{BinaryViewType, BinaryViewTypeExt}, disassembly::{InstructionTextToken, InstructionTextTokenKind}, function::Function, function_recognizer::FunctionRecognizer, @@ -3101,7 +3100,7 @@ pub extern "C" fn CorePluginInit() -> bool { ); arch64.set_default_calling_convention(&cc64); - if let Ok(bvt) = BinaryViewType::by_name("ELF") { + if let Some(bvt) = BinaryViewType::by_name("ELF") { bvt.register_arch( (1 << 16) | 243, binaryninja::Endianness::LittleEndian, diff --git a/plugins/bntl_utils/src/command/create.rs b/plugins/bntl_utils/src/command/create.rs index 96d0eb6068..8fc37159e6 100644 --- a/plugins/bntl_utils/src/command/create.rs +++ b/plugins/bntl_utils/src/command/create.rs @@ -2,7 +2,7 @@ use crate::command::{InputDirectoryField, OutputDirectoryField}; use crate::process::{new_processing_state_background_thread, TypeLibProcessor}; use crate::validate::TypeLibValidater; use binaryninja::background_task::BackgroundTask; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::command::{Command, GlobalCommand, ProjectCommand}; use binaryninja::interaction::{Form, FormInputField, MessageBoxButtonSet, MessageBoxIcon}; use binaryninja::platform::Platform; diff --git a/plugins/bntl_utils/src/dump.rs b/plugins/bntl_utils/src/dump.rs index c2e9249844..d86500c017 100644 --- a/plugins/bntl_utils/src/dump.rs +++ b/plugins/bntl_utils/src/dump.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::file_metadata::FileMetadata; use binaryninja::metadata::{Metadata, MetadataType}; use binaryninja::platform::Platform; diff --git a/plugins/bntl_utils/src/process.rs b/plugins/bntl_utils/src/process.rs index 3f4aec696d..5c9651a473 100644 --- a/plugins/bntl_utils/src/process.rs +++ b/plugins/bntl_utils/src/process.rs @@ -20,8 +20,7 @@ use crate::schema::BntlSchema; use crate::tbd::{parse_tbd_info, TbdArchitecture}; use crate::winmd::WindowsMetadataImporter; use binaryninja::background_task::BackgroundTask; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; -use binaryninja::custom_binary_view::BinaryViewType; +use binaryninja::binary_view::{BinaryView, BinaryViewType}; use binaryninja::file_metadata::FileMetadata; use binaryninja::metadata::Metadata; use binaryninja::platform::Platform; diff --git a/plugins/dwarf/dwarf_export/src/lib.rs b/plugins/dwarf/dwarf_export/src/lib.rs index fac7b2bb99..90a92faacc 100644 --- a/plugins/dwarf/dwarf_export/src/lib.rs +++ b/plugins/dwarf/dwarf_export/src/lib.rs @@ -2,7 +2,7 @@ mod edit_distance; use binaryninja::interaction::form::{Form, FormInputField}; use binaryninja::{ - binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewBase}, command::{register_command, Command}, confidence::Conf, rc::Ref, diff --git a/plugins/dwarf/dwarf_import/src/dwarfdebuginfo.rs b/plugins/dwarf/dwarf_import/src/dwarfdebuginfo.rs index fbf7e7dfad..6c1d78a8ac 100644 --- a/plugins/dwarf/dwarf_import/src/dwarfdebuginfo.rs +++ b/plugins/dwarf/dwarf_import/src/dwarfdebuginfo.rs @@ -19,7 +19,7 @@ use crate::{ }; use binaryninja::{ - binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewBase}, debuginfo::{DebugFunctionInfo, DebugInfo}, platform::Platform, rc::*, diff --git a/plugins/dwarf/dwarf_import/src/helpers.rs b/plugins/dwarf/dwarf_import/src/helpers.rs index 541fdc4249..0a8a2cbdad 100644 --- a/plugins/dwarf/dwarf_import/src/helpers.rs +++ b/plugins/dwarf/dwarf_import/src/helpers.rs @@ -19,7 +19,7 @@ use crate::{DebugInfoBuilderContext, ReaderType}; use binaryninja::binary_view::BinaryViewBase; use binaryninja::Endianness; use binaryninja::{ - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, download::{DownloadInstanceInputOutputCallbacks, DownloadProvider}, settings::Settings, }; diff --git a/plugins/dwarf/dwarf_import/src/lib.rs b/plugins/dwarf/dwarf_import/src/lib.rs index 1ed3ce198e..a9e4bbd80b 100644 --- a/plugins/dwarf/dwarf_import/src/lib.rs +++ b/plugins/dwarf/dwarf_import/src/lib.rs @@ -30,7 +30,7 @@ use crate::types::parse_variable; use binaryninja::binary_view::BinaryViewBase; use binaryninja::{ - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, debuginfo::{CustomDebugInfoParser, DebugInfo, DebugInfoParser}, settings::Settings, template_simplifier::simplify_str_to_str, diff --git a/plugins/dwarf/dwarfdump/src/lib.rs b/plugins/dwarf/dwarfdump/src/lib.rs index a235de4f83..aafe1f1834 100644 --- a/plugins/dwarf/dwarfdump/src/lib.rs +++ b/plugins/dwarf/dwarfdump/src/lib.rs @@ -14,7 +14,7 @@ use binaryninja::{ architecture::BranchType, - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, command::{register_command, Command}, disassembly::{DisassemblyTextLine, InstructionTextToken, InstructionTextTokenKind}, flowgraph::{EdgeStyle, FlowGraph, FlowGraphNode, FlowGraphOption}, diff --git a/plugins/dwarf/shared/src/lib.rs b/plugins/dwarf/shared/src/lib.rs index a9dc8b7ced..d453193845 100644 --- a/plugins/dwarf/shared/src/lib.rs +++ b/plugins/dwarf/shared/src/lib.rs @@ -16,7 +16,7 @@ use gimli::{EndianRcSlice, Endianity, RunTimeEndian, SectionId}; use object::{Object, ObjectSection}; use binaryninja::{ - binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewBase}, settings::Settings, Endianness, }; diff --git a/plugins/idb_import/src/commands/load_file.rs b/plugins/idb_import/src/commands/load_file.rs index 67416e613e..ef773c6a70 100644 --- a/plugins/idb_import/src/commands/load_file.rs +++ b/plugins/idb_import/src/commands/load_file.rs @@ -1,7 +1,7 @@ use crate::commands::LoadFileField; use crate::mapper::IDBMapper; use crate::parse::IDBFileParser; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::command::Command; use binaryninja::interaction::Form; use std::fs::File; diff --git a/plugins/idb_import/src/mapper.rs b/plugins/idb_import/src/mapper.rs index 36c980dade..530fef1f06 100644 --- a/plugins/idb_import/src/mapper.rs +++ b/plugins/idb_import/src/mapper.rs @@ -6,7 +6,7 @@ use crate::parse::{ }; use crate::translate::TILTranslator; use binaryninja::architecture::Architecture; -use binaryninja::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; use binaryninja::qualified_name::QualifiedName; use binaryninja::rc::Ref; use binaryninja::section::{SectionBuilder, Semantics}; diff --git a/plugins/idb_import/src/types.rs b/plugins/idb_import/src/types.rs index 933fec126f..cbd37f66c8 100644 --- a/plugins/idb_import/src/types.rs +++ b/plugins/idb_import/src/types.rs @@ -3,7 +3,7 @@ use std::num::{NonZeroU16, NonZeroU8}; use anyhow::{anyhow, Result}; use binaryninja::architecture::{Architecture, ArchitectureExt, CoreArchitecture}; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView}; use binaryninja::calling_convention::CoreCallingConvention; use binaryninja::confidence::Conf; use binaryninja::rc::Ref; diff --git a/plugins/pdb-ng/src/lib.rs b/plugins/pdb-ng/src/lib.rs index d6678a17cf..c3bbdf5ed0 100644 --- a/plugins/pdb-ng/src/lib.rs +++ b/plugins/pdb-ng/src/lib.rs @@ -23,7 +23,7 @@ use std::{env, fs}; use anyhow::{anyhow, Result}; use pdb::PDB; -use binaryninja::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; use binaryninja::debuginfo::{CustomDebugInfoParser, DebugInfo, DebugInfoParser}; use binaryninja::download::{DownloadInstanceInputOutputCallbacks, DownloadProvider}; use binaryninja::interaction::{MessageBoxButtonResult, MessageBoxButtonSet}; @@ -275,23 +275,14 @@ fn search_sym_store( fn parse_pdb_info(view: &BinaryView) -> Option { match view.get_metadata::("DEBUG_INFO_TYPE") { - Some(Ok(0x53445352 /* 'SDSR' */)) => {} + Some(0x53445352 /* 'SDSR' */) => {} _ => return None, } // This is stored in the BV by the PE loader - let file_path = match view.get_metadata::("PDB_FILENAME") { - Some(Ok(md)) => md, - _ => return None, - }; - let mut guid = match view.get_metadata::>("PDB_GUID") { - Some(Ok(md)) => md, - _ => return None, - }; - let age = match view.get_metadata::("PDB_AGE") { - Some(Ok(md)) => md as u32, - _ => return None, - }; + let file_path = view.get_metadata::("PDB_FILENAME")?; + let mut guid = view.get_metadata::>("PDB_GUID")?; + let age = view.get_metadata::("PDB_AGE")? as u32; if guid.len() != 16 { return None; diff --git a/plugins/pdb-ng/src/parser.rs b/plugins/pdb-ng/src/parser.rs index 9db635e8d7..8c33fe6469 100644 --- a/plugins/pdb-ng/src/parser.rs +++ b/plugins/pdb-ng/src/parser.rs @@ -23,7 +23,7 @@ use pdb::*; use crate::symbol_parser::{ParsedDataSymbol, ParsedProcedure, ParsedSymbol}; use crate::type_parser::ParsedType; use binaryninja::architecture::{Architecture, CoreArchitecture}; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::calling_convention::CoreCallingConvention; use binaryninja::confidence::{Conf, MIN_CONFIDENCE}; use binaryninja::debuginfo::{DebugFunctionInfo, DebugInfo}; diff --git a/plugins/pdb-ng/src/type_parser.rs b/plugins/pdb-ng/src/type_parser.rs index 026a421aff..bccb93f120 100644 --- a/plugins/pdb-ng/src/type_parser.rs +++ b/plugins/pdb-ng/src/type_parser.rs @@ -19,7 +19,6 @@ use crate::struct_grouper::group_structure; use crate::PDBParserInstance; use anyhow::{anyhow, Result}; use binaryninja::architecture::Architecture; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::calling_convention::CoreCallingConvention; use binaryninja::confidence::{Conf, MAX_CONFIDENCE}; use binaryninja::platform::Platform; diff --git a/plugins/svd/src/lib.rs b/plugins/svd/src/lib.rs index 1eb84a5f1c..ea37b783d1 100644 --- a/plugins/svd/src/lib.rs +++ b/plugins/svd/src/lib.rs @@ -3,7 +3,7 @@ pub mod settings; use crate::mapper::DeviceMapper; use crate::settings::LoadSettings; -use binaryninja::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; use binaryninja::command::Command; use binaryninja::interaction::{Form, FormInputField}; use binaryninja::workflow::{activity, Activity, AnalysisContext, Workflow}; diff --git a/plugins/svd/src/mapper.rs b/plugins/svd/src/mapper.rs index 1ba7f61c34..4ec02b9e4c 100644 --- a/plugins/svd/src/mapper.rs +++ b/plugins/svd/src/mapper.rs @@ -1,5 +1,5 @@ use crate::settings::LoadSettings; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::confidence::{Conf, MAX_CONFIDENCE}; use binaryninja::data_buffer::DataBuffer; use binaryninja::rc::Ref; diff --git a/plugins/svd/tests/mapper.rs b/plugins/svd/tests/mapper.rs index 8af8c2618e..845bfd613b 100644 --- a/plugins/svd/tests/mapper.rs +++ b/plugins/svd/tests/mapper.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::binary_view::{BinaryView, BinaryViewBase}; use binaryninja::file_metadata::FileMetadata; use binaryninja::headless::Session; diff --git a/plugins/warp/benches/convert.rs b/plugins/warp/benches/convert.rs index e0acdc15e5..d1bf9dd694 100644 --- a/plugins/warp/benches/convert.rs +++ b/plugins/warp/benches/convert.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use criterion::{criterion_group, criterion_main, Criterion}; use std::path::PathBuf; diff --git a/plugins/warp/benches/function.rs b/plugins/warp/benches/function.rs index 299ed1eb2c..a9cfd26a54 100644 --- a/plugins/warp/benches/function.rs +++ b/plugins/warp/benches/function.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use criterion::{criterion_group, criterion_main, Criterion}; use rayon::prelude::*; diff --git a/plugins/warp/benches/guid.rs b/plugins/warp/benches/guid.rs index eddf2f0616..f8c7f4b5cc 100644 --- a/plugins/warp/benches/guid.rs +++ b/plugins/warp/benches/guid.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use criterion::{criterion_group, criterion_main, Criterion}; use std::path::PathBuf; diff --git a/plugins/warp/src/cache.rs b/plugins/warp/src/cache.rs index d9a5a8d1a0..5b3469c1c1 100644 --- a/plugins/warp/src/cache.rs +++ b/plugins/warp/src/cache.rs @@ -7,7 +7,7 @@ pub use function::*; pub use guid::*; pub use type_reference::*; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::function::Function as BNFunction; use binaryninja::object_destructor::{register_object_destructor, ObjectDestructor}; use binaryninja::rc::Guard; diff --git a/plugins/warp/src/cache/function.rs b/plugins/warp/src/cache/function.rs index 79b9e86ae6..d7eae3affb 100644 --- a/plugins/warp/src/cache/function.rs +++ b/plugins/warp/src/cache/function.rs @@ -1,5 +1,4 @@ use crate::convert::{comment_to_bn_comment, to_bn_symbol_at_address}; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::function::{Function as BNFunction, FunctionUpdateType}; use binaryninja::symbol::SymbolType; use warp::signature::function::Function; diff --git a/plugins/warp/src/cache/guid.rs b/plugins/warp/src/cache/guid.rs index ede54013a7..3b3e4a319c 100644 --- a/plugins/warp/src/cache/guid.rs +++ b/plugins/warp/src/cache/guid.rs @@ -1,7 +1,6 @@ use crate::cache::FunctionID; use crate::convert::from_bn_symbol; use crate::function_guid; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::function::Function as BNFunction; use binaryninja::low_level_il::function::{FunctionMutability, LowLevelILFunction, NonSSA}; use binaryninja::rc::Ref as BNRef; diff --git a/plugins/warp/src/convert/symbol.rs b/plugins/warp/src/convert/symbol.rs index 0107cff58d..5d794d30f8 100644 --- a/plugins/warp/src/convert/symbol.rs +++ b/plugins/warp/src/convert/symbol.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::rc::Ref as BNRef; use binaryninja::symbol::Symbol as BNSymbol; use binaryninja::symbol::SymbolType as BNSymbolType; diff --git a/plugins/warp/src/convert/types.rs b/plugins/warp/src/convert/types.rs index abfa3bc97c..6969ac677a 100644 --- a/plugins/warp/src/convert/types.rs +++ b/plugins/warp/src/convert/types.rs @@ -490,7 +490,6 @@ pub fn to_bn_type(arch: Option, ty: &Type) -> BNRef #[cfg(test)] mod tests { use super::*; - use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use std::path::PathBuf; use warp::r#type::guid::TypeGUID; diff --git a/plugins/warp/src/lib.rs b/plugins/warp/src/lib.rs index e0aaeed346..11f85566ed 100644 --- a/plugins/warp/src/lib.rs +++ b/plugins/warp/src/lib.rs @@ -4,7 +4,7 @@ use binaryninja::architecture::{ Architecture, ImplicitRegisterExtend, Register as BNRegister, RegisterInfo, }; use binaryninja::basic_block::BasicBlock as BNBasicBlock; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::confidence::MAX_CONFIDENCE; use binaryninja::function::{Function as BNFunction, NativeBlock}; use binaryninja::low_level_il::expression::{ diff --git a/plugins/warp/src/matcher.rs b/plugins/warp/src/matcher.rs index f96128e5a5..69bfd4b6aa 100644 --- a/plugins/warp/src/matcher.rs +++ b/plugins/warp/src/matcher.rs @@ -2,7 +2,7 @@ use crate::cache::cached_constraints; use crate::container::{Container, SourceId}; use crate::convert::to_bn_type; use binaryninja::architecture::Architecture as BNArchitecture; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::function::Function as BNFunction; use binaryninja::settings::{QueryOptions, Settings as BNSettings}; use serde_json::json; diff --git a/plugins/warp/src/plugin/load.rs b/plugins/warp/src/plugin/load.rs index 2be473d8d9..9ec6eaed16 100644 --- a/plugins/warp/src/plugin/load.rs +++ b/plugins/warp/src/plugin/load.rs @@ -3,7 +3,7 @@ use crate::container::disk::{DiskContainer, DiskContainerSource}; use crate::container::{ContainerError, SourcePath}; use crate::convert::platform_to_target; use crate::plugin::workflow::run_matcher; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::command::Command; use binaryninja::interaction::{ show_message_box, Form, FormInputField, MessageBoxButtonResult, MessageBoxButtonSet, diff --git a/plugins/warp/src/plugin/workflow.rs b/plugins/warp/src/plugin/workflow.rs index c1728b5e51..c2915717cd 100644 --- a/plugins/warp/src/plugin/workflow.rs +++ b/plugins/warp/src/plugin/workflow.rs @@ -10,7 +10,7 @@ use crate::plugin::settings::PluginSettings; use crate::{get_warp_ignore_tag_type, get_warp_tag_type, relocatable_regions, IGNORE_TAG_NAME}; use binaryninja::architecture::RegisterId; use binaryninja::background_task::BackgroundTask; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::command::Command; use binaryninja::function::Function as BNFunction; use binaryninja::rc::Ref as BNRef; diff --git a/plugins/warp/src/processor.rs b/plugins/warp/src/processor.rs index 32310d3c25..666f8df32b 100644 --- a/plugins/warp/src/processor.rs +++ b/plugins/warp/src/processor.rs @@ -19,7 +19,7 @@ use thiserror::Error; use walkdir::WalkDir; use binaryninja::background_task::BackgroundTask; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::function::Function as BNFunction; use binaryninja::project::file::ProjectFile; use binaryninja::project::Project; diff --git a/plugins/warp/tests/determinism.rs b/plugins/warp/tests/determinism.rs index 5100b43608..50361562a9 100644 --- a/plugins/warp/tests/determinism.rs +++ b/plugins/warp/tests/determinism.rs @@ -1,5 +1,4 @@ //! This tests to make sure the function GUIDs are stable. -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use std::collections::BTreeMap; use std::path::PathBuf; diff --git a/plugins/warp/tests/matcher.rs b/plugins/warp/tests/matcher.rs index d2d7a96013..5703419bd4 100644 --- a/plugins/warp/tests/matcher.rs +++ b/plugins/warp/tests/matcher.rs @@ -1,5 +1,5 @@ use binaryninja::architecture::CoreArchitecture; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::file_metadata::FileMetadata; use binaryninja::function::Function as BNFunction; use binaryninja::headless::Session; diff --git a/plugins/workflow_objc/src/activities/alloc_init.rs b/plugins/workflow_objc/src/activities/alloc_init.rs index 5c8bf0645c..953e07386c 100644 --- a/plugins/workflow_objc/src/activities/alloc_init.rs +++ b/plugins/workflow_objc/src/activities/alloc_init.rs @@ -1,8 +1,5 @@ use binaryninja::{ - binary_view::{BinaryView, BinaryViewExt as _}, - medium_level_il::MediumLevelILLiftedInstruction, - rc::Ref, - types::Type, + binary_view::BinaryView, medium_level_il::MediumLevelILLiftedInstruction, rc::Ref, types::Type, workflow::AnalysisContext, }; use bstr::ByteSlice; diff --git a/plugins/workflow_objc/src/activities/objc_msg_send_calls.rs b/plugins/workflow_objc/src/activities/objc_msg_send_calls.rs index 157bb19c12..41fc38c065 100644 --- a/plugins/workflow_objc/src/activities/objc_msg_send_calls.rs +++ b/plugins/workflow_objc/src/activities/objc_msg_send_calls.rs @@ -1,5 +1,5 @@ use binaryninja::{ - binary_view::{BinaryView, BinaryViewExt as _}, + binary_view::BinaryView, function::Function, low_level_il::{ expression::{ExpressionHandler as _, LowLevelILExpressionKind}, diff --git a/plugins/workflow_objc/src/activities/objc_msg_send_calls/adjust_call_type.rs b/plugins/workflow_objc/src/activities/objc_msg_send_calls/adjust_call_type.rs index 07e83ba7d6..4d22476a48 100644 --- a/plugins/workflow_objc/src/activities/objc_msg_send_calls/adjust_call_type.rs +++ b/plugins/workflow_objc/src/activities/objc_msg_send_calls/adjust_call_type.rs @@ -1,6 +1,6 @@ use binaryninja::{ architecture::CoreRegister, - binary_view::{BinaryView, BinaryViewBase as _, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewBase as _}, confidence::Conf, function::Function, low_level_il::{ diff --git a/plugins/workflow_objc/src/activities/remove_memory_management.rs b/plugins/workflow_objc/src/activities/remove_memory_management.rs index cd613ee2bf..a6389d227a 100644 --- a/plugins/workflow_objc/src/activities/remove_memory_management.rs +++ b/plugins/workflow_objc/src/activities/remove_memory_management.rs @@ -1,6 +1,6 @@ use binaryninja::{ architecture::{Architecture as _, CoreRegister, Register as _, RegisterInfo as _}, - binary_view::{BinaryView, BinaryViewExt as _}, + binary_view::BinaryView, low_level_il::{ expression::{ExpressionHandler, LowLevelILExpressionKind}, function::{LowLevelILFunction, Mutable, NonSSA}, diff --git a/plugins/workflow_objc/src/activities/super_init.rs b/plugins/workflow_objc/src/activities/super_init.rs index 7b6bb3f71c..533fe9e6a7 100644 --- a/plugins/workflow_objc/src/activities/super_init.rs +++ b/plugins/workflow_objc/src/activities/super_init.rs @@ -1,5 +1,5 @@ use binaryninja::{ - binary_view::{BinaryView, BinaryViewBase as _, BinaryViewExt as _}, + binary_view::{BinaryView, BinaryViewBase as _}, medium_level_il::{ operation::{Constant, LiftedSetVarSsa, LiftedSetVarSsaField, Var, VarSsa}, MediumLevelILLiftedInstruction, MediumLevelILLiftedInstructionKind, diff --git a/plugins/workflow_objc/src/activities/util.rs b/plugins/workflow_objc/src/activities/util.rs index 3ac7df7c1d..d9acf29ff5 100644 --- a/plugins/workflow_objc/src/activities/util.rs +++ b/plugins/workflow_objc/src/activities/util.rs @@ -1,5 +1,5 @@ use binaryninja::{ - binary_view::{BinaryView, BinaryViewExt as _}, + binary_view::BinaryView, confidence::Conf, function::Function, medium_level_il::{ diff --git a/plugins/workflow_objc/src/metadata/global_state.rs b/plugins/workflow_objc/src/metadata/global_state.rs index 6c128e22b5..a36931403e 100644 --- a/plugins/workflow_objc/src/metadata/global_state.rs +++ b/plugins/workflow_objc/src/metadata/global_state.rs @@ -1,7 +1,7 @@ use binaryninja::file_metadata::SessionId; use binaryninja::object_destructor::register_object_destructor; use binaryninja::{ - binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}, + binary_view::{BinaryView, BinaryViewBase}, file_metadata::FileMetadata, metadata::Metadata, object_destructor::ObjectDestructor, @@ -155,10 +155,7 @@ impl AnalysisInfo { } fn load_selector_impls(&self, bv: &BinaryView) -> Option { - let Some(Ok(meta)) = bv.get_metadata::>>("Objective-C") - else { - return None; - }; + let meta = bv.get_metadata::>>("Objective-C")?; let version_meta = meta.get("version")?; if version_meta.get_unsigned_integer()? != 1 { tracing::error!( diff --git a/plugins/workflow_objc/src/metadata/selector.rs b/plugins/workflow_objc/src/metadata/selector.rs index de2e883ee7..aa51d8e902 100644 --- a/plugins/workflow_objc/src/metadata/selector.rs +++ b/plugins/workflow_objc/src/metadata/selector.rs @@ -1,5 +1,5 @@ use crate::Error; -use binaryninja::binary_view::{BinaryView, BinaryViewBase as _, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase as _}; pub struct Selector { pub name: String, diff --git a/rust/README.md b/rust/README.md index 55dccdff65..bed6065e94 100644 --- a/rust/README.md +++ b/rust/README.md @@ -21,7 +21,6 @@ If you are worried about breaking changes, avoid modules with warnings about ins ```rust use binaryninja::headless::Session; -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; fn main() { let headless_session = Session::new().expect("Failed to initialize session"); @@ -30,7 +29,6 @@ fn main() { .expect("Couldn't open `/bin/cat`"); println!("File: `{}`", bv.file()); - println!("File size: `{:#x}`", bv.len()); println!("Function count: {}", bv.functions().len()); for func in &bv.functions() { diff --git a/rust/examples/bndb_to_type_library.rs b/rust/examples/bndb_to_type_library.rs index 2cfaf83ef3..b733dde025 100644 --- a/rust/examples/bndb_to_type_library.rs +++ b/rust/examples/bndb_to_type_library.rs @@ -1,6 +1,5 @@ // Usage: cargo run --example bndb_to_type_library -use binaryninja::binary_view::BinaryViewExt; use binaryninja::tracing::TracingLogListener; use binaryninja::types::{QualifiedName, TypeLibrary}; use tracing_indicatif::span_ext::IndicatifSpanExt; diff --git a/rust/examples/decompile.rs b/rust/examples/decompile.rs index 155de81cbf..30465a05fe 100644 --- a/rust/examples/decompile.rs +++ b/rust/examples/decompile.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; use binaryninja::disassembly::{DisassemblyOption, DisassemblySettings}; use binaryninja::function::Function; use binaryninja::linear_view::LinearViewObject; diff --git a/rust/examples/disassemble.rs b/rust/examples/disassemble.rs index df33aadec4..245f24d7d6 100644 --- a/rust/examples/disassemble.rs +++ b/rust/examples/disassemble.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::BinaryViewBase; use binaryninja::disassembly::{DisassemblyOption, DisassemblySettings, DisassemblyTextRenderer}; use binaryninja::function::Function; use binaryninja::tracing::TracingLogListener; diff --git a/rust/examples/flowgraph.rs b/rust/examples/flowgraph.rs index cb03234e73..30307c3ffa 100644 --- a/rust/examples/flowgraph.rs +++ b/rust/examples/flowgraph.rs @@ -9,7 +9,7 @@ use binaryninja::interaction::{MessageBoxButtonResult, MessageBoxButtonSet, Mess use binaryninja::tracing::TracingLogListener; use binaryninja::{ architecture::BranchType, - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, disassembly::{DisassemblyTextLine, InstructionTextToken, InstructionTextTokenKind}, flowgraph::{EdgePenStyle, FlowGraph, ThemeColor}, }; diff --git a/rust/examples/high_level_il.rs b/rust/examples/high_level_il.rs index 57b735e963..28081a762a 100644 --- a/rust/examples/high_level_il.rs +++ b/rust/examples/high_level_il.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::BinaryViewBase; use binaryninja::tracing::TracingLogListener; fn main() { diff --git a/rust/examples/medium_level_il.rs b/rust/examples/medium_level_il.rs index e2c0edee5f..4e9cac8375 100644 --- a/rust/examples/medium_level_il.rs +++ b/rust/examples/medium_level_il.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::BinaryViewBase; use binaryninja::tracing::TracingLogListener; fn main() { diff --git a/rust/examples/simple.rs b/rust/examples/simple.rs index c01ef74e58..5f063edec4 100644 --- a/rust/examples/simple.rs +++ b/rust/examples/simple.rs @@ -1,5 +1,5 @@ use binaryninja::architecture::Architecture; -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::BinaryViewBase; use binaryninja::tracing::TracingLogListener; fn main() { diff --git a/rust/examples/workflow.rs b/rust/examples/workflow.rs index bfbbbdb250..a827b0a2c0 100644 --- a/rust/examples/workflow.rs +++ b/rust/examples/workflow.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::low_level_il::expression::{ExpressionHandler, LowLevelILExpressionKind}; use binaryninja::low_level_il::instruction::InstructionHandler; use binaryninja::low_level_il::VisitorAction; diff --git a/rust/src/binary_view.rs b/rust/src/binary_view.rs index b65367a2dd..6025f1e8d6 100644 --- a/rust/src/binary_view.rs +++ b/rust/src/binary_view.rs @@ -13,6 +13,8 @@ // limitations under the License. //! A view on binary data and queryable interface of a binary files analysis. +//! +//! The main analysis object is [`BinaryView`], and custom implementations can be implemented with [`CustomBinaryView`]. use binaryninjacore_sys::*; @@ -57,11 +59,11 @@ use crate::workflow::Workflow; use crate::{Endianness, BN_FULL_CONFIDENCE}; use std::collections::{BTreeMap, HashMap}; use std::ffi::{c_char, c_void, CString}; -use std::fmt::{Display, Formatter}; +use std::fmt::{Debug, Display, Formatter}; +use std::mem::MaybeUninit; use std::ops::Range; use std::path::{Path, PathBuf}; use std::ptr::NonNull; -use std::{result, slice}; pub mod memory_map; pub mod reader; @@ -72,15 +74,377 @@ pub use memory_map::{MemoryMap, MemoryRegionInfo, ResolvedRange}; pub use reader::BinaryReader; pub use writer::BinaryWriter; -pub type Result = result::Result; pub type BinaryViewEventType = BNBinaryViewEventType; pub type AnalysisState = BNAnalysisState; pub type ModificationStatus = BNModificationStatus; pub type StringType = BNStringType; pub type FindFlag = BNFindFlag; +/// Registers a new binary view type. +pub fn register_binary_view_type(view_type: T) -> (&'static T, BinaryViewType) +where + T: CustomBinaryViewType, +{ + let name = T::NAME.to_cstr(); + let long_name = T::LONG_NAME.to_cstr(); + let leaked_type = Box::leak(Box::new(view_type)); + + let result = unsafe { + BNRegisterBinaryViewType( + name.as_ref().as_ptr() as *const _, + long_name.as_ref().as_ptr() as *const _, + &mut BNCustomBinaryViewType { + context: leaked_type as *mut _ as *mut std::os::raw::c_void, + create: Some(cb_create::), + parse: Some(cb_parse::), + isValidForData: Some(cb_valid::), + isDeprecated: Some(cb_deprecated::), + isForceLoadable: Some(cb_force_loadable::), + getLoadSettingsForData: Some(cb_load_settings::), + hasNoInitialContent: Some(cb_has_no_initial_content::), + }, + ) + }; + + assert!( + !result.is_null(), + "BNRegisterBinaryViewType always returns a non-null handle" + ); + let core_view_type = unsafe { BinaryViewType::from_raw(result) }; + (leaked_type, core_view_type) +} + +/// Interface for creating custom binary views of a given type, analogous to [`BinaryViewType`]. +pub trait CustomBinaryViewType: 'static + Sync { + /// The associated [`BinaryViewBase`] for which this type creates with [`CustomBinaryViewType::create_binary_view`]. + type CustomBinaryView: CustomBinaryView; + + /// The name of the binary view type. + const NAME: &'static str; + + /// The longer name of the binary view type, defaults to [`CustomBinaryViewType::NAME`]. + const LONG_NAME: &'static str = Self::NAME; + + /// Is this [`CustomBinaryViewType`] deprecated and should not be used? + /// + /// We specify this such that the view type may still be used by existing databases, but not + /// newly created views. + const DEPRECATED: bool = false; + + /// Is this [`CustomBinaryViewType`] able to be loaded forcefully? + /// + /// If so, it will be shown in the drop-down when a user opens a file with options. + const FORCE_LOADABLE: bool = false; + + /// Do instances of this [`CustomBinaryViewType`] start with no loaded content? + /// + /// When true, the view has no meaningful default state: the user must make a + /// selection (e.g. load images from a shared cache) before any content exists. + /// + /// Callers can use this to suppress restoring the previously saved view state for + /// files not being loaded from a database, since a saved layout would reference + /// content that isn't available on reopening. + const HAS_NO_INITIAL_CONTENT: bool = false; + + /// Constructs the custom binary view instance. + fn create_binary_view(&self, data: &BinaryView) -> Result; + + /// Constructs the custom binary view instance to be used for configuration. + /// + /// This is the path that is used when opening a binary with "Open With Options", and is what populates + /// the sections and segments of the dialog along with settings like the image base (start) address. + /// + /// The default implementation for this will construct a new instance identical to that of [`CustomBinaryViewType::create_binary_view`]. + /// + /// Overriding this is encouraged as you can skip actually applying data to the view such as functions, + /// symbols, and other data not required for configuration, especially because this binary view is created + /// only temporarily and will be discarded after configuration is complete. + fn create_binary_view_for_parse( + &self, + data: &BinaryView, + ) -> Result { + self.create_binary_view(data) + } + + /// Is this [`BinaryViewType`] valid for the given the raw [`BinaryView`]? + /// + /// Typical implementations will read the magic bytes (e.g. 'MZ'), this is a performance-sensitive + /// path so prefer inexpensive checks rather than comprehensive ones. + fn is_valid_for(&self, data: &BinaryView) -> bool; + + fn load_settings_for_data(&self, _data: &BinaryView) -> Ref { + Settings::new() + } +} + +/// A [`BinaryViewType`] acts as a factory for [`BinaryView`] objects. +/// +/// Each file format will have its own type, such as PE, ELF, or Mach-O. +/// +/// Custom view types can be implemented using [`CustomBinaryViewType`]. +#[derive(Copy, Clone, PartialEq, Eq, Hash)] +pub struct BinaryViewType { + pub handle: *mut BNBinaryViewType, +} + +impl BinaryViewType { + pub(crate) unsafe fn from_raw(handle: *mut BNBinaryViewType) -> Self { + debug_assert!(!handle.is_null()); + Self { handle } + } + + pub fn list_all() -> Array { + unsafe { + let mut count: usize = 0; + let types = BNGetBinaryViewTypes(&mut count as *mut _); + Array::new(types, count, ()) + } + } + + /// Enumerates all view types and checks to see if the given raw [`BinaryView`] is valid, + /// returning only those that are. + pub fn valid_types_for_data(data: &BinaryView) -> Array { + unsafe { + let mut count: usize = 0; + let types = BNGetBinaryViewTypesForData(data.handle, &mut count as *mut _); + Array::new(types, count, ()) + } + } + + /// Looks up a binary view type by its name (_not_ the long name). + pub fn by_name(name: &str) -> Option { + let bytes = name.to_cstr(); + let handle = unsafe { BNGetBinaryViewTypeByName(bytes.as_ref().as_ptr() as *const _) }; + if handle.is_null() { + None + } else { + Some(unsafe { BinaryViewType::from_raw(handle) }) + } + } + + /// The given name for the binary view type. + pub fn name(&self) -> String { + unsafe { BnString::into_string(BNGetBinaryViewTypeName(self.handle)) } + } + + /// The given long name for the binary view type. + pub fn long_name(&self) -> String { + unsafe { BnString::into_string(BNGetBinaryViewTypeLongName(self.handle)) } + } + + /// Register an architecture for selection via the `id` and `endianness`. + /// + /// If you need to peak at the [`BinaryView`] to determine the architecture, use [`BinaryViewType::register_platform_recognizer`] + /// instead of this. + pub fn register_arch(&self, id: u32, endianness: Endianness, arch: &A) { + unsafe { + BNRegisterArchitectureForViewType(self.handle, id, endianness, arch.as_ref().handle); + } + } + + /// Register a platform for selection via the `id`. + /// + /// If you need to peak at the [`BinaryView`] to determine the platform, use [`BinaryViewType::register_platform_recognizer`] + /// instead of this. + pub fn register_platform(&self, id: u32, plat: &Platform) { + let arch = plat.arch(); + unsafe { + BNRegisterPlatformForViewType(self.handle, id, arch.handle, plat.handle); + } + } + + /// Expanded identification of [`Platform`] for [`BinaryViewType`]'s. Supersedes [`BinaryViewType::register_arch`] + /// and [`BinaryViewType::register_platform`], as these have certain edge cases (overloaded elf families, for example) + /// that can't be represented. + /// + /// The callback returns a [`Platform`] object or `None` (failure), and most recently added callbacks are called first + /// to allow plugins to override any default behaviors. When a callback returns a platform, architecture will be + /// derived from the identified platform. + /// + /// The [`BinaryView`] is the *parent* view (usually 'Raw') that the [`BinaryView`] is being created for. This + /// means that generally speaking, the callbacks need to be aware of the underlying file format. However, the + /// [`BinaryView`] implementation may have created data variables in the 'Raw' view by the time the callback is invoked. + /// Behavior regarding when this callback is invoked and what has been made available in the [`BinaryView`] passed as an + /// argument to the callback is up to the discretion of the [`BinaryView`] implementation. + /// + /// The `id` ind `endian` arguments are used as a filter to determine which registered [`Platform`] recognizer callbacks + /// are invoked. + /// + /// Support for this API tentatively requires explicit support in the [`BinaryView`] implementation. + pub fn register_platform_recognizer(&self, id: u32, endian: Endianness, recognizer: R) + where + R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, + { + #[repr(C)] + struct PlatformRecognizerHandlerContext + where + R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, + { + recognizer: R, + } + + extern "C" fn cb_recognize_low_level_il( + ctxt: *mut std::os::raw::c_void, + bv: *mut BNBinaryView, + metadata: *mut BNMetadata, + ) -> *mut BNPlatform + where + R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, + { + let context = unsafe { &*(ctxt as *mut PlatformRecognizerHandlerContext) }; + let bv = unsafe { BinaryView::from_raw(bv).to_owned() }; + let metadata = unsafe { Metadata::from_raw(metadata).to_owned() }; + match (context.recognizer)(&bv, &metadata) { + Some(plat) => unsafe { Ref::into_raw(plat).handle }, + None => std::ptr::null_mut(), + } + } + + let recognizer = PlatformRecognizerHandlerContext { recognizer }; + let raw = Box::into_raw(Box::new(recognizer)); + unsafe { + BNRegisterPlatformRecognizerForViewType( + self.handle, + id as u64, + endian, + Some(cb_recognize_low_level_il::), + raw as *mut std::os::raw::c_void, + ) + } + } + + /// Creates a new instance of the binary view for this given type, constructed with `data` as + /// the parent view. + /// + /// This will also call the initialization routine for the view, after calling this you should + /// be able to use the view as normal and ready to start analysis with [`BinaryView::update_analysis`]. + pub fn create(&self, data: &BinaryView) -> Result, ()> { + let handle = unsafe { BNCreateBinaryViewOfType(self.handle, data.handle) }; + if handle.is_null() { + // TODO: Proper Result, possibly introduce BNSetError to populate. + return Err(()); + } + unsafe { Ok(BinaryView::ref_from_raw(handle)) } + } + + /// Creates a new instance of the binary view for parsing, this is a "specialize" version of the + /// regular [`BinaryViewType::create`] and is expected to be used when you only want to have the + /// view parsed and populated with information required for configuration, like with open with options. + pub fn parse(&self, data: &BinaryView) -> Result, ()> { + let handle = unsafe { BNParseBinaryViewOfType(self.handle, data.handle) }; + if handle.is_null() { + // TODO: Proper Result, possibly introduce BNSetError to populate. + return Err(()); + } + unsafe { Ok(BinaryView::ref_from_raw(handle)) } + } + + /// Is this [`BinaryViewType`] valid for the given the raw [`BinaryView`]? + /// + /// Typical implementations will read the magic bytes (e.g. 'MZ'), this is a performance-sensitive + /// path so prefer inexpensive checks rather than comprehensive ones. + pub fn is_valid_for(&self, data: &BinaryView) -> bool { + unsafe { BNIsBinaryViewTypeValidForData(self.handle, data.handle) } + } + + /// Is this [`BinaryViewType`] deprecated and should not be used? + /// + /// We specify this such that the view type may still be used by existing databases, but not + /// newly created views. + pub fn is_deprecated(&self) -> bool { + unsafe { BNIsBinaryViewTypeDeprecated(self.handle) } + } + + /// Is this [`BinaryViewType`] able to be loaded forcefully? + /// + /// If so, it will be shown in the drop-down when a user opens a file with options. + pub fn is_force_loadable(&self) -> bool { + unsafe { BNIsBinaryViewTypeForceLoadable(self.handle) } + } + + /// Do instances of this [`BinaryViewType`] start with no loaded content? + /// + /// When true, the view has no meaningful default state: the user must make a + /// selection (e.g. load images from a shared cache) before any content exists. + /// + /// Callers can use this to suppress restoring the previously saved view state for + /// files not being loaded from a database, since a saved layout would reference + /// content that isn't available on reopening. + pub fn has_no_initial_content(&self) -> bool { + unsafe { BNBinaryViewTypeHasNoInitialContent(self.handle) } + } + + pub fn load_settings_for_data(&self, data: &BinaryView) -> Option> { + let settings_handle = + unsafe { BNGetBinaryViewLoadSettingsForData(self.handle, data.handle) }; + + if settings_handle.is_null() { + None + } else { + unsafe { Some(Settings::ref_from_raw(settings_handle)) } + } + } +} + +impl Debug for BinaryViewType { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BinaryViewType") + .field("name", &self.name()) + .field("long_name", &self.long_name()) + .finish() + } +} + +impl CoreArrayProvider for BinaryViewType { + type Raw = *mut BNBinaryViewType; + type Context = (); + type Wrapped<'a> = Guard<'a, BinaryViewType>; +} + +unsafe impl CoreArrayProviderInner for BinaryViewType { + unsafe fn free(raw: *mut Self::Raw, _count: usize, _context: &Self::Context) { + BNFreeBinaryViewTypeList(raw); + } + + unsafe fn wrap_raw<'a>(raw: &'a Self::Raw, _context: &'a Self::Context) -> Self::Wrapped<'a> { + Guard::new(BinaryViewType::from_raw(*raw), &()) + } +} + +unsafe impl Send for BinaryViewType {} +unsafe impl Sync for BinaryViewType {} + +/// Implemented for custom views, responsible for setting up the view state once the binary is open. +pub trait CustomBinaryView: BinaryViewBase { + /// Initializes the opened binary view state. + /// + /// Use this to populate the [`BinaryView`] with sections, segments, and other view data. + /// + /// NOTE: You must add **at-least** one segment to the view, otherwise calls to [`BinaryViewType::create`] + /// will fail. + /// + /// NOTE: This will be called on every subsequent open of a database, any view data applied here + /// should be expected to be regenerated on every open. + fn initialize(&mut self, view: &BinaryView) -> bool; + + /// Called after deserialization of the current database snapshot has completed and all the + /// view data inside that snapshot has been applied to the view (like sections and segments). + /// + /// Useful if you need to regenerate temporary data based on the view state. + fn on_after_snapshot_data_applied(&mut self) {} +} + +/// Wrapper around `C` when being passed to the custom view constructor so that we have the core +/// view available to [`CustomBinaryView::initialize`], called from [`cb_init`]. +struct CustomBinaryViewContext { + // This is not ref-counted because we do not want to impact the lifetime of the core view, the lifetime + // of which is already bound to the lifetime of the custom view (to be freed when the custom view is freed). + core_view: MaybeUninit, + view: C, +} + #[allow(clippy::len_without_is_empty)] -pub trait BinaryViewBase: AsRef { +pub trait BinaryViewBase { fn read(&self, _buf: &mut [u8], _offset: u64) -> usize { 0 } @@ -100,10 +464,7 @@ pub trait BinaryViewBase: AsRef { /// Check if the offset is valid for the current view. fn offset_valid(&self, offset: u64) -> bool { let mut buf = [0u8; 1]; - - // don't use self.read so that if segments were used we - // check against those as well - self.as_ref().read(&mut buf[..], offset) == buf.len() + self.read(&mut buf[..], offset) == buf.len() } /// Check if the offset is readable for the current view. @@ -129,8 +490,7 @@ pub trait BinaryViewBase: AsRef { /// Get the next valid offset after the provided `offset`, useful if you need to iterate over all /// readable offsets in the view. fn next_valid_offset_after(&self, offset: u64) -> u64 { - let start = self.as_ref().start(); - + let start = self.start(); if offset < start { start } else { @@ -158,18 +518,20 @@ pub trait BinaryViewBase: AsRef { } fn relocatable(&self) -> bool { - true + false + } + + fn entry_point(&self) -> u64 { + 0 } - fn entry_point(&self) -> u64; fn default_endianness(&self) -> Endianness; + fn address_size(&self) -> usize; + // TODO: Needs to take file accessor? fn save(&self) -> bool { - self.as_ref() - .parent_view() - .map(|view| view.save()) - .unwrap_or(false) + false } } @@ -241,33 +603,213 @@ impl From for AnalysisProgress { } } -pub trait BinaryViewExt: BinaryViewBase { - fn file(&self) -> Ref { +/// Represents the "whole view" of the binary and its analysis. +/// +/// Analysis information: +/// +/// - [`BinaryView::functions`] +/// - [`BinaryView::data_variables`] +/// - [`BinaryView::strings`] +/// +/// Annotation information: +/// +/// - [`BinaryView::symbols`] +/// - [`BinaryView::tags_all_scopes`] +/// - [`BinaryView::comments`] +/// +/// Data representation and binary information: +/// +/// - [`BinaryView::types`] +/// - [`BinaryView::segments`] +/// - [`BinaryView::sections`] +/// +/// # Cleaning up +/// +/// [`BinaryView`] has a cyclic relationship with the associated [`FileMetadata`], each holds a strong +/// reference to one another, so to properly clean up/free the [`BinaryView`], you must manually close the +/// file using [`FileMetadata::close`], this is not fixable in the general case, until [`FileMetadata`] +/// has only a weak reference to the [`BinaryView`]. +#[derive(PartialEq, Eq, Hash)] +pub struct BinaryView { + pub handle: *mut BNBinaryView, +} + +impl BinaryView { + pub unsafe fn from_raw(handle: *mut BNBinaryView) -> Self { + debug_assert!(!handle.is_null()); + Self { handle } + } + + pub(crate) unsafe fn ref_from_raw(handle: *mut BNBinaryView) -> Ref { + debug_assert!(!handle.is_null()); + Ref::new(Self { handle }) + } + + /// Create a core instance of the [`CustomBinaryView`]. + pub fn from_custom( + view_type_name: &str, + file: &FileMetadata, + parent_view: &BinaryView, + view: C, + ) -> Result, ()> { + let type_name = view_type_name.to_cstr(); + // We need to pass the core BinaryView when initializing the custom view state with [`CustomBinaryView::initialize`], + // and to do that we need to store the returned core view handle after creating the custom view. + let custom_context = CustomBinaryViewContext { + core_view: MaybeUninit::uninit(), + view, + }; + // We leak to be freed in `cb_free_object`. + let leaked_view = Box::leak(Box::new(custom_context)); + let handle = unsafe { + BNCreateCustomBinaryView( + type_name.as_ptr(), + file.handle, + parent_view.handle, + &mut BNCustomBinaryView { + context: leaked_view as *mut CustomBinaryViewContext as *mut _, + init: Some(cb_init::), + freeObject: Some(cb_free_object::), + externalRefTaken: None, + externalRefReleased: None, + read: Some(cb_read::), + write: Some(cb_write::), + insert: Some(cb_insert::), + remove: Some(cb_remove::), + getModification: Some(cb_modification::), + isValidOffset: Some(cb_offset_valid::), + isOffsetReadable: Some(cb_offset_readable::), + isOffsetWritable: Some(cb_offset_writable::), + isOffsetExecutable: Some(cb_offset_executable::), + isOffsetBackedByFile: Some(cb_offset_backed_by_file::), + getNextValidOffset: Some(cb_next_valid_offset::), + getStart: Some(cb_start::), + getLength: Some(cb_length::), + getEntryPoint: Some(cb_entry_point::), + isExecutable: Some(cb_executable::), + getDefaultEndianness: Some(cb_endianness::), + isRelocatable: Some(cb_relocatable::), + getAddressSize: Some(cb_address_size::), + save: Some(cb_save::), + onAfterSnapshotDataApplied: Some(cb_on_after_snapshot_data_applied::), + }, + ) + }; + if handle.is_null() { + // TODO: Free here? + return Err(()); + } + leaked_view.core_view = unsafe { MaybeUninit::new(BinaryView::from_raw(handle)) }; + unsafe { Ok(Ref::new(Self { handle })) } + } + + /// Construct the raw binary view from the given metadata. + /// + /// Before calling this, make sure you have a valid file path set for the [`FileMetadata`]. It is + /// required that the [`FileMetadata::file_path`] exist in the local filesystem. + pub fn from_metadata(meta: &FileMetadata) -> Result, ()> { + if !meta.file_path().exists() { + return Err(()); + } + let file = meta.file_path().to_cstr(); + let handle = + unsafe { BNCreateBinaryDataViewFromFilename(meta.handle, file.as_ptr() as *mut _) }; + if handle.is_null() { + return Err(()); + } + unsafe { Ok(Ref::new(Self { handle })) } + } + + /// Construct the raw binary view from the given `file_path` and metadata. + /// + /// This will implicitly set the metadata file path and then construct the view. If the metadata + /// already has the desired file path, use [`BinaryView::from_metadata`] instead. + pub fn from_path(meta: &FileMetadata, file_path: impl AsRef) -> Result, ()> { + meta.set_file_path(file_path.as_ref()); + Self::from_metadata(meta) + } + + // TODO: Provide an API that manages the lifetime of the accessor and the view. + /// Construct the raw binary view from the given `accessor` and metadata. + /// + /// It is the responsibility of the caller to keep the accessor alive for the lifetime of the view; + /// because of this, we mark the function as unsafe. + pub unsafe fn from_accessor( + meta: &FileMetadata, + accessor: &mut FileAccessor, + ) -> Result, ()> { + let handle = unsafe { BNCreateBinaryDataViewFromFile(meta.handle, &mut accessor.raw) }; + if handle.is_null() { + return Err(()); + } + unsafe { Ok(Ref::new(Self { handle })) } + } + + /// Construct the raw binary view from the given `data` and metadata. + /// + /// The data will be copied into the view, so the caller does not need to keep the data alive. + pub fn from_data(meta: &FileMetadata, data: &[u8]) -> Ref { + let handle = unsafe { + BNCreateBinaryDataViewFromData(meta.handle, data.as_ptr() as *mut _, data.len()) + }; + assert!( + !handle.is_null(), + "BNCreateBinaryDataViewFromData should always succeed" + ); + unsafe { Ref::new(Self { handle }) } + } + + /// Save the original binary file to the provided `file_path` along with any modifications. + /// + /// WARNING: Currently, there is a possibility to deadlock if the analysis has queued up a main thread action + /// that tries to take the [`FileMetadata`] lock of the current view and is executed while we + /// are executing in this function. + /// + /// To avoid the above issue, use [`crate::main_thread::execute_on_main_thread_and_wait`] to verify there + /// are no queued up main thread actions. + pub fn save_to_path(&self, file_path: impl AsRef) -> bool { + let file = file_path.as_ref().to_cstr(); + unsafe { BNSaveToFilename(self.handle, file.as_ptr() as *mut _) } + } + + /// Save the original binary file to the provided [`FileAccessor`] along with any modifications. + /// + /// WARNING: Currently, there is a possibility to deadlock if the analysis has queued up a main thread action + /// that tries to take the [`FileMetadata`] lock of the current view and is executed while we + /// are executing in this function. + /// + /// To avoid the above issue, use [`crate::main_thread::execute_on_main_thread_and_wait`] to verify there + /// are no queued up main thread actions. + pub fn save_to_accessor(&self, file: &mut FileAccessor) -> bool { + unsafe { BNSaveToFile(self.handle, &mut file.raw) } + } + + pub fn file(&self) -> Ref { unsafe { - let raw = BNGetFileForView(self.as_ref().handle); + let raw = BNGetFileForView(self.handle); FileMetadata::ref_from_raw(raw) } } - fn parent_view(&self) -> Option> { - let raw_view_ptr = unsafe { BNGetParentView(self.as_ref().handle) }; + pub fn parent_view(&self) -> Option> { + let raw_view_ptr = unsafe { BNGetParentView(self.handle) }; match raw_view_ptr.is_null() { false => Some(unsafe { BinaryView::ref_from_raw(raw_view_ptr) }), true => None, } } - fn raw_view(&self) -> Option> { + pub fn raw_view(&self) -> Option> { self.file().view_of_type("Raw") } - fn view_type(&self) -> String { - let ptr: *mut c_char = unsafe { BNGetViewType(self.as_ref().handle) }; + pub fn view_type(&self) -> String { + let ptr: *mut c_char = unsafe { BNGetViewType(self.handle) }; unsafe { BnString::into_string(ptr) } } /// Reads up to `len` bytes from address `offset` - fn read_vec(&self, offset: u64, len: usize) -> Vec { + pub fn read_vec(&self, offset: u64, len: usize) -> Vec { let mut ret = vec![0; len]; let size = self.read(&mut ret, offset); ret.truncate(size); @@ -275,7 +817,7 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Appends up to `len` bytes from address `offset` into `dest` - fn read_into_vec(&self, dest: &mut Vec, offset: u64, len: usize) -> usize { + pub fn read_into_vec(&self, dest: &mut Vec, offset: u64, len: usize) -> usize { let starting_len = dest.len(); dest.resize(starting_len + len, 0); let read_size = self.read(&mut dest[starting_len..], offset); @@ -284,7 +826,7 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Reads up to `len` bytes from the address `offset` returning a `CString` if available. - fn read_c_string_at(&self, offset: u64, len: usize) -> Option { + pub fn read_c_string_at(&self, offset: u64, len: usize) -> Option { let mut buf = vec![0; len]; let size = self.read(&mut buf, offset); let string = CString::new(buf[..size].to_vec()).ok()?; @@ -292,7 +834,7 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Reads up to `len` bytes from the address `offset` returning a `String` if available. - fn read_utf8_string_at(&self, offset: u64, len: usize) -> Option { + pub fn read_utf8_string_at(&self, offset: u64, len: usize) -> Option { let mut buf = vec![0; len]; let size = self.read(&mut buf, offset); let string = String::from_utf8(buf[..size].to_vec()).ok()?; @@ -302,14 +844,18 @@ pub trait BinaryViewExt: BinaryViewBase { /// Search the view using the query options. /// /// In the `on_match` callback return `false` to stop searching. - fn search bool>(&self, query: &SearchQuery, on_match: C) -> bool { + pub fn search bool>( + &self, + query: &SearchQuery, + on_match: C, + ) -> bool { self.search_with_progress(query, on_match, NoProgressCallback) } /// Search the view using the query options. /// /// In the `on_match` callback return `false` to stop searching. - fn search_with_progress bool>( + pub fn search_with_progress bool>( &self, query: &SearchQuery, mut on_match: C, @@ -328,7 +874,7 @@ pub trait BinaryViewExt: BinaryViewBase { let query = query.to_json().to_cstr(); unsafe { BNSearch( - self.as_ref().handle, + self.handle, query.as_ptr(), &mut progress as *mut P as *mut c_void, Some(P::cb_progress_callback), @@ -338,7 +884,7 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn find_next_data(&self, start: u64, end: u64, data: &DataBuffer) -> Option { + pub fn find_next_data(&self, start: u64, end: u64, data: &DataBuffer) -> Option { self.find_next_data_with_opts( start, end, @@ -351,7 +897,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// # Warning /// /// This function is likely to be changed to take in a "query" structure. Or deprecated entirely. - fn find_next_data_with_opts( + pub fn find_next_data_with_opts( &self, start: u64, end: u64, @@ -362,7 +908,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut result: u64 = 0; let found = unsafe { BNFindNextDataWithProgress( - self.as_ref().handle, + self.handle, start, end, data.as_raw(), @@ -380,7 +926,7 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn find_next_constant( + pub fn find_next_constant( &self, start: u64, end: u64, @@ -402,7 +948,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// # Warning /// /// This function is likely to be changed to take in a "query" structure. - fn find_next_constant_with_opts( + pub fn find_next_constant_with_opts( &self, start: u64, end: u64, @@ -415,7 +961,7 @@ pub trait BinaryViewExt: BinaryViewBase { let raw_view_type = FunctionViewType::into_raw(view_type); let found = unsafe { BNFindNextConstantWithProgress( - self.as_ref().handle, + self.handle, start, end, constant, @@ -435,7 +981,7 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn find_next_text( + pub fn find_next_text( &self, start: u64, end: u64, @@ -458,7 +1004,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// # Warning /// /// This function is likely to be changed to take in a "query" structure. - fn find_next_text_with_opts( + pub fn find_next_text_with_opts( &self, start: u64, end: u64, @@ -473,7 +1019,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut result: u64 = 0; let found = unsafe { BNFindNextTextWithProgress( - self.as_ref().handle, + self.handle, start, end, text.as_ptr(), @@ -494,75 +1040,75 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn notify_data_written(&self, offset: u64, len: usize) { + pub fn notify_data_written(&self, offset: u64, len: usize) { unsafe { - BNNotifyDataWritten(self.as_ref().handle, offset, len); + BNNotifyDataWritten(self.handle, offset, len); } } - fn notify_data_inserted(&self, offset: u64, len: usize) { + pub fn notify_data_inserted(&self, offset: u64, len: usize) { unsafe { - BNNotifyDataInserted(self.as_ref().handle, offset, len); + BNNotifyDataInserted(self.handle, offset, len); } } - fn notify_data_removed(&self, offset: u64, len: usize) { + pub fn notify_data_removed(&self, offset: u64, len: usize) { unsafe { - BNNotifyDataRemoved(self.as_ref().handle, offset, len as u64); + BNNotifyDataRemoved(self.handle, offset, len as u64); } } /// Consults the [`Section`]'s current [`crate::section::Semantics`] to determine if the /// offset has code semantics. - fn offset_has_code_semantics(&self, offset: u64) -> bool { - unsafe { BNIsOffsetCodeSemantics(self.as_ref().handle, offset) } + pub fn offset_has_code_semantics(&self, offset: u64) -> bool { + unsafe { BNIsOffsetCodeSemantics(self.handle, offset) } } /// Check if the offset is within a [`Section`] with [`crate::section::Semantics::External`]. - fn offset_has_extern_semantics(&self, offset: u64) -> bool { - unsafe { BNIsOffsetExternSemantics(self.as_ref().handle, offset) } + pub fn offset_has_extern_semantics(&self, offset: u64) -> bool { + unsafe { BNIsOffsetExternSemantics(self.handle, offset) } } /// Consults the [`Section`]'s current [`crate::section::Semantics`] to determine if the /// offset has writable semantics. - fn offset_has_writable_semantics(&self, offset: u64) -> bool { - unsafe { BNIsOffsetWritableSemantics(self.as_ref().handle, offset) } + pub fn offset_has_writable_semantics(&self, offset: u64) -> bool { + unsafe { BNIsOffsetWritableSemantics(self.handle, offset) } } /// Consults the [`Section`]'s current [`crate::section::Semantics`] to determine if the /// offset has read only semantics. - fn offset_has_read_only_semantics(&self, offset: u64) -> bool { - unsafe { BNIsOffsetReadOnlySemantics(self.as_ref().handle, offset) } + pub fn offset_has_read_only_semantics(&self, offset: u64) -> bool { + unsafe { BNIsOffsetReadOnlySemantics(self.handle, offset) } } - fn image_base(&self) -> u64 { - unsafe { BNGetImageBase(self.as_ref().handle) } + pub fn image_base(&self) -> u64 { + unsafe { BNGetImageBase(self.handle) } } - fn original_image_base(&self) -> u64 { - unsafe { BNGetOriginalImageBase(self.as_ref().handle) } + pub fn original_image_base(&self) -> u64 { + unsafe { BNGetOriginalImageBase(self.handle) } } - fn set_original_image_base(&self, image_base: u64) { - unsafe { BNSetOriginalImageBase(self.as_ref().handle, image_base) } + pub fn set_original_image_base(&self, image_base: u64) { + unsafe { BNSetOriginalImageBase(self.handle, image_base) } } /// The highest address in the view. - fn end(&self) -> u64 { - unsafe { BNGetEndOffset(self.as_ref().handle) } + pub fn end(&self) -> u64 { + unsafe { BNGetEndOffset(self.handle) } } - fn add_analysis_option(&self, name: &str) { + pub fn add_analysis_option(&self, name: &str) { let name = name.to_cstr(); - unsafe { BNAddAnalysisOption(self.as_ref().handle, name.as_ptr()) } + unsafe { BNAddAnalysisOption(self.handle, name.as_ptr()) } } - fn has_initial_analysis(&self) -> bool { - unsafe { BNHasInitialAnalysis(self.as_ref().handle) } + pub fn has_initial_analysis(&self) -> bool { + unsafe { BNHasInitialAnalysis(self.handle) } } - fn set_analysis_hold(&self, enable: bool) { - unsafe { BNSetAnalysisHold(self.as_ref().handle, enable) } + pub fn set_analysis_hold(&self, enable: bool) { + unsafe { BNSetAnalysisHold(self.handle, enable) } } /// Runs the analysis pipeline, analyzing any data that has been marked for updates. @@ -571,11 +1117,11 @@ pub trait BinaryViewExt: BinaryViewBase { /// - [`Function::mark_updates_required`] /// - [`Function::mark_caller_updates_required`] /// - /// NOTE: This is a **non-blocking** call, use [`BinaryViewExt::update_analysis_and_wait`] if you + /// NOTE: This is a **non-blocking** call, use [`BinaryView::update_analysis_and_wait`] if you /// require analysis to have completed before moving on. - fn update_analysis(&self) { + pub fn update_analysis(&self) { unsafe { - BNUpdateAnalysis(self.as_ref().handle); + BNUpdateAnalysis(self.handle); } } @@ -585,47 +1131,47 @@ pub trait BinaryViewExt: BinaryViewBase { /// - [`Function::mark_updates_required`] /// - [`Function::mark_caller_updates_required`] /// - /// NOTE: This is a **blocking** call, use [`BinaryViewExt::update_analysis`] if you do not + /// NOTE: This is a **blocking** call, use [`BinaryView::update_analysis`] if you do not /// need to wait for the analysis update to finish. - fn update_analysis_and_wait(&self) { + pub fn update_analysis_and_wait(&self) { unsafe { - BNUpdateAnalysisAndWait(self.as_ref().handle); + BNUpdateAnalysisAndWait(self.handle); } } /// Causes **all** functions to be reanalyzed. /// - /// Use [`BinaryViewExt::update_analysis`] or [`BinaryViewExt::update_analysis_and_wait`] instead + /// Use [`BinaryView::update_analysis`] or [`BinaryView::update_analysis_and_wait`] instead /// if you want to incrementally update analysis. /// /// NOTE: This function does not wait for the analysis to finish. - fn reanalyze(&self) { + pub fn reanalyze(&self) { unsafe { - BNReanalyzeAllFunctions(self.as_ref().handle); + BNReanalyzeAllFunctions(self.handle); } } - fn abort_analysis(&self) { - unsafe { BNAbortAnalysis(self.as_ref().handle) } + pub fn abort_analysis(&self) { + unsafe { BNAbortAnalysis(self.handle) } } - fn analysis_is_aborted(&self) -> bool { - unsafe { BNAnalysisIsAborted(self.as_ref().handle) } + pub fn analysis_is_aborted(&self) -> bool { + unsafe { BNAnalysisIsAborted(self.handle) } } - fn workflow(&self) -> Ref { + pub fn workflow(&self) -> Ref { unsafe { - let raw_ptr = BNGetWorkflowForBinaryView(self.as_ref().handle); + let raw_ptr = BNGetWorkflowForBinaryView(self.handle); let nonnull = NonNull::new(raw_ptr).expect("All views must have a workflow"); Workflow::ref_from_raw(nonnull) } } - fn analysis_info(&self) -> AnalysisInfo { - let info_ptr = unsafe { BNGetAnalysisInfo(self.as_ref().handle) }; + pub fn analysis_info(&self) -> AnalysisInfo { + let info_ptr = unsafe { BNGetAnalysisInfo(self.handle) }; assert!(!info_ptr.is_null()); let info = unsafe { *info_ptr }; - let active_infos = unsafe { slice::from_raw_parts(info.activeInfo, info.count) }; + let active_infos = unsafe { std::slice::from_raw_parts(info.activeInfo, info.count) }; let mut active_info_list = vec![]; for active_info in active_infos { @@ -648,14 +1194,14 @@ pub trait BinaryViewExt: BinaryViewBase { result } - fn analysis_progress(&self) -> AnalysisProgress { - let progress_raw = unsafe { BNGetAnalysisProgress(self.as_ref().handle) }; + pub fn analysis_progress(&self) -> AnalysisProgress { + let progress_raw = unsafe { BNGetAnalysisProgress(self.handle) }; AnalysisProgress::from(progress_raw) } - fn default_arch(&self) -> Option { + pub fn default_arch(&self) -> Option { unsafe { - let raw = BNGetDefaultArchitecture(self.as_ref().handle); + let raw = BNGetDefaultArchitecture(self.handle); if raw.is_null() { return None; @@ -665,15 +1211,15 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn set_default_arch(&self, arch: &A) { + pub fn set_default_arch(&self, arch: &A) { unsafe { - BNSetDefaultArchitecture(self.as_ref().handle, arch.as_ref().handle); + BNSetDefaultArchitecture(self.handle, arch.as_ref().handle); } } - fn default_platform(&self) -> Option> { + pub fn default_platform(&self) -> Option> { unsafe { - let raw = BNGetDefaultPlatform(self.as_ref().handle); + let raw = BNGetDefaultPlatform(self.handle); if raw.is_null() { return None; @@ -683,22 +1229,22 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn set_default_platform(&self, plat: &Platform) { + pub fn set_default_platform(&self, plat: &Platform) { unsafe { - BNSetDefaultPlatform(self.as_ref().handle, plat.handle); + BNSetDefaultPlatform(self.handle, plat.handle); } } - fn base_address_detection(&self) -> Option { + pub fn base_address_detection(&self) -> Option { unsafe { - let handle = BNCreateBaseAddressDetection(self.as_ref().handle); + let handle = BNCreateBaseAddressDetection(self.handle); NonNull::new(handle).map(|base| BaseAddressDetection::from_raw(base)) } } - fn instruction_len(&self, arch: &A, addr: u64) -> Option { + pub fn instruction_len(&self, arch: &A, addr: u64) -> Option { unsafe { - let size = BNGetInstructionLength(self.as_ref().handle, arch.as_ref().handle, addr); + let size = BNGetInstructionLength(self.handle, arch.as_ref().handle, addr); if size > 0 { Some(size) @@ -708,10 +1254,9 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn symbol_by_address(&self, addr: u64) -> Option> { + pub fn symbol_by_address(&self, addr: u64) -> Option> { unsafe { - let raw_sym_ptr = - BNGetSymbolByAddress(self.as_ref().handle, addr, std::ptr::null_mut()); + let raw_sym_ptr = BNGetSymbolByAddress(self.handle, addr, std::ptr::null_mut()); match raw_sym_ptr.is_null() { false => Some(Symbol::ref_from_raw(raw_sym_ptr)), true => None, @@ -719,15 +1264,12 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn symbol_by_raw_name(&self, raw_name: impl IntoCStr) -> Option> { + pub fn symbol_by_raw_name(&self, raw_name: impl IntoCStr) -> Option> { let raw_name = raw_name.to_cstr(); unsafe { - let raw_sym_ptr = BNGetSymbolByRawName( - self.as_ref().handle, - raw_name.as_ptr(), - std::ptr::null_mut(), - ); + let raw_sym_ptr = + BNGetSymbolByRawName(self.handle, raw_name.as_ptr(), std::ptr::null_mut()); match raw_sym_ptr.is_null() { false => Some(Symbol::ref_from_raw(raw_sym_ptr)), true => None, @@ -735,22 +1277,22 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn symbols(&self) -> Array { + pub fn symbols(&self) -> Array { unsafe { let mut count = 0; - let handles = BNGetSymbols(self.as_ref().handle, &mut count, std::ptr::null_mut()); + let handles = BNGetSymbols(self.handle, &mut count, std::ptr::null_mut()); Array::new(handles, count, ()) } } - fn symbols_by_name(&self, name: impl IntoCStr) -> Array { + pub fn symbols_by_name(&self, name: impl IntoCStr) -> Array { let raw_name = name.to_cstr(); unsafe { let mut count = 0; let handles = BNGetSymbolsByName( - self.as_ref().handle, + self.handle, raw_name.as_ptr(), &mut count, std::ptr::null_mut(), @@ -760,12 +1302,12 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn symbols_in_range(&self, range: Range) -> Array { + pub fn symbols_in_range(&self, range: Range) -> Array { unsafe { let mut count = 0; let len = range.end.wrapping_sub(range.start); let handles = BNGetSymbolsInRange( - self.as_ref().handle, + self.handle, range.start, len, &mut count, @@ -776,26 +1318,22 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn symbols_of_type(&self, ty: SymbolType) -> Array { + pub fn symbols_of_type(&self, ty: SymbolType) -> Array { unsafe { let mut count = 0; - let handles = BNGetSymbolsOfType( - self.as_ref().handle, - ty.into(), - &mut count, - std::ptr::null_mut(), - ); + let handles = + BNGetSymbolsOfType(self.handle, ty.into(), &mut count, std::ptr::null_mut()); Array::new(handles, count, ()) } } - fn symbols_of_type_in_range(&self, ty: SymbolType, range: Range) -> Array { + pub fn symbols_of_type_in_range(&self, ty: SymbolType, range: Range) -> Array { unsafe { let mut count = 0; let len = range.end.wrapping_sub(range.start); let handles = BNGetSymbolsOfTypeInRange( - self.as_ref().handle, + self.handle, ty.into(), range.start, len, @@ -807,18 +1345,21 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn define_auto_symbol(&self, sym: &Symbol) { + pub fn define_auto_symbol(&self, sym: &Symbol) { unsafe { - BNDefineAutoSymbol(self.as_ref().handle, sym.handle); + BNDefineAutoSymbol(self.handle, sym.handle); } } - fn define_auto_symbol_with_type<'a, T: Into>>( + /// Defines the symbol as well as the analysis object associated with the given symbol type, such as + /// the data variable for a [`SymbolType::Data`], or the function for a [`SymbolType::Function`]. + /// Returns the symbol, as it was applied to the binary view. + pub fn define_auto_symbol_with_type<'a, T: Into>>( &self, sym: &Symbol, plat: &Platform, ty: T, - ) -> Result> { + ) -> Ref { let mut type_with_conf = BNTypeWithConfidence { type_: if let Some(t) = ty.into() { t.handle @@ -830,50 +1371,50 @@ pub trait BinaryViewExt: BinaryViewBase { unsafe { let raw_sym = BNDefineAutoSymbolAndVariableOrFunction( - self.as_ref().handle, + self.handle, plat.handle, sym.handle, &mut type_with_conf, ); - - if raw_sym.is_null() { - return Err(()); - } - - Ok(Symbol::ref_from_raw(raw_sym)) + // We should always get the symbol back as it is defined. + debug_assert!( + !raw_sym.is_null(), + "BNDefineAutoSymbolAndVariableOrFunction should not return null" + ); + Symbol::ref_from_raw(raw_sym) } } - fn undefine_auto_symbol(&self, sym: &Symbol) { + pub fn undefine_auto_symbol(&self, sym: &Symbol) { unsafe { - BNUndefineAutoSymbol(self.as_ref().handle, sym.handle); + BNUndefineAutoSymbol(self.handle, sym.handle); } } - fn define_user_symbol(&self, sym: &Symbol) { + pub fn define_user_symbol(&self, sym: &Symbol) { unsafe { - BNDefineUserSymbol(self.as_ref().handle, sym.handle); + BNDefineUserSymbol(self.handle, sym.handle); } } - fn undefine_user_symbol(&self, sym: &Symbol) { + pub fn undefine_user_symbol(&self, sym: &Symbol) { unsafe { - BNUndefineUserSymbol(self.as_ref().handle, sym.handle); + BNUndefineUserSymbol(self.handle, sym.handle); } } - fn data_variables(&self) -> Array { + pub fn data_variables(&self) -> Array { unsafe { let mut count = 0; - let vars = BNGetDataVariables(self.as_ref().handle, &mut count); + let vars = BNGetDataVariables(self.handle, &mut count); Array::new(vars, count, ()) } } - fn data_variable_at_address(&self, addr: u64) -> Option { + pub fn data_variable_at_address(&self, addr: u64) -> Option { let mut dv = BNDataVariable::default(); unsafe { - if BNGetDataVariableAtAddress(self.as_ref().handle, addr, &mut dv) { + if BNGetDataVariableAtAddress(self.handle, addr, &mut dv) { Some(DataVariable::from_owned_raw(dv)) } else { None @@ -881,34 +1422,34 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn define_auto_data_var<'a, T: Into>>(&self, addr: u64, ty: T) { + pub fn define_auto_data_var<'a, T: Into>>(&self, addr: u64, ty: T) { let mut owned_raw_ty = Conf::<&Type>::into_raw(ty.into()); unsafe { - BNDefineDataVariable(self.as_ref().handle, addr, &mut owned_raw_ty); + BNDefineDataVariable(self.handle, addr, &mut owned_raw_ty); } } - /// You likely would also like to call [`BinaryViewExt::define_user_symbol`] to bind this data variable with a name - fn define_user_data_var<'a, T: Into>>(&self, addr: u64, ty: T) { + /// You likely would also like to call [`BinaryView::define_user_symbol`] to bind this data variable with a name + pub fn define_user_data_var<'a, T: Into>>(&self, addr: u64, ty: T) { let mut owned_raw_ty = Conf::<&Type>::into_raw(ty.into()); unsafe { - BNDefineUserDataVariable(self.as_ref().handle, addr, &mut owned_raw_ty); + BNDefineUserDataVariable(self.handle, addr, &mut owned_raw_ty); } } - fn undefine_auto_data_var(&self, addr: u64, blacklist: Option) { + pub fn undefine_auto_data_var(&self, addr: u64, blacklist: Option) { unsafe { - BNUndefineDataVariable(self.as_ref().handle, addr, blacklist.unwrap_or(true)); + BNUndefineDataVariable(self.handle, addr, blacklist.unwrap_or(true)); } } - fn undefine_user_data_var(&self, addr: u64) { + pub fn undefine_user_data_var(&self, addr: u64) { unsafe { - BNUndefineUserDataVariable(self.as_ref().handle, addr); + BNUndefineUserDataVariable(self.handle, addr); } } - fn define_auto_type>( + pub fn define_auto_type>( &self, name: T, source: &str, @@ -919,13 +1460,13 @@ pub trait BinaryViewExt: BinaryViewBase { let name_handle = unsafe { let id_str = BNGenerateAutoTypeId(source_str.as_ref().as_ptr() as *const _, &mut raw_name); - BNDefineAnalysisType(self.as_ref().handle, id_str, &mut raw_name, type_obj.handle) + BNDefineAnalysisType(self.handle, id_str, &mut raw_name, type_obj.handle) }; QualifiedName::free_raw(raw_name); QualifiedName::from_owned_raw(name_handle) } - fn define_auto_type_with_id>( + pub fn define_auto_type_with_id>( &self, name: T, id: &str, @@ -935,7 +1476,7 @@ pub trait BinaryViewExt: BinaryViewBase { let id_str = id.to_cstr(); let result_raw_name = unsafe { BNDefineAnalysisType( - self.as_ref().handle, + self.handle, id_str.as_ref().as_ptr() as *const _, &mut raw_name, type_obj.handle, @@ -945,13 +1486,16 @@ pub trait BinaryViewExt: BinaryViewBase { QualifiedName::from_owned_raw(result_raw_name) } - fn define_user_type>(&self, name: T, type_obj: &Type) { + pub fn define_user_type>(&self, name: T, type_obj: &Type) { let mut raw_name = QualifiedName::into_raw(name.into()); - unsafe { BNDefineUserAnalysisType(self.as_ref().handle, &mut raw_name, type_obj.handle) } + unsafe { BNDefineUserAnalysisType(self.handle, &mut raw_name, type_obj.handle) } QualifiedName::free_raw(raw_name); } - fn define_auto_types(&self, names_sources_and_types: T) -> HashMap + pub fn define_auto_types( + &self, + names_sources_and_types: T, + ) -> HashMap where T: Iterator, I: Into, @@ -959,7 +1503,7 @@ pub trait BinaryViewExt: BinaryViewBase { self.define_auto_types_with_progress(names_sources_and_types, NoProgressCallback) } - fn define_auto_types_with_progress( + pub fn define_auto_types_with_progress( &self, names_sources_and_types: T, mut progress: P, @@ -978,7 +1522,7 @@ pub trait BinaryViewExt: BinaryViewBase { let result_count = unsafe { BNDefineAnalysisTypes( - self.as_ref().handle, + self.handle, types.as_mut_ptr(), types.len(), Some(P::cb_progress_callback), @@ -1001,7 +1545,7 @@ pub trait BinaryViewExt: BinaryViewBase { .collect() } - fn define_user_types(&self, names_and_types: T) + pub fn define_user_types(&self, names_and_types: T) where T: Iterator, I: Into, @@ -1009,7 +1553,7 @@ pub trait BinaryViewExt: BinaryViewBase { self.define_user_types_with_progress(names_and_types, NoProgressCallback); } - fn define_user_types_with_progress(&self, names_and_types: T, mut progress: P) + pub fn define_user_types_with_progress(&self, names_and_types: T, mut progress: P) where T: Iterator, I: Into, @@ -1022,7 +1566,7 @@ pub trait BinaryViewExt: BinaryViewBase { unsafe { BNDefineUserAnalysisTypes( - self.as_ref().handle, + self.handle, types.as_mut_ptr(), types.len(), Some(P::cb_progress_callback), @@ -1035,39 +1579,39 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn undefine_auto_type(&self, id: &str) { + pub fn undefine_auto_type(&self, id: &str) { let id_str = id.to_cstr(); unsafe { - BNUndefineAnalysisType(self.as_ref().handle, id_str.as_ref().as_ptr() as *const _); + BNUndefineAnalysisType(self.handle, id_str.as_ref().as_ptr() as *const _); } } - fn undefine_user_type>(&self, name: T) { + pub fn undefine_user_type>(&self, name: T) { let mut raw_name = QualifiedName::into_raw(name.into()); - unsafe { BNUndefineUserAnalysisType(self.as_ref().handle, &mut raw_name) } + unsafe { BNUndefineUserAnalysisType(self.handle, &mut raw_name) } QualifiedName::free_raw(raw_name); } - fn types(&self) -> Array { + pub fn types(&self) -> Array { unsafe { let mut count = 0usize; - let types = BNGetAnalysisTypeList(self.as_ref().handle, &mut count); + let types = BNGetAnalysisTypeList(self.handle, &mut count); Array::new(types, count, ()) } } - fn dependency_sorted_types(&self) -> Array { + pub fn dependency_sorted_types(&self) -> Array { unsafe { let mut count = 0usize; - let types = BNGetAnalysisDependencySortedTypeList(self.as_ref().handle, &mut count); + let types = BNGetAnalysisDependencySortedTypeList(self.handle, &mut count); Array::new(types, count, ()) } } - fn type_by_name>(&self, name: T) -> Option> { + pub fn type_by_name>(&self, name: T) -> Option> { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { - let type_handle = BNGetAnalysisTypeByName(self.as_ref().handle, &mut raw_name); + let type_handle = BNGetAnalysisTypeByName(self.handle, &mut raw_name); QualifiedName::free_raw(raw_name); if type_handle.is_null() { return None; @@ -1076,9 +1620,9 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn type_by_ref(&self, ref_: &NamedTypeReference) -> Option> { + pub fn type_by_ref(&self, ref_: &NamedTypeReference) -> Option> { unsafe { - let type_handle = BNGetAnalysisTypeByRef(self.as_ref().handle, ref_.handle); + let type_handle = BNGetAnalysisTypeByRef(self.handle, ref_.handle); if type_handle.is_null() { return None; } @@ -1086,10 +1630,10 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn type_by_id(&self, id: &str) -> Option> { + pub fn type_by_id(&self, id: &str) -> Option> { let id_str = id.to_cstr(); unsafe { - let type_handle = BNGetAnalysisTypeById(self.as_ref().handle, id_str.as_ptr()); + let type_handle = BNGetAnalysisTypeById(self.handle, id_str.as_ptr()); if type_handle.is_null() { return None; } @@ -1097,10 +1641,10 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn type_name_by_id(&self, id: &str) -> Option { + pub fn type_name_by_id(&self, id: &str) -> Option { let id_str = id.to_cstr(); unsafe { - let name_handle = BNGetAnalysisTypeNameById(self.as_ref().handle, id_str.as_ptr()); + let name_handle = BNGetAnalysisTypeNameById(self.handle, id_str.as_ptr()); let name = QualifiedName::from_owned_raw(name_handle); // The core will return an empty qualified name if no type name was found. match name.items.is_empty() { @@ -1110,10 +1654,10 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn type_id_by_name>(&self, name: T) -> Option { + pub fn type_id_by_name>(&self, name: T) -> Option { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { - let id_cstr = BNGetAnalysisTypeId(self.as_ref().handle, &mut raw_name); + let id_cstr = BNGetAnalysisTypeId(self.handle, &mut raw_name); QualifiedName::free_raw(raw_name); let id = BnString::into_string(id_cstr); match id.is_empty() { @@ -1123,24 +1667,24 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn is_type_auto_defined>(&self, name: T) -> bool { + pub fn is_type_auto_defined>(&self, name: T) -> bool { let mut raw_name = QualifiedName::into_raw(name.into()); - let result = unsafe { BNIsAnalysisTypeAutoDefined(self.as_ref().handle, &mut raw_name) }; + let result = unsafe { BNIsAnalysisTypeAutoDefined(self.handle, &mut raw_name) }; QualifiedName::free_raw(raw_name); result } - fn segments(&self) -> Array { + pub fn segments(&self) -> Array { unsafe { let mut count = 0; - let raw_segments = BNGetSegments(self.as_ref().handle, &mut count); + let raw_segments = BNGetSegments(self.handle, &mut count); Array::new(raw_segments, count, ()) } } - fn segment_at(&self, addr: u64) -> Option> { + pub fn segment_at(&self, addr: u64) -> Option> { unsafe { - let raw_seg = BNGetSegmentAt(self.as_ref().handle, addr); + let raw_seg = BNGetSegmentAt(self.handle, addr); match raw_seg.is_null() { false => Some(Segment::ref_from_raw(raw_seg)), true => None, @@ -1150,24 +1694,24 @@ pub trait BinaryViewExt: BinaryViewBase { /// Adds a segment to the view. /// - /// NOTE: Consider using [BinaryViewExt::begin_bulk_add_segments] and [BinaryViewExt::end_bulk_add_segments] + /// NOTE: Consider using [BinaryView::begin_bulk_add_segments] and [BinaryView::end_bulk_add_segments] /// if you plan on adding a number of segments all at once, to avoid unnecessary MemoryMap updates. - fn add_segment(&self, segment: SegmentBuilder) { + pub fn add_segment(&self, segment: SegmentBuilder) { segment.create(self.as_ref()); } // TODO: Replace with BulkModify guard. /// Start adding segments in bulk. Useful for adding large numbers of segments. /// - /// After calling this any call to [BinaryViewExt::add_segment] will be uncommitted until a call to - /// [BinaryViewExt::end_bulk_add_segments] + /// After calling this any call to [BinaryView::add_segment] will be uncommitted until a call to + /// [BinaryView::end_bulk_add_segments] /// - /// If you wish to discard the uncommitted segments you can call [BinaryViewExt::cancel_bulk_add_segments]. + /// If you wish to discard the uncommitted segments you can call [BinaryView::cancel_bulk_add_segments]. /// - /// NOTE: This **must** be paired with a later call to [BinaryViewExt::end_bulk_add_segments] or - /// [BinaryViewExt::cancel_bulk_add_segments], otherwise segments added after this call will stay uncommitted. - fn begin_bulk_add_segments(&self) { - unsafe { BNBeginBulkAddSegments(self.as_ref().handle) } + /// NOTE: This **must** be paired with a later call to [BinaryView::end_bulk_add_segments] or + /// [BinaryView::cancel_bulk_add_segments], otherwise segments added after this call will stay uncommitted. + pub fn begin_bulk_add_segments(&self) { + unsafe { BNBeginBulkAddSegments(self.handle) } } // TODO: Replace with BulkModify guard. @@ -1175,8 +1719,8 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// NOTE: This **must** be paired with a prior call to [Self::begin_bulk_add_segments], otherwise this /// does nothing and segments are added individually. - fn end_bulk_add_segments(&self) { - unsafe { BNEndBulkAddSegments(self.as_ref().handle) } + pub fn end_bulk_add_segments(&self) { + unsafe { BNEndBulkAddSegments(self.handle) } } // TODO: Replace with BulkModify guard. @@ -1186,35 +1730,35 @@ pub trait BinaryViewExt: BinaryViewBase { /// and [Self::end_bulk_add_segments], where the latter will commit the segments /// which have been added since [Self::begin_bulk_add_segments], this function /// will discard them so that they do not get added to the view. - fn cancel_bulk_add_segments(&self) { - unsafe { BNCancelBulkAddSegments(self.as_ref().handle) } + pub fn cancel_bulk_add_segments(&self) { + unsafe { BNCancelBulkAddSegments(self.handle) } } - fn add_section(&self, section: SectionBuilder) { + pub fn add_section(&self, section: SectionBuilder) { section.create(self.as_ref()); } - fn remove_auto_section(&self, name: impl IntoCStr) { + pub fn remove_auto_section(&self, name: impl IntoCStr) { let raw_name = name.to_cstr(); let raw_name_ptr = raw_name.as_ptr(); unsafe { - BNRemoveAutoSection(self.as_ref().handle, raw_name_ptr); + BNRemoveAutoSection(self.handle, raw_name_ptr); } } - fn remove_user_section(&self, name: impl IntoCStr) { + pub fn remove_user_section(&self, name: impl IntoCStr) { let raw_name = name.to_cstr(); let raw_name_ptr = raw_name.as_ptr(); unsafe { - BNRemoveUserSection(self.as_ref().handle, raw_name_ptr); + BNRemoveUserSection(self.handle, raw_name_ptr); } } - fn section_by_name(&self, name: impl IntoCStr) -> Option> { + pub fn section_by_name(&self, name: impl IntoCStr) -> Option> { unsafe { let raw_name = name.to_cstr(); let name_ptr = raw_name.as_ptr(); - let raw_section_ptr = BNGetSectionByName(self.as_ref().handle, name_ptr); + let raw_section_ptr = BNGetSectionByName(self.handle, name_ptr); match raw_section_ptr.is_null() { false => Some(Section::ref_from_raw(raw_section_ptr)), true => None, @@ -1222,42 +1766,42 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn sections(&self) -> Array
{ + pub fn sections(&self) -> Array
{ unsafe { let mut count = 0; - let sections = BNGetSections(self.as_ref().handle, &mut count); + let sections = BNGetSections(self.handle, &mut count); Array::new(sections, count, ()) } } - fn sections_at(&self, addr: u64) -> Array
{ + pub fn sections_at(&self, addr: u64) -> Array
{ unsafe { let mut count = 0; - let sections = BNGetSectionsAt(self.as_ref().handle, addr, &mut count); + let sections = BNGetSectionsAt(self.handle, addr, &mut count); Array::new(sections, count, ()) } } - fn memory_map(&self) -> MemoryMap { + pub fn memory_map(&self) -> MemoryMap { MemoryMap::new(self.as_ref().to_owned()) } /// Add an auto function at the given `address` with the views default platform. /// - /// Use [`BinaryViewExt::add_auto_function_with_platform`] if you wish to specify a platform. + /// Use [`BinaryView::add_auto_function_with_platform`] if you wish to specify a platform. /// /// NOTE: The default platform **must** be set for this view! - fn add_auto_function(&self, address: u64) -> Option> { + pub fn add_auto_function(&self, address: u64) -> Option> { let platform = self.default_platform()?; self.add_auto_function_with_platform(address, &platform) } /// Add an auto function at the given `address` with the `platform`. /// - /// Use [`BinaryViewExt::add_auto_function_ext`] if you wish to specify a function type. + /// Use [`BinaryView::add_auto_function_ext`] if you wish to specify a function type. /// /// NOTE: If the view's default platform is not set, this will set it to `platform`. - fn add_auto_function_with_platform( + pub fn add_auto_function_with_platform( &self, address: u64, platform: &Platform, @@ -1268,7 +1812,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// Add an auto function at the given `address` with the `platform` and function type. /// /// NOTE: If the view's default platform is not set, this will set it to `platform`. - fn add_auto_function_ext( + pub fn add_auto_function_ext( &self, address: u64, platform: &Platform, @@ -1280,13 +1824,8 @@ pub trait BinaryViewExt: BinaryViewBase { None => std::ptr::null_mut(), }; - let handle = BNAddFunctionForAnalysis( - self.as_ref().handle, - platform.handle, - address, - true, - func_type, - ); + let handle = + BNAddFunctionForAnalysis(self.handle, platform.handle, address, true, func_type); if handle.is_null() { return None; @@ -1300,21 +1839,21 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// Pass `true` for `update_refs` to update all references of the function. /// - /// NOTE: Unlike [`BinaryViewExt::remove_user_function`], this will NOT prohibit the function from - /// being re-added in the future, use [`BinaryViewExt::remove_user_function`] to blacklist the + /// NOTE: Unlike [`BinaryView::remove_user_function`], this will NOT prohibit the function from + /// being re-added in the future, use [`BinaryView::remove_user_function`] to blacklist the /// function from being automatically created. - fn remove_auto_function(&self, func: &Function, update_refs: bool) { + pub fn remove_auto_function(&self, func: &Function, update_refs: bool) { unsafe { - BNRemoveAnalysisFunction(self.as_ref().handle, func.handle, update_refs); + BNRemoveAnalysisFunction(self.handle, func.handle, update_refs); } } /// Add a user function at the given `address` with the views default platform. /// - /// Use [`BinaryViewExt::add_user_function_with_platform`] if you wish to specify a platform. + /// Use [`BinaryView::add_user_function_with_platform`] if you wish to specify a platform. /// /// NOTE: The default platform **must** be set for this view! - fn add_user_function(&self, addr: u64) -> Option> { + pub fn add_user_function(&self, addr: u64) -> Option> { let platform = self.default_platform()?; self.add_user_function_with_platform(addr, &platform) } @@ -1322,13 +1861,13 @@ pub trait BinaryViewExt: BinaryViewBase { /// Add an auto function at the given `address` with the `platform`. /// /// NOTE: If the view's default platform is not set, this will set it to `platform`. - fn add_user_function_with_platform( + pub fn add_user_function_with_platform( &self, addr: u64, platform: &Platform, ) -> Option> { unsafe { - let func = BNCreateUserFunction(self.as_ref().handle, platform.handle, addr); + let func = BNCreateUserFunction(self.handle, platform.handle, addr); if func.is_null() { return None; } @@ -1338,19 +1877,19 @@ pub trait BinaryViewExt: BinaryViewBase { /// Removes the function from the view and blacklists it from being created automatically. /// - /// NOTE: If you call [`BinaryViewExt::add_user_function`], it will override the blacklist. - fn remove_user_function(&self, func: &Function) { - unsafe { BNRemoveUserFunction(self.as_ref().handle, func.handle) } + /// NOTE: If you call [`BinaryView::add_user_function`], it will override the blacklist. + pub fn remove_user_function(&self, func: &Function) { + unsafe { BNRemoveUserFunction(self.handle, func.handle) } } - fn has_functions(&self) -> bool { - unsafe { BNHasFunctions(self.as_ref().handle) } + pub fn has_functions(&self) -> bool { + unsafe { BNHasFunctions(self.handle) } } /// Add an entry point at the given `address` with the view's default platform. /// /// NOTE: The default platform **must** be set for this view! - fn add_entry_point(&self, addr: u64) { + pub fn add_entry_point(&self, addr: u64) { if let Some(platform) = self.default_platform() { self.add_entry_point_with_platform(addr, &platform); } @@ -1359,15 +1898,15 @@ pub trait BinaryViewExt: BinaryViewBase { /// Add an entry point at the given `address` with the `platform`. /// /// NOTE: If the view's default platform is not set, this will set it to `platform`. - fn add_entry_point_with_platform(&self, addr: u64, platform: &Platform) { + pub fn add_entry_point_with_platform(&self, addr: u64, platform: &Platform) { unsafe { - BNAddEntryPointForAnalysis(self.as_ref().handle, platform.handle, addr); + BNAddEntryPointForAnalysis(self.handle, platform.handle, addr); } } - fn entry_point_function(&self) -> Option> { + pub fn entry_point_function(&self) -> Option> { unsafe { - let raw_func_ptr = BNGetAnalysisEntryPoint(self.as_ref().handle); + let raw_func_ptr = BNGetAnalysisEntryPoint(self.handle); match raw_func_ptr.is_null() { false => Some(Function::ref_from_raw(raw_func_ptr)), true => None, @@ -1380,41 +1919,39 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// We see `entry_functions` as good starting points for analysis, these functions normally don't /// have internal references. Exported functions in a dll/so file are not included. - fn entry_point_functions(&self) -> Array { + pub fn entry_point_functions(&self) -> Array { unsafe { let mut count = 0; - let functions = BNGetAllEntryFunctions(self.as_ref().handle, &mut count); + let functions = BNGetAllEntryFunctions(self.handle, &mut count); Array::new(functions, count, ()) } } - fn functions(&self) -> Array { + pub fn functions(&self) -> Array { unsafe { let mut count = 0; - let functions = BNGetAnalysisFunctionList(self.as_ref().handle, &mut count); + let functions = BNGetAnalysisFunctionList(self.handle, &mut count); Array::new(functions, count, ()) } } /// List of functions *starting* at `addr` - fn functions_at(&self, addr: u64) -> Array { + pub fn functions_at(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let functions = - BNGetAnalysisFunctionsForAddress(self.as_ref().handle, addr, &mut count); + let functions = BNGetAnalysisFunctionsForAddress(self.handle, addr, &mut count); Array::new(functions, count, ()) } } /// List of functions containing `addr` - fn functions_containing(&self, addr: u64) -> Array { + pub fn functions_containing(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let functions = - BNGetAnalysisFunctionsContainingAddress(self.as_ref().handle, addr, &mut count); + let functions = BNGetAnalysisFunctionsContainingAddress(self.handle, addr, &mut count); Array::new(functions, count, ()) } @@ -1429,7 +1966,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// # Params /// - `name`: Name that the function should have /// - `plat`: Optional platform that the function should be defined for. Defaults to all platforms if `None` passed. - fn functions_by_name( + pub fn functions_by_name( &self, name: impl IntoCStr, plat: Option<&Platform>, @@ -1459,9 +1996,9 @@ pub trait BinaryViewExt: BinaryViewBase { functions } - fn function_at(&self, platform: &Platform, addr: u64) -> Option> { + pub fn function_at(&self, platform: &Platform, addr: u64) -> Option> { unsafe { - let raw_func_ptr = BNGetAnalysisFunction(self.as_ref().handle, platform.handle, addr); + let raw_func_ptr = BNGetAnalysisFunction(self.handle, platform.handle, addr); match raw_func_ptr.is_null() { false => Some(Function::ref_from_raw(raw_func_ptr)), true => None, @@ -1469,42 +2006,42 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn function_start_before(&self, addr: u64) -> u64 { - unsafe { BNGetPreviousFunctionStartBeforeAddress(self.as_ref().handle, addr) } + pub fn function_start_before(&self, addr: u64) -> u64 { + unsafe { BNGetPreviousFunctionStartBeforeAddress(self.handle, addr) } } - fn function_start_after(&self, addr: u64) -> u64 { - unsafe { BNGetNextFunctionStartAfterAddress(self.as_ref().handle, addr) } + pub fn function_start_after(&self, addr: u64) -> u64 { + unsafe { BNGetNextFunctionStartAfterAddress(self.handle, addr) } } - fn basic_blocks_containing(&self, addr: u64) -> Array> { + pub fn basic_blocks_containing(&self, addr: u64) -> Array> { unsafe { let mut count = 0; - let blocks = BNGetBasicBlocksForAddress(self.as_ref().handle, addr, &mut count); + let blocks = BNGetBasicBlocksForAddress(self.handle, addr, &mut count); Array::new(blocks, count, NativeBlock::new()) } } - fn basic_blocks_starting_at(&self, addr: u64) -> Array> { + pub fn basic_blocks_starting_at(&self, addr: u64) -> Array> { unsafe { let mut count = 0; - let blocks = BNGetBasicBlocksStartingAtAddress(self.as_ref().handle, addr, &mut count); + let blocks = BNGetBasicBlocksStartingAtAddress(self.handle, addr, &mut count); Array::new(blocks, count, NativeBlock::new()) } } - fn is_new_auto_function_analysis_suppressed(&self) -> bool { - unsafe { BNGetNewAutoFunctionAnalysisSuppressed(self.as_ref().handle) } + pub fn is_new_auto_function_analysis_suppressed(&self) -> bool { + unsafe { BNGetNewAutoFunctionAnalysisSuppressed(self.handle) } } - fn set_new_auto_function_analysis_suppressed(&self, suppress: bool) { + pub fn set_new_auto_function_analysis_suppressed(&self, suppress: bool) { unsafe { - BNSetNewAutoFunctionAnalysisSuppressed(self.as_ref().handle, suppress); + BNSetNewAutoFunctionAnalysisSuppressed(self.handle, suppress); } } // TODO: Should this instead be implemented on [`Function`] considering `src_func`? `Location` is local to the source function. - fn should_skip_target_analysis( + pub fn should_skip_target_analysis( &self, src_loc: impl Into, src_func: &Function, @@ -1515,7 +2052,7 @@ pub trait BinaryViewExt: BinaryViewBase { let target = target.into(); unsafe { BNShouldSkipTargetAnalysis( - self.as_ref().handle, + self.handle, &mut src_loc.into(), src_func.handle, src_end, @@ -1524,8 +2061,8 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn read_buffer(&self, offset: u64, len: usize) -> Option { - let read_buffer = unsafe { BNReadViewBuffer(self.as_ref().handle, offset, len) }; + pub fn read_buffer(&self, offset: u64, len: usize) -> Option { + let read_buffer = unsafe { BNReadViewBuffer(self.handle, offset, len) }; if read_buffer.is_null() { None } else { @@ -1533,37 +2070,37 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn debug_info(&self) -> Ref { - unsafe { DebugInfo::ref_from_raw(BNGetDebugInfo(self.as_ref().handle)) } + pub fn debug_info(&self) -> Ref { + unsafe { DebugInfo::ref_from_raw(BNGetDebugInfo(self.handle)) } } - fn set_debug_info(&self, debug_info: &DebugInfo) { - unsafe { BNSetDebugInfo(self.as_ref().handle, debug_info.handle) } + pub fn set_debug_info(&self, debug_info: &DebugInfo) { + unsafe { BNSetDebugInfo(self.handle, debug_info.handle) } } - fn apply_debug_info(&self, debug_info: &DebugInfo) { - unsafe { BNApplyDebugInfo(self.as_ref().handle, debug_info.handle) } + pub fn apply_debug_info(&self, debug_info: &DebugInfo) { + unsafe { BNApplyDebugInfo(self.handle, debug_info.handle) } } - fn show_plaintext_report(&self, title: &str, plaintext: &str) { + pub fn show_plaintext_report(&self, title: &str, plaintext: &str) { let title = title.to_cstr(); let plaintext = plaintext.to_cstr(); unsafe { BNShowPlainTextReport( - self.as_ref().handle, + self.handle, title.as_ref().as_ptr() as *mut _, plaintext.as_ref().as_ptr() as *mut _, ) } } - fn show_markdown_report(&self, title: &str, contents: &str, plaintext: &str) { + pub fn show_markdown_report(&self, title: &str, contents: &str, plaintext: &str) { let title = title.to_cstr(); let contents = contents.to_cstr(); let plaintext = plaintext.to_cstr(); unsafe { BNShowMarkdownReport( - self.as_ref().handle, + self.handle, title.as_ref().as_ptr() as *mut _, contents.as_ref().as_ptr() as *mut _, plaintext.as_ref().as_ptr() as *mut _, @@ -1571,13 +2108,13 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn show_html_report(&self, title: &str, contents: &str, plaintext: &str) { + pub fn show_html_report(&self, title: &str, contents: &str, plaintext: &str) { let title = title.to_cstr(); let contents = contents.to_cstr(); let plaintext = plaintext.to_cstr(); unsafe { BNShowHTMLReport( - self.as_ref().handle, + self.handle, title.as_ref().as_ptr() as *mut _, contents.as_ref().as_ptr() as *mut _, plaintext.as_ref().as_ptr() as *mut _, @@ -1585,34 +2122,28 @@ pub trait BinaryViewExt: BinaryViewBase { } } - fn show_graph_report(&self, raw_name: &str, graph: &FlowGraph) { + pub fn show_graph_report(&self, raw_name: &str, graph: &FlowGraph) { let raw_name = raw_name.to_cstr(); unsafe { - BNShowGraphReport(self.as_ref().handle, raw_name.as_ptr(), graph.handle); + BNShowGraphReport(self.handle, raw_name.as_ptr(), graph.handle); } } - fn load_settings(&self, view_type_name: &str) -> Result> { + pub fn load_settings(&self, view_type_name: &str) -> Ref { let view_type_name = view_type_name.to_cstr(); let settings_handle = - unsafe { BNBinaryViewGetLoadSettings(self.as_ref().handle, view_type_name.as_ptr()) }; - - if settings_handle.is_null() { - Err(()) - } else { - Ok(unsafe { Settings::ref_from_raw(settings_handle) }) + unsafe { BNBinaryViewGetLoadSettings(self.handle, view_type_name.as_ptr()) }; + match settings_handle.is_null() { + true => Settings::new(), + false => unsafe { Settings::ref_from_raw(settings_handle) }, } } - fn set_load_settings(&self, view_type_name: &str, settings: &Settings) { + pub fn set_load_settings(&self, view_type_name: &str, settings: &Settings) { let view_type_name = view_type_name.to_cstr(); unsafe { - BNBinaryViewSetLoadSettings( - self.as_ref().handle, - view_type_name.as_ptr(), - settings.handle, - ) + BNBinaryViewSetLoadSettings(self.handle, view_type_name.as_ptr(), settings.handle) }; } @@ -1621,24 +2152,24 @@ pub trait BinaryViewExt: BinaryViewBase { /// # Arguments /// * `name` - the name for the tag /// * `icon` - the icon (recommended 1 emoji or 2 chars) for the tag - fn create_tag_type(&self, name: &str, icon: &str) -> Ref { - let tag_type = TagType::create(self.as_ref(), name, icon); + pub fn create_tag_type(&self, name: &str, icon: &str) -> Ref { + let tag_type = TagType::create(self, name, icon); unsafe { - BNAddTagType(self.as_ref().handle, tag_type.handle); + BNAddTagType(self.handle, tag_type.handle); } tag_type } /// Removes a [TagType] and all tags that use it - fn remove_tag_type(&self, tag_type: &TagType) { - unsafe { BNRemoveTagType(self.as_ref().handle, tag_type.handle) } + pub fn remove_tag_type(&self, tag_type: &TagType) { + unsafe { BNRemoveTagType(self.handle, tag_type.handle) } } /// Get a tag type by its name. - fn tag_type_by_name(&self, name: &str) -> Option> { + pub fn tag_type_by_name(&self, name: &str) -> Option> { let name = name.to_cstr(); unsafe { - let handle = BNGetTagType(self.as_ref().handle, name.as_ptr()); + let handle = BNGetTagType(self.handle, name.as_ptr()); if handle.is_null() { return None; } @@ -1647,29 +2178,29 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Get all tags in all scopes - fn tags_all_scopes(&self) -> Array { + pub fn tags_all_scopes(&self) -> Array { let mut count = 0; unsafe { - let tag_references = BNGetAllTagReferences(self.as_ref().handle, &mut count); + let tag_references = BNGetAllTagReferences(self.handle, &mut count); Array::new(tag_references, count, ()) } } /// Get all tag types present for the view - fn tag_types(&self) -> Array { + pub fn tag_types(&self) -> Array { let mut count = 0; unsafe { - let tag_types_raw = BNGetTagTypes(self.as_ref().handle, &mut count); + let tag_types_raw = BNGetTagTypes(self.handle, &mut count); Array::new(tag_types_raw, count, ()) } } /// Get all tag references of a specific type - fn tags_by_type(&self, tag_type: &TagType) -> Array { + pub fn tags_by_type(&self, tag_type: &TagType) -> Array { let mut count = 0; unsafe { let tag_references = - BNGetAllTagReferencesOfType(self.as_ref().handle, tag_type.handle, &mut count); + BNGetAllTagReferencesOfType(self.handle, tag_type.handle, &mut count); Array::new(tag_references, count, ()) } } @@ -1677,10 +2208,10 @@ pub trait BinaryViewExt: BinaryViewBase { /// Get a tag by its id. /// /// Note this does not tell you anything about where it is used. - fn tag_by_id(&self, id: &str) -> Option> { + pub fn tag_by_id(&self, id: &str) -> Option> { let id = id.to_cstr(); unsafe { - let handle = BNGetTag(self.as_ref().handle, id.as_ptr()); + let handle = BNGetTag(self.handle, id.as_ptr()); if handle.is_null() { return None; } @@ -1691,55 +2222,54 @@ pub trait BinaryViewExt: BinaryViewBase { /// Creates and adds a tag to an address /// /// User tag creations will be added to the undo buffer - fn add_tag(&self, addr: u64, t: &TagType, data: &str, user: bool) { + pub fn add_tag(&self, addr: u64, t: &TagType, data: &str, user: bool) { let tag = Tag::new(t, data); - unsafe { BNAddTag(self.as_ref().handle, tag.handle, user) } + unsafe { BNAddTag(self.handle, tag.handle, user) } if user { - unsafe { BNAddUserDataTag(self.as_ref().handle, addr, tag.handle) } + unsafe { BNAddUserDataTag(self.handle, addr, tag.handle) } } else { - unsafe { BNAddAutoDataTag(self.as_ref().handle, addr, tag.handle) } + unsafe { BNAddAutoDataTag(self.handle, addr, tag.handle) } } } /// removes a Tag object at a data address. - fn remove_auto_data_tag(&self, addr: u64, tag: &Tag) { - unsafe { BNRemoveAutoDataTag(self.as_ref().handle, addr, tag.handle) } + pub fn remove_auto_data_tag(&self, addr: u64, tag: &Tag) { + unsafe { BNRemoveAutoDataTag(self.handle, addr, tag.handle) } } /// removes a Tag object at a data address. /// Since this removes a user tag, it will be added to the current undo buffer. - fn remove_user_data_tag(&self, addr: u64, tag: &Tag) { - unsafe { BNRemoveUserDataTag(self.as_ref().handle, addr, tag.handle) } + pub fn remove_user_data_tag(&self, addr: u64, tag: &Tag) { + unsafe { BNRemoveUserDataTag(self.handle, addr, tag.handle) } } /// Retrieves a list of comment addresses, the comments themselves can then be queried with - /// the function [`BinaryViewExt::comment_at`]. + /// the function [`BinaryView::comment_at`]. /// /// If you would rather retrieve the contents of **all** comments at once you can do so with - /// the helper function [`BinaryViewExt::comments`]. - fn comment_references(&self) -> Array { + /// the helper function [`BinaryView::comments`]. + pub fn comment_references(&self) -> Array { let mut count = 0; - let addresses_raw = - unsafe { BNGetGlobalCommentedAddresses(self.as_ref().handle, &mut count) }; + let addresses_raw = unsafe { BNGetGlobalCommentedAddresses(self.handle, &mut count) }; unsafe { Array::new(addresses_raw, count, ()) } } /// Retrieves a map of comment addresses to their contents. /// /// This is a helper function that eagerly reads the contents of all comments within the - /// view, use [`BinaryViewExt::comment_references`] instead if you do not wish to read all the comments. - fn comments(&self) -> BTreeMap { + /// view, use [`BinaryView::comment_references`] instead if you do not wish to read all the comments. + pub fn comments(&self) -> BTreeMap { self.comment_references() .iter() .filter_map(|cmt_ref| Some((cmt_ref.start, self.comment_at(cmt_ref.start)?))) .collect() } - fn comment_at(&self, addr: u64) -> Option { + pub fn comment_at(&self, addr: u64) -> Option { unsafe { - let comment_raw = BNGetGlobalCommentForAddress(self.as_ref().handle, addr); + let comment_raw = BNGetGlobalCommentForAddress(self.handle, addr); match comment_raw.is_null() { false => Some(BnString::into_string(comment_raw)), true => None, @@ -1751,9 +2281,9 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// NOTE: This is different from setting a comment at the function-level. To set a comment in a /// function use [`Function::set_comment_at`] - fn set_comment_at(&self, addr: u64, comment: &str) { + pub fn set_comment_at(&self, addr: u64, comment: &str) { let comment_raw = comment.to_cstr(); - unsafe { BNSetGlobalCommentForAddress(self.as_ref().handle, addr, comment_raw.as_ptr()) } + unsafe { BNSetGlobalCommentForAddress(self.handle, addr, comment_raw.as_ptr()) } } /// Retrieves a list of the next disassembly lines. @@ -1764,7 +2294,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// # Arguments /// * `pos` - Position to retrieve linear disassembly lines from - fn get_next_linear_disassembly_lines( + pub fn get_next_linear_disassembly_lines( &self, pos: &mut LinearViewCursor, ) -> Array { @@ -1788,7 +2318,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// # Arguments /// * `pos` - Position to retrieve linear disassembly lines relative to - fn get_previous_linear_disassembly_lines( + pub fn get_previous_linear_disassembly_lines( &self, pos: &mut LinearViewCursor, ) -> Array { @@ -1804,10 +2334,10 @@ pub trait BinaryViewExt: BinaryViewBase { result } - fn query_metadata(&self, key: &str) -> Option> { + pub fn query_metadata(&self, key: &str) -> Option> { let key = key.to_cstr(); let value: *mut BNMetadata = - unsafe { BNBinaryViewQueryMetadata(self.as_ref().handle, key.as_ptr()) }; + unsafe { BNBinaryViewQueryMetadata(self.handle, key.as_ptr()) }; if value.is_null() { None } else { @@ -1818,50 +2348,45 @@ pub trait BinaryViewExt: BinaryViewBase { /// Retrieve the metadata as the type `T`. /// /// Fails if the metadata does not exist, or if the metadata failed to coerce to type `T`. - fn get_metadata(&self, key: &str) -> Option> + pub fn get_metadata(&self, key: &str) -> Option where T: for<'a> TryFrom<&'a Metadata>, { self.query_metadata(key) - .map(|md| T::try_from(md.as_ref()).map_err(|_| ())) + .and_then(|md| T::try_from(md.as_ref()).ok()) } - fn store_metadata(&self, key: &str, value: V, is_auto: bool) + pub fn store_metadata(&self, key: &str, value: V, is_auto: bool) where V: Into>, { let md = value.into(); let key = key.to_cstr(); unsafe { - BNBinaryViewStoreMetadata( - self.as_ref().handle, - key.as_ptr(), - md.as_ref().handle, - is_auto, - ) + BNBinaryViewStoreMetadata(self.handle, key.as_ptr(), md.as_ref().handle, is_auto) }; } - fn remove_metadata(&self, key: &str) { + pub fn remove_metadata(&self, key: &str) { let key = key.to_cstr(); - unsafe { BNBinaryViewRemoveMetadata(self.as_ref().handle, key.as_ptr()) }; + unsafe { BNBinaryViewRemoveMetadata(self.handle, key.as_ptr()) }; } /// Retrieves a list of [CodeReference]s pointing to a given address. - fn code_refs_to_addr(&self, addr: u64) -> Array { + pub fn code_refs_to_addr(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let handle = BNGetCodeReferences(self.as_ref().handle, addr, &mut count, false, 0); + let handle = BNGetCodeReferences(self.handle, addr, &mut count, false, 0); Array::new(handle, count, ()) } } /// Retrieves a list of [CodeReference]s pointing into a given [Range]. - fn code_refs_into_range(&self, range: Range) -> Array { + pub fn code_refs_into_range(&self, range: Range) -> Array { unsafe { let mut count = 0; let handle = BNGetCodeReferencesInRange( - self.as_ref().handle, + self.handle, range.start, range.end - range.start, &mut count, @@ -1873,14 +2398,13 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Retrieves a list of addresses pointed to by a given address. - fn code_refs_from_addr(&self, addr: u64, func: Option<&Function>) -> Vec { + pub fn code_refs_from_addr(&self, addr: u64, func: Option<&Function>) -> Vec { unsafe { let mut count = 0; let code_ref = CodeReference::new(addr, func.map(|f| f.to_owned()), func.map(|f| f.arch())); let mut raw_code_ref = CodeReference::into_owned_raw(&code_ref); - let addresses = - BNGetCodeReferencesFrom(self.as_ref().handle, &mut raw_code_ref, &mut count); + let addresses = BNGetCodeReferencesFrom(self.handle, &mut raw_code_ref, &mut count); let res = std::slice::from_raw_parts(addresses, count).to_vec(); BNFreeAddressList(addresses); res @@ -1888,20 +2412,20 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Retrieves a list of [DataReference]s pointing to a given address. - fn data_refs_to_addr(&self, addr: u64) -> Array { + pub fn data_refs_to_addr(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let handle = BNGetDataReferences(self.as_ref().handle, addr, &mut count, false, 0); + let handle = BNGetDataReferences(self.handle, addr, &mut count, false, 0); Array::new(handle, count, ()) } } /// Retrieves a list of [DataReference]s pointing into a given [Range]. - fn data_refs_into_range(&self, range: Range) -> Array { + pub fn data_refs_into_range(&self, range: Range) -> Array { unsafe { let mut count = 0; let handle = BNGetDataReferencesInRange( - self.as_ref().handle, + self.handle, range.start, range.end - range.start, &mut count, @@ -1913,60 +2437,56 @@ pub trait BinaryViewExt: BinaryViewBase { } /// Retrieves a list of [DataReference]s originating from a given address. - fn data_refs_from_addr(&self, addr: u64) -> Array { + pub fn data_refs_from_addr(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let handle = BNGetDataReferencesFrom(self.as_ref().handle, addr, &mut count); + let handle = BNGetDataReferencesFrom(self.handle, addr, &mut count); Array::new(handle, count, ()) } } /// Retrieves a list of [CodeReference]s for locations in code that use a given named type. - fn code_refs_using_type_name>(&self, name: T) -> Array { + pub fn code_refs_using_type_name>( + &self, + name: T, + ) -> Array { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { let mut count = 0; - let handle = BNGetCodeReferencesForType( - self.as_ref().handle, - &mut raw_name, - &mut count, - false, - 0, - ); + let handle = + BNGetCodeReferencesForType(self.handle, &mut raw_name, &mut count, false, 0); QualifiedName::free_raw(raw_name); Array::new(handle, count, ()) } } /// Retrieves a list of [DataReference]s for locations in data that use a given named type. - fn data_refs_using_type_name>(&self, name: T) -> Array { + pub fn data_refs_using_type_name>( + &self, + name: T, + ) -> Array { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { let mut count = 0; - let handle = BNGetDataReferencesForType( - self.as_ref().handle, - &mut raw_name, - &mut count, - false, - 0, - ); + let handle = + BNGetDataReferencesForType(self.handle, &mut raw_name, &mut count, false, 0); QualifiedName::free_raw(raw_name); Array::new(handle, count, ()) } } - fn relocations_at(&self, addr: u64) -> Array { + pub fn relocations_at(&self, addr: u64) -> Array { unsafe { let mut count = 0; - let handle = BNGetRelocationsAt(self.as_ref().handle, addr, &mut count); + let handle = BNGetRelocationsAt(self.handle, addr, &mut count); Array::new(handle, count, ()) } } - fn relocation_ranges(&self) -> Vec> { + pub fn relocation_ranges(&self) -> Vec> { let ranges = unsafe { let mut count = 0; - let reloc_ranges_ptr = BNGetRelocationRanges(self.as_ref().handle, &mut count); + let reloc_ranges_ptr = BNGetRelocationRanges(self.handle, &mut count); let ranges = std::slice::from_raw_parts(reloc_ranges_ptr, count).to_vec(); BNFreeRelocationRanges(reloc_ranges_ptr); ranges @@ -1982,64 +2502,62 @@ pub trait BinaryViewExt: BinaryViewBase { .collect() } - fn component_by_guid(&self, guid: &str) -> Option> { + pub fn component_by_guid(&self, guid: &str) -> Option> { let name = guid.to_cstr(); - let result = unsafe { BNGetComponentByGuid(self.as_ref().handle, name.as_ptr()) }; + let result = unsafe { BNGetComponentByGuid(self.handle, name.as_ptr()) }; NonNull::new(result).map(|h| unsafe { Component::ref_from_raw(h) }) } - fn root_component(&self) -> Option> { - let result = unsafe { BNGetRootComponent(self.as_ref().handle) }; + pub fn root_component(&self) -> Option> { + let result = unsafe { BNGetRootComponent(self.handle) }; NonNull::new(result).map(|h| unsafe { Component::ref_from_raw(h) }) } - fn component_by_path(&self, path: &str) -> Option> { + pub fn component_by_path(&self, path: &str) -> Option> { let path = path.to_cstr(); - let result = unsafe { BNGetComponentByPath(self.as_ref().handle, path.as_ptr()) }; + let result = unsafe { BNGetComponentByPath(self.handle, path.as_ptr()) }; NonNull::new(result).map(|h| unsafe { Component::ref_from_raw(h) }) } - fn remove_component(&self, component: &Component) -> bool { - unsafe { BNRemoveComponent(self.as_ref().handle, component.handle.as_ptr()) } + pub fn remove_component(&self, component: &Component) -> bool { + unsafe { BNRemoveComponent(self.handle, component.handle.as_ptr()) } } - fn remove_component_by_guid(&self, guid: &str) -> bool { + pub fn remove_component_by_guid(&self, guid: &str) -> bool { let path = guid.to_cstr(); - unsafe { BNRemoveComponentByGuid(self.as_ref().handle, path.as_ptr()) } + unsafe { BNRemoveComponentByGuid(self.handle, path.as_ptr()) } } - fn data_variable_parent_components(&self, data_variable: &DataVariable) -> Array { + pub fn data_variable_parent_components( + &self, + data_variable: &DataVariable, + ) -> Array { let mut count = 0; let result = unsafe { - BNGetDataVariableParentComponents( - self.as_ref().handle, - data_variable.address, - &mut count, - ) + BNGetDataVariableParentComponents(self.handle, data_variable.address, &mut count) }; unsafe { Array::new(result, count, ()) } } - fn external_libraries(&self) -> Array { + pub fn external_libraries(&self) -> Array { let mut count = 0; - let result = unsafe { BNBinaryViewGetExternalLibraries(self.as_ref().handle, &mut count) }; + let result = unsafe { BNBinaryViewGetExternalLibraries(self.handle, &mut count) }; unsafe { Array::new(result, count, ()) } } - fn external_library(&self, name: &str) -> Option> { + pub fn external_library(&self, name: &str) -> Option> { let name_ptr = name.to_cstr(); - let result = - unsafe { BNBinaryViewGetExternalLibrary(self.as_ref().handle, name_ptr.as_ptr()) }; + let result = unsafe { BNBinaryViewGetExternalLibrary(self.handle, name_ptr.as_ptr()) }; let result_ptr = NonNull::new(result)?; Some(unsafe { ExternalLibrary::ref_from_raw(result_ptr) }) } - fn remove_external_library(&self, name: &str) { + pub fn remove_external_library(&self, name: &str) { let name_ptr = name.to_cstr(); - unsafe { BNBinaryViewRemoveExternalLibrary(self.as_ref().handle, name_ptr.as_ptr()) }; + unsafe { BNBinaryViewRemoveExternalLibrary(self.handle, name_ptr.as_ptr()) }; } - fn add_external_library( + pub fn add_external_library( &self, name: &str, backing_file: Option<&ProjectFile>, @@ -2048,7 +2566,7 @@ pub trait BinaryViewExt: BinaryViewBase { let name_ptr = name.to_cstr(); let result = unsafe { BNBinaryViewAddExternalLibrary( - self.as_ref().handle, + self.handle, name_ptr.as_ptr(), backing_file .map(|b| b.handle.as_ptr()) @@ -2059,29 +2577,28 @@ pub trait BinaryViewExt: BinaryViewBase { NonNull::new(result).map(|h| unsafe { ExternalLibrary::ref_from_raw(h) }) } - fn external_locations(&self) -> Array { + pub fn external_locations(&self) -> Array { let mut count = 0; - let result = unsafe { BNBinaryViewGetExternalLocations(self.as_ref().handle, &mut count) }; + let result = unsafe { BNBinaryViewGetExternalLocations(self.handle, &mut count) }; unsafe { Array::new(result, count, ()) } } - fn external_location_from_symbol(&self, symbol: &Symbol) -> Option> { - let result = - unsafe { BNBinaryViewGetExternalLocation(self.as_ref().handle, symbol.handle) }; + pub fn external_location_from_symbol(&self, symbol: &Symbol) -> Option> { + let result = unsafe { BNBinaryViewGetExternalLocation(self.handle, symbol.handle) }; let result_ptr = NonNull::new(result)?; Some(unsafe { ExternalLocation::ref_from_raw(result_ptr) }) } - fn remove_external_location(&self, location: &ExternalLocation) { + pub fn remove_external_location(&self, location: &ExternalLocation) { self.remove_external_location_from_symbol(&location.source_symbol()) } - fn remove_external_location_from_symbol(&self, symbol: &Symbol) { - unsafe { BNBinaryViewRemoveExternalLocation(self.as_ref().handle, symbol.handle) }; + pub fn remove_external_location_from_symbol(&self, symbol: &Symbol) { + unsafe { BNBinaryViewRemoveExternalLocation(self.handle, symbol.handle) }; } // TODO: This is awful, rewrite this. - fn add_external_location( + pub fn add_external_location( &self, symbol: &Symbol, library: &ExternalLibrary, @@ -2095,7 +2612,7 @@ pub trait BinaryViewExt: BinaryViewBase { .unwrap_or(std::ptr::null_mut()); let result = unsafe { BNBinaryViewAddExternalLocation( - self.as_ref().handle, + self.handle, symbol.handle, library.handle.as_ptr(), target_symbol_name.as_ptr(), @@ -2109,17 +2626,16 @@ pub trait BinaryViewExt: BinaryViewBase { /// Type container for all types (user and auto) in the Binary View. /// /// NOTE: Modifying an auto type will promote it to a user type. - fn type_container(&self) -> TypeContainer { - let type_container_ptr = - NonNull::new(unsafe { BNGetAnalysisTypeContainer(self.as_ref().handle) }); + pub fn type_container(&self) -> TypeContainer { + let type_container_ptr = NonNull::new(unsafe { BNGetAnalysisTypeContainer(self.handle) }); // NOTE: I have no idea how this isn't a UAF, see the note in `TypeContainer::from_raw` unsafe { TypeContainer::from_raw(type_container_ptr.unwrap()) } } /// Type container for user types in the Binary View. - fn user_type_container(&self) -> TypeContainer { + pub fn user_type_container(&self) -> TypeContainer { let type_container_ptr = - NonNull::new(unsafe { BNGetAnalysisUserTypeContainer(self.as_ref().handle) }); + NonNull::new(unsafe { BNGetAnalysisUserTypeContainer(self.handle) }); // NOTE: I have no idea how this isn't a UAF, see the note in `TypeContainer::from_raw` unsafe { TypeContainer::from_raw(type_container_ptr.unwrap()) }.clone() } @@ -2127,39 +2643,39 @@ pub trait BinaryViewExt: BinaryViewBase { /// Type container for auto types in the Binary View. /// /// NOTE: Unlike [`Self::type_container`] modification of auto types will **NOT** promote it to a user type. - fn auto_type_container(&self) -> TypeContainer { + pub fn auto_type_container(&self) -> TypeContainer { let type_container_ptr = - NonNull::new(unsafe { BNGetAnalysisAutoTypeContainer(self.as_ref().handle) }); + NonNull::new(unsafe { BNGetAnalysisAutoTypeContainer(self.handle) }); // NOTE: I have no idea how this isn't a UAF, see the note in `TypeContainer::from_raw` unsafe { TypeContainer::from_raw(type_container_ptr.unwrap()) } } - fn type_libraries(&self) -> Array { + pub fn type_libraries(&self) -> Array { let mut count = 0; - let result = unsafe { BNGetBinaryViewTypeLibraries(self.as_ref().handle, &mut count) }; + let result = unsafe { BNGetBinaryViewTypeLibraries(self.handle, &mut count) }; unsafe { Array::new(result, count, ()) } } /// Make the contents of a type library available for type/import resolution - fn add_type_library(&self, library: &TypeLibrary) { - unsafe { BNAddBinaryViewTypeLibrary(self.as_ref().handle, library.as_raw()) } + pub fn add_type_library(&self, library: &TypeLibrary) { + unsafe { BNAddBinaryViewTypeLibrary(self.handle, library.as_raw()) } } - fn type_library_by_name(&self, name: &str) -> Option> { + pub fn type_library_by_name(&self, name: &str) -> Option> { let name = name.to_cstr(); - let result = unsafe { BNGetBinaryViewTypeLibrary(self.as_ref().handle, name.as_ptr()) }; + let result = unsafe { BNGetBinaryViewTypeLibrary(self.handle, name.as_ptr()) }; NonNull::new(result).map(|h| unsafe { TypeLibrary::ref_from_raw(h) }) } /// Should be called by custom [`BinaryView`] implementations when they have successfully /// imported an object from a type library (eg a symbol's type). Values recorded with this - /// function will then be queryable via [`BinaryViewExt::lookup_imported_object_library`]. + /// function will then be queryable via [`BinaryView::lookup_imported_object_library`]. /// /// * `lib` - Type Library containing the imported type /// * `name` - Name of the object in the type library /// * `addr` - address of symbol at import site /// * `platform` - Platform of symbol at import site - fn record_imported_object_library>( + pub fn record_imported_object_library>( &self, lib: &TypeLibrary, name: T, @@ -2169,7 +2685,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { BNBinaryViewRecordImportedObjectLibrary( - self.as_ref().handle, + self.handle, platform.handle, addr, lib.as_raw(), @@ -2189,7 +2705,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// Note that the name actually inserted into the view may not match the name as it exists in /// the type library in the event of a name conflict. To aid in this, the [`Type`] object /// returned is a `NamedTypeReference` to the deconflicted name used. - fn import_type_library_type>( + pub fn import_type_library_type>( &self, name: T, lib: Option<&TypeLibrary>, @@ -2199,9 +2715,8 @@ pub trait BinaryViewExt: BinaryViewBase { .map(|l| unsafe { l.as_raw() } as *mut _) .unwrap_or(std::ptr::null_mut()); let mut raw_name = QualifiedName::into_raw(name.into()); - let result = unsafe { - BNBinaryViewImportTypeLibraryType(self.as_ref().handle, &mut lib_ref, &mut raw_name) - }; + let result = + unsafe { BNBinaryViewImportTypeLibraryType(self.handle, &mut lib_ref, &mut raw_name) }; QualifiedName::free_raw(raw_name); (!result.is_null()).then(|| unsafe { Type::ref_from_raw(result) }) } @@ -2214,9 +2729,9 @@ pub trait BinaryViewExt: BinaryViewBase { /// libraries are lazily resolved when references to types provided by them are first encountered. /// /// NOTE: If you are implementing a custom [`BinaryView`] and use this method to import object types, - /// you should then call [BinaryViewExt::record_imported_object_library] with the details of + /// you should then call [BinaryView::record_imported_object_library] with the details of /// where the object is located. - fn import_type_library_object>( + pub fn import_type_library_object>( &self, name: T, lib: Option<&TypeLibrary>, @@ -2227,17 +2742,16 @@ pub trait BinaryViewExt: BinaryViewBase { .unwrap_or(std::ptr::null_mut()); let mut raw_name = QualifiedName::into_raw(name.into()); let result = unsafe { - BNBinaryViewImportTypeLibraryObject(self.as_ref().handle, &mut lib_ref, &mut raw_name) + BNBinaryViewImportTypeLibraryObject(self.handle, &mut lib_ref, &mut raw_name) }; QualifiedName::free_raw(raw_name); (!result.is_null()).then(|| unsafe { Type::ref_from_raw(result) }) } /// Recursively imports a [`Type`] given its GUID from available type libraries. - fn import_type_by_guid(&self, guid: &str) -> Option> { + pub fn import_type_by_guid(&self, guid: &str) -> Option> { let guid = guid.to_cstr(); - let result = - unsafe { BNBinaryViewImportTypeLibraryTypeByGuid(self.as_ref().handle, guid.as_ptr()) }; + let result = unsafe { BNBinaryViewImportTypeLibraryTypeByGuid(self.handle, guid.as_ptr()) }; (!result.is_null()).then(|| unsafe { Type::ref_from_raw(result) }) } @@ -2245,7 +2759,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// As other referenced types are encountered, they are either copied into the destination type library or /// else the type library that provided the referenced type is added as a dependency for the destination library. - fn export_type_to_library>( + pub fn export_type_to_library>( &self, lib: &TypeLibrary, name: T, @@ -2254,7 +2768,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { BNBinaryViewExportTypeToTypeLibrary( - self.as_ref().handle, + self.handle, lib.as_raw(), &mut raw_name, type_obj.handle, @@ -2267,7 +2781,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// As other referenced types are encountered, they are either copied into the destination type library or /// else the type library that provided the referenced type is added as a dependency for the destination library. - fn export_object_to_library>( + pub fn export_object_to_library>( &self, lib: &TypeLibrary, name: T, @@ -2276,7 +2790,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut raw_name = QualifiedName::into_raw(name.into()); unsafe { BNBinaryViewExportObjectToTypeLibrary( - self.as_ref().handle, + self.handle, lib.as_raw(), &mut raw_name, type_obj.handle, @@ -2290,7 +2804,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// * `addr` - address of symbol at import site /// * `platform` - Platform of symbol at import site - fn lookup_imported_object_library( + pub fn lookup_imported_object_library( &self, addr: u64, platform: &Platform, @@ -2299,7 +2813,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut result_name = BNQualifiedName::default(); let success = unsafe { BNBinaryViewLookupImportedObjectLibrary( - self.as_ref().handle, + self.handle, platform.handle, addr, &mut result_lib, @@ -2317,7 +2831,7 @@ pub trait BinaryViewExt: BinaryViewBase { /// Gives you details of from which type library and name a given type in the analysis was imported. /// /// * `name` - Name of type in analysis - fn lookup_imported_type_library>( + pub fn lookup_imported_type_library>( &self, name: T, ) -> Option<(Ref, QualifiedName)> { @@ -2326,7 +2840,7 @@ pub trait BinaryViewExt: BinaryViewBase { let mut result_name = BNQualifiedName::default(); let success = unsafe { BNBinaryViewLookupImportedTypeLibrary( - self.as_ref().handle, + self.handle, &raw_name, &mut result_lib, &mut result_name, @@ -2349,15 +2863,15 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// Some helpers for reading strings are available: /// - /// - [`BinaryViewExt::read_c_string_at`] - /// - [`BinaryViewExt::read_utf8_string_at`] + /// - [`BinaryView::read_c_string_at`] + /// - [`BinaryView::read_utf8_string_at`] /// /// NOTE: This returns discovered strings and is therefore governed by `analysis.limits.minStringLength` /// and other settings. - fn strings(&self) -> Array { + pub fn strings(&self) -> Array { unsafe { let mut count = 0; - let strings = BNGetStrings(self.as_ref().handle, &mut count); + let strings = BNGetStrings(self.handle, &mut count); Array::new(strings, count, ()) } } @@ -2370,14 +2884,14 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// Some helpers for reading strings are available: /// - /// - [`BinaryViewExt::read_c_string_at`] - /// - [`BinaryViewExt::read_utf8_string_at`] + /// - [`BinaryView::read_c_string_at`] + /// - [`BinaryView::read_utf8_string_at`] /// /// NOTE: This returns discovered strings and is therefore governed by `analysis.limits.minStringLength` /// and other settings. - fn string_at(&self, addr: u64) -> Option { + pub fn string_at(&self, addr: u64) -> Option { let mut str_ref = BNStringReference::default(); - let success = unsafe { BNGetStringAtAddress(self.as_ref().handle, addr, &mut str_ref) }; + let success = unsafe { BNGetStringAtAddress(self.handle, addr, &mut str_ref) }; if success { Some(str_ref.into()) } else { @@ -2393,16 +2907,16 @@ pub trait BinaryViewExt: BinaryViewBase { /// /// Some helpers for reading strings are available: /// - /// - [`BinaryViewExt::read_c_string_at`] - /// - [`BinaryViewExt::read_utf8_string_at`] + /// - [`BinaryView::read_c_string_at`] + /// - [`BinaryView::read_utf8_string_at`] /// /// NOTE: This returns discovered strings and is therefore governed by `analysis.limits.minStringLength` /// and other settings. - fn strings_in_range(&self, range: Range) -> Array { + pub fn strings_in_range(&self, range: Range) -> Array { unsafe { let mut count = 0; let strings = BNGetStringsInRange( - self.as_ref().handle, + self.handle, range.start, range.end - range.start, &mut count, @@ -2413,14 +2927,13 @@ pub trait BinaryViewExt: BinaryViewBase { /// Retrieve the attached type archives as their [`TypeArchiveId`]. /// - /// Using the returned id you can retrieve the [`TypeArchive`] with [`BinaryViewExt::type_archive_by_id`]. - fn attached_type_archives(&self) -> Vec { + /// Using the returned id you can retrieve the [`TypeArchive`] with [`BinaryView::type_archive_by_id`]. + pub fn attached_type_archives(&self) -> Vec { let mut ids: *mut *mut c_char = std::ptr::null_mut(); let mut paths: *mut *mut c_char = std::ptr::null_mut(); - let count = - unsafe { BNBinaryViewGetTypeArchives(self.as_ref().handle, &mut ids, &mut paths) }; - // We discard the path here, you can retrieve it later with [`BinaryViewExt::type_archive_path_by_id`], - // this is so we can simplify the return type which will commonly just want to query through to the type + let count = unsafe { BNBinaryViewGetTypeArchives(self.handle, &mut ids, &mut paths) }; + // We discard the path here, you can retrieve it later with [`BinaryView::type_archive_path_by_id`]. + // This is so we can simplify the return type which will commonly just want to query through to the type // archive itself. let _path_list = unsafe { Array::::new(paths, count, ()) }; let id_list = unsafe { Array::::new(ids, count, ()) }; @@ -2433,17 +2946,17 @@ pub trait BinaryViewExt: BinaryViewBase { /// Look up a connected [`TypeArchive`] by its `id`. /// /// NOTE: A [`TypeArchive`] can be attached but not connected, returning `None`. - fn type_archive_by_id(&self, id: &TypeArchiveId) -> Option> { + pub fn type_archive_by_id(&self, id: &TypeArchiveId) -> Option> { let id = id.0.as_str().to_cstr(); - let result = unsafe { BNBinaryViewGetTypeArchive(self.as_ref().handle, id.as_ptr()) }; + let result = unsafe { BNBinaryViewGetTypeArchive(self.handle, id.as_ptr()) }; let result_ptr = NonNull::new(result)?; Some(unsafe { TypeArchive::ref_from_raw(result_ptr) }) } /// Look up the path for an attached (but not necessarily connected) [`TypeArchive`] by its `id`. - fn type_archive_path_by_id(&self, id: &TypeArchiveId) -> Option { + pub fn type_archive_path_by_id(&self, id: &TypeArchiveId) -> Option { let id = id.0.as_str().to_cstr(); - let result = unsafe { BNBinaryViewGetTypeArchivePath(self.as_ref().handle, id.as_ptr()) }; + let result = unsafe { BNBinaryViewGetTypeArchivePath(self.handle, id.as_ptr()) }; if result.is_null() { return None; } @@ -2452,132 +2965,6 @@ pub trait BinaryViewExt: BinaryViewBase { } } -impl BinaryViewExt for T {} - -/// Represents the "whole view" of the binary and its analysis. -/// -/// Analysis information: -/// -/// - [`BinaryViewExt::functions`] -/// - [`BinaryViewExt::data_variables`] -/// - [`BinaryViewExt::strings`] -/// -/// Annotation information: -/// -/// - [`BinaryViewExt::symbols`] -/// - [`BinaryViewExt::tags_all_scopes`] -/// - [`BinaryViewExt::comments`] -/// -/// Data representation and binary information: -/// -/// - [`BinaryViewExt::types`] -/// - [`BinaryViewExt::segments`] -/// - [`BinaryViewExt::sections`] -/// -/// # Cleaning up -/// -/// [`BinaryView`] has a cyclic relationship with the associated [`FileMetadata`], each holds a strong -/// reference to one another, so to properly clean up/free the [`BinaryView`], you must manually close the -/// file using [`FileMetadata::close`], this is not fixable in the general case, until [`FileMetadata`] -/// has only a weak reference to the [`BinaryView`]. -#[derive(PartialEq, Eq, Hash)] -pub struct BinaryView { - pub handle: *mut BNBinaryView, -} - -impl BinaryView { - pub unsafe fn from_raw(handle: *mut BNBinaryView) -> Self { - debug_assert!(!handle.is_null()); - Self { handle } - } - - pub(crate) unsafe fn ref_from_raw(handle: *mut BNBinaryView) -> Ref { - debug_assert!(!handle.is_null()); - Ref::new(Self { handle }) - } - - /// Construct the raw binary view from the given metadata. - /// - /// Before calling this, make sure you have a valid file path set for the [`FileMetadata`]. It is - /// required that the [`FileMetadata::file_path`] exist in the local filesystem. - pub fn from_metadata(meta: &FileMetadata) -> Result> { - if !meta.file_path().exists() { - return Err(()); - } - let file = meta.file_path().to_cstr(); - let handle = - unsafe { BNCreateBinaryDataViewFromFilename(meta.handle, file.as_ptr() as *mut _) }; - if handle.is_null() { - return Err(()); - } - unsafe { Ok(Ref::new(Self { handle })) } - } - - /// Construct the raw binary view from the given `file_path` and metadata. - /// - /// This will implicitly set the metadata file path and then construct the view. If the metadata - /// already has the desired file path, use [`BinaryView::from_metadata`] instead. - pub fn from_path(meta: &FileMetadata, file_path: impl AsRef) -> Result> { - meta.set_file_path(file_path.as_ref()); - Self::from_metadata(meta) - } - - // TODO: Provide an API that manages the lifetime of the accessor and the view. - /// Construct the raw binary view from the given `accessor` and metadata. - /// - /// It is the responsibility of the caller to keep the accessor alive for the lifetime of the view; - /// because of this, we mark the function as unsafe. - pub unsafe fn from_accessor( - meta: &FileMetadata, - accessor: &mut FileAccessor, - ) -> Result> { - let handle = unsafe { BNCreateBinaryDataViewFromFile(meta.handle, &mut accessor.raw) }; - if handle.is_null() { - return Err(()); - } - unsafe { Ok(Ref::new(Self { handle })) } - } - - /// Construct the raw binary view from the given `data` and metadata. - /// - /// The data will be copied into the view, so the caller does not need to keep the data alive. - pub fn from_data(meta: &FileMetadata, data: &[u8]) -> Ref { - let handle = unsafe { - BNCreateBinaryDataViewFromData(meta.handle, data.as_ptr() as *mut _, data.len()) - }; - assert!( - !handle.is_null(), - "BNCreateBinaryDataViewFromData should always succeed" - ); - unsafe { Ref::new(Self { handle }) } - } - - /// Save the original binary file to the provided `file_path` along with any modifications. - /// - /// WARNING: Currently there is a possibility to deadlock if the analysis has queued up a main thread action - /// that tries to take the [`FileMetadata`] lock of the current view, and is executed while we - /// are executing in this function. - /// - /// To avoid the above issue use [`crate::main_thread::execute_on_main_thread_and_wait`] to verify there - /// are no queued up main thread actions. - pub fn save_to_path(&self, file_path: impl AsRef) -> bool { - let file = file_path.as_ref().to_cstr(); - unsafe { BNSaveToFilename(self.handle, file.as_ptr() as *mut _) } - } - - /// Save the original binary file to the provided [`FileAccessor`] along with any modifications. - /// - /// WARNING: Currently there is a possibility to deadlock if the analysis has queued up a main thread action - /// that tries to take the [`FileMetadata`] lock of the current view, and is executed while we - /// are executing in this function. - /// - /// To avoid the above issue use [`crate::main_thread::execute_on_main_thread_and_wait`] to verify there - /// are no queued up main thread actions. - pub fn save_to_accessor(&self, file: &mut FileAccessor) -> bool { - unsafe { BNSaveToFile(self.handle, &mut file.raw) } - } -} - impl BinaryViewBase for BinaryView { fn read(&self, buf: &mut [u8], offset: u64) -> usize { unsafe { BNReadViewData(self.handle, buf.as_mut_ptr() as *mut _, offset, buf.len()) } @@ -2749,7 +3136,7 @@ where Handler: BinaryViewEventHandler, { unsafe extern "C" fn on_event( - ctx: *mut ::std::os::raw::c_void, + ctx: *mut c_void, view: *mut BNBinaryView, ) { ffi_wrap!("EventHandler::on_event", { @@ -2762,11 +3149,7 @@ where let raw = Box::into_raw(boxed); unsafe { - BNRegisterBinaryViewEvent( - event_type, - Some(on_event::), - raw as *mut ::std::os::raw::c_void, - ); + BNRegisterBinaryViewEvent(event_type, Some(on_event::), raw as *mut c_void); } } @@ -2879,3 +3262,318 @@ unsafe impl CoreArrayProviderInner for AddressRange { Self::from(*raw) } } + +extern "C" fn cb_valid(ctxt: *mut c_void, data: *mut BNBinaryView) -> bool +where + T: CustomBinaryViewType, +{ + let view_type = unsafe { &*(ctxt as *mut T) }; + let data = unsafe { BinaryView::ref_from_raw(BNNewViewReference(data)) }; + let _span = ffi_span!("CustomBinaryViewType::is_valid_for", data); + view_type.is_valid_for(&data) +} + +extern "C" fn cb_deprecated(_ctxt: *mut c_void) -> bool +where + T: CustomBinaryViewType, +{ + T::DEPRECATED +} + +extern "C" fn cb_force_loadable(_ctxt: *mut c_void) -> bool +where + T: CustomBinaryViewType, +{ + T::FORCE_LOADABLE +} + +extern "C" fn cb_has_no_initial_content(_ctxt: *mut c_void) -> bool +where + T: CustomBinaryViewType, +{ + T::HAS_NO_INITIAL_CONTENT +} + +extern "C" fn cb_create(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNBinaryView +where + T: CustomBinaryViewType, +{ + ffi_wrap!("CustomBinaryViewType::create", unsafe { + let view_type = &*(ctxt as *mut T); + let data = BinaryView::from_raw(data); + let _span = ffi_span!("CustomBinaryViewType::create", data); + match view_type.create_binary_view(&data) { + Ok(custom_view) => { + match BinaryView::from_custom(T::NAME, &data.file(), &data, custom_view) { + Ok(custom_view) => Ref::into_raw(custom_view).handle, + Err(_) => std::ptr::null_mut(), + } + } + Err(_) => std::ptr::null_mut(), + } + }) +} + +extern "C" fn cb_parse(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNBinaryView +where + T: CustomBinaryViewType, +{ + ffi_wrap!("CustomBinaryViewType::parse", unsafe { + let view_type = &*(ctxt as *mut T); + let data = BinaryView::from_raw(data); + let _span = ffi_span!("CustomBinaryViewType::parse", data); + match view_type.create_binary_view_for_parse(&data) { + Ok(custom_view) => { + match BinaryView::from_custom(T::NAME, &data.file(), &data, custom_view) { + Ok(custom_view) => Ref::into_raw(custom_view).handle, + Err(_) => std::ptr::null_mut(), + } + } + Err(_) => std::ptr::null_mut(), + } + }) +} + +extern "C" fn cb_load_settings(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNSettings +where + T: CustomBinaryViewType, +{ + ffi_wrap!("CustomBinaryViewType::load_settings", unsafe { + let view_type = &*(ctxt as *mut T); + let data = BinaryView::from_raw(data); + + let _span = ffi_span!("CustomBinaryViewType::load_settings", data); + let settings = view_type.load_settings_for_data(&data); + Ref::into_raw(settings).handle + }) +} + +extern "C" fn cb_init(ctxt: *mut c_void) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::init", unsafe { + let context = &mut *(ctxt as *mut CustomBinaryViewContext); + // SAFETY: The core view has been initialized by [`BinaryView::from_custom`], so it should be valid. + // SAFETY: The custom view is not being touched by anything else at the point this function is called, + // so it should be safe to mutably borrow it. + context.view.initialize(context.core_view.assume_init_ref()) + }) +} + +extern "C" fn cb_on_after_snapshot_data_applied(ctxt: *mut c_void) +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::onAfterSnapshotDataApplied", unsafe { + let context = &mut *(ctxt as *mut CustomBinaryViewContext); + // SAFETY: The custom view is not being touched by anything else at the point this function is called, + // so it should be safe to mutably borrow it. + context.view.on_after_snapshot_data_applied(); + }) +} + +extern "C" fn cb_free_object(ctxt: *mut c_void) +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::freeObject", unsafe { + let context = ctxt as *mut CustomBinaryViewContext; + let _context = Box::from_raw(context); + }) +} + +extern "C" fn cb_read(ctxt: *mut c_void, dest: *mut c_void, offset: u64, len: usize) -> usize +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::read", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + let dest = std::slice::from_raw_parts_mut(dest as *mut u8, len); + context.view.read(dest, offset) + }) +} + +extern "C" fn cb_write(ctxt: *mut c_void, offset: u64, src: *const c_void, len: usize) -> usize +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::write", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + let src = std::slice::from_raw_parts(src as *const u8, len); + context.view.write(offset, src) + }) +} + +extern "C" fn cb_insert(ctxt: *mut c_void, offset: u64, src: *const c_void, len: usize) -> usize +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::insert", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + let src = std::slice::from_raw_parts(src as *const u8, len); + context.view.insert(offset, src) + }) +} + +extern "C" fn cb_remove(ctxt: *mut c_void, offset: u64, len: u64) -> usize +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::remove", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.remove(offset, len as usize) + }) +} + +extern "C" fn cb_modification(ctxt: *mut c_void, offset: u64) -> ModificationStatus +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::modification_status", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.modification_status(offset) + }) +} + +extern "C" fn cb_offset_valid(ctxt: *mut c_void, offset: u64) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::offset_valid", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.offset_valid(offset) + }) +} + +extern "C" fn cb_offset_readable(ctxt: *mut c_void, offset: u64) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::readable", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.offset_readable(offset) + }) +} + +extern "C" fn cb_offset_writable(ctxt: *mut c_void, offset: u64) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::writable", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.offset_writable(offset) + }) +} + +extern "C" fn cb_offset_executable(ctxt: *mut c_void, offset: u64) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::offset_executable", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.offset_executable(offset) + }) +} + +extern "C" fn cb_offset_backed_by_file(ctxt: *mut c_void, offset: u64) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::offset_backed_by_file", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.offset_backed_by_file(offset) + }) +} + +extern "C" fn cb_next_valid_offset(ctxt: *mut c_void, offset: u64) -> u64 +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::next_valid_offset_after", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.next_valid_offset_after(offset) + }) +} + +extern "C" fn cb_start(ctxt: *mut c_void) -> u64 +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::start", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.start() + }) +} + +extern "C" fn cb_length(ctxt: *mut c_void) -> u64 +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::len", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.len() + }) +} + +extern "C" fn cb_entry_point(ctxt: *mut c_void) -> u64 +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::entry_point", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.entry_point() + }) +} + +extern "C" fn cb_executable(ctxt: *mut c_void) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::executable", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.executable() + }) +} + +extern "C" fn cb_endianness(ctxt: *mut c_void) -> Endianness +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::default_endianness", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.default_endianness() + }) +} + +extern "C" fn cb_relocatable(ctxt: *mut c_void) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::relocatable", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.relocatable() + }) +} + +extern "C" fn cb_address_size(ctxt: *mut c_void) -> usize +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::address_size", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + context.view.address_size() + }) +} + +extern "C" fn cb_save(ctxt: *mut c_void, _file: *mut BNFileAccessor) -> bool +where + C: CustomBinaryView, +{ + ffi_wrap!("BinaryViewBase::save", unsafe { + let context = &*(ctxt as *mut CustomBinaryViewContext); + // TODO: Need to pass file accessor to save to. + // let file = FileAccessor::from_raw(file); + context.view.save() + }) +} diff --git a/rust/src/binary_view/writer.rs b/rust/src/binary_view/writer.rs index 512418e425..57f431fe4a 100644 --- a/rust/src/binary_view/writer.rs +++ b/rust/src/binary_view/writer.rs @@ -17,7 +17,7 @@ use binaryninjacore_sys::*; use std::fmt::Debug; -use crate::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; +use crate::binary_view::{BinaryView, BinaryViewBase}; use crate::Endianness; use crate::rc::Ref; diff --git a/rust/src/collaboration/file.rs b/rust/src/collaboration/file.rs index dbe2b8b9c3..84860dd828 100644 --- a/rust/src/collaboration/file.rs +++ b/rust/src/collaboration/file.rs @@ -11,7 +11,7 @@ use super::{ Remote, RemoteFolder, RemoteProject, RemoteSnapshot, }; -use crate::binary_view::{BinaryView, BinaryViewExt}; +use crate::binary_view::BinaryView; use crate::database::Database; use crate::file_metadata::FileMetadata; use crate::progress::{NoProgressCallback, ProgressCallback, SplitProgressBuilder}; diff --git a/rust/src/collaboration/project.rs b/rust/src/collaboration/project.rs index cfcc1db48d..50d651f635 100644 --- a/rust/src/collaboration/project.rs +++ b/rust/src/collaboration/project.rs @@ -11,7 +11,7 @@ use super::{ RemoteFileType, RemoteFolder, }; -use crate::binary_view::{BinaryView, BinaryViewExt}; +use crate::binary_view::BinaryView; use crate::database::Database; use crate::file_metadata::FileMetadata; use crate::progress::{NoProgressCallback, ProgressCallback}; diff --git a/rust/src/collaboration/snapshot.rs b/rust/src/collaboration/snapshot.rs index 203d8677fb..3e99805d09 100644 --- a/rust/src/collaboration/snapshot.rs +++ b/rust/src/collaboration/snapshot.rs @@ -3,7 +3,7 @@ use std::ptr::NonNull; use std::time::SystemTime; use super::{sync, Remote, RemoteFile, RemoteProject}; -use crate::binary_view::{BinaryView, BinaryViewExt}; +use crate::binary_view::BinaryView; use crate::collaboration::undo::{RemoteUndoEntry, RemoteUndoEntryId}; use crate::database::snapshot::Snapshot; use crate::progress::{NoProgressCallback, ProgressCallback}; diff --git a/rust/src/collaboration/sync.rs b/rust/src/collaboration/sync.rs index 72c57a46c6..1bf9c010bb 100644 --- a/rust/src/collaboration/sync.rs +++ b/rust/src/collaboration/sync.rs @@ -6,7 +6,7 @@ use std::ffi::{c_char, c_void}; use std::path::{Path, PathBuf}; use std::ptr::NonNull; -use crate::binary_view::{BinaryView, BinaryViewExt}; +use crate::binary_view::BinaryView; use crate::database::{snapshot::Snapshot, Database}; use crate::file_metadata::FileMetadata; use crate::progress::{NoProgressCallback, ProgressCallback}; @@ -138,7 +138,7 @@ pub fn get_remote_for_local_database(database: &Database) -> Result Result>, ()> { let Some(db) = bv.file().database() else { return Ok(None); diff --git a/rust/src/component.rs b/rust/src/component.rs index f038d5c39c..c99081fad2 100644 --- a/rust/src/component.rs +++ b/rust/src/component.rs @@ -1,4 +1,4 @@ -use crate::binary_view::{BinaryView, BinaryViewExt}; +use crate::binary_view::BinaryView; use crate::function::Function; use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, RefCountable}; use crate::string::{BnString, IntoCStr}; diff --git a/rust/src/custom_binary_view.rs b/rust/src/custom_binary_view.rs deleted file mode 100644 index 84f3917142..0000000000 --- a/rust/src/custom_binary_view.rs +++ /dev/null @@ -1,961 +0,0 @@ -// Copyright 2021-2026 Vector 35 Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -//! An interface for providing your own [BinaryView]s to Binary Ninja. - -use binaryninjacore_sys::*; - -pub use binaryninjacore_sys::BNModificationStatus as ModificationStatus; - -use std::fmt::Debug; -use std::marker::PhantomData; -use std::mem::MaybeUninit; -use std::os::raw::c_void; -use std::ptr; -use std::slice; - -use crate::architecture::Architecture; -use crate::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt, Result}; -use crate::metadata::Metadata; -use crate::platform::Platform; -use crate::rc::*; -use crate::settings::Settings; -use crate::string::*; -use crate::Endianness; - -/// Registers a custom `BinaryViewType` with the core. -/// -/// The `constructor` argument is called immediately after successful registration of the type with -/// the core. The `BinaryViewType` argument passed to `constructor` is the object that the -/// `AsRef` -/// implementation of the `CustomBinaryViewType` must return. -pub fn register_view_type(name: &str, long_name: &str, constructor: F) -> &'static T -where - T: CustomBinaryViewType, - F: FnOnce(BinaryViewType) -> T, -{ - extern "C" fn cb_valid(ctxt: *mut c_void, data: *mut BNBinaryView) -> bool - where - T: CustomBinaryViewType, - { - let view_type = unsafe { &*(ctxt as *mut T) }; - let data = unsafe { BinaryView::ref_from_raw(BNNewViewReference(data)) }; - let _span = ffi_span!("BinaryViewTypeBase::is_valid_for", data); - view_type.is_valid_for(&data) - } - - extern "C" fn cb_deprecated(ctxt: *mut c_void) -> bool - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::is_deprecated", unsafe { - let view_type = &*(ctxt as *mut T); - view_type.is_deprecated() - }) - } - - extern "C" fn cb_force_loadable(ctxt: *mut c_void) -> bool - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::is_force_loadable", unsafe { - let view_type = &*(ctxt as *mut T); - view_type.is_force_loadable() - }) - } - - extern "C" fn cb_has_no_initial_content(ctxt: *mut c_void) -> bool - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::has_no_initial_content", unsafe { - let view_type = &*(ctxt as *mut T); - view_type.has_no_initial_content() - }) - } - - extern "C" fn cb_create(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNBinaryView - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::create", unsafe { - let view_type = &*(ctxt as *mut T); - let data = BinaryView::ref_from_raw(BNNewViewReference(data)); - - let builder = CustomViewBuilder { - view_type, - actual_parent: &data, - }; - - let _span = ffi_span!("BinaryViewTypeBase::create", data); - match view_type.create_custom_view(&data, builder) { - Ok(bv) => { - // force a leak of the Ref; failure to do this would result - // in the refcount going to 0 in the process of returning it - // to the core -- we're transferring ownership of the Ref here - Ref::into_raw(bv.handle).handle - } - Err(_) => ptr::null_mut(), - } - }) - } - - extern "C" fn cb_parse(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNBinaryView - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::parse", unsafe { - let view_type = &*(ctxt as *mut T); - let data = BinaryView::ref_from_raw(BNNewViewReference(data)); - - let builder = CustomViewBuilder { - view_type, - actual_parent: &data, - }; - - let _span = ffi_span!("BinaryViewTypeBase::parse", data); - match view_type.parse_custom_view(&data, builder) { - Ok(bv) => { - // force a leak of the Ref; failure to do this would result - // in the refcount going to 0 in the process of returning it - // to the core -- we're transferring ownership of the Ref here - Ref::into_raw(bv.handle).handle - } - Err(_) => ptr::null_mut(), - } - }) - } - - extern "C" fn cb_load_settings(ctxt: *mut c_void, data: *mut BNBinaryView) -> *mut BNSettings - where - T: CustomBinaryViewType, - { - ffi_wrap!("BinaryViewTypeBase::load_settings", unsafe { - let view_type = &*(ctxt as *mut T); - let data = BinaryView::ref_from_raw(BNNewViewReference(data)); - - let _span = ffi_span!("BinaryViewTypeBase::load_settings", data); - match view_type.load_settings_for_data(&data) { - Some(settings) => Ref::into_raw(settings).handle, - None => ptr::null_mut() as *mut _, - } - }) - } - - let name = name.to_cstr(); - let name_ptr = name.as_ptr(); - - let long_name = long_name.to_cstr(); - let long_name_ptr = long_name.as_ptr(); - - let ctxt = Box::leak(Box::new(MaybeUninit::zeroed())); - - let mut bn_obj = BNCustomBinaryViewType { - context: ctxt.as_mut_ptr() as *mut _, - create: Some(cb_create::), - parse: Some(cb_parse::), - isValidForData: Some(cb_valid::), - isDeprecated: Some(cb_deprecated::), - isForceLoadable: Some(cb_force_loadable::), - getLoadSettingsForData: Some(cb_load_settings::), - hasNoInitialContent: Some(cb_has_no_initial_content::), - }; - - unsafe { - let handle = BNRegisterBinaryViewType(name_ptr, long_name_ptr, &mut bn_obj as *mut _); - if handle.is_null() { - // avoid leaking the space allocated for the type, but also - // avoid running its Drop impl (if any -- not that there should - // be one since view types live for the life of the process) as - // MaybeUninit suppress the Drop implementation of it's inner type - drop(Box::from_raw(ctxt)); - panic!("bvt registration failed"); - } - - ctxt.write(constructor(BinaryViewType { handle })); - ctxt.assume_init_mut() - } -} - -pub trait BinaryViewTypeBase: AsRef { - /// Is this [`BinaryViewType`] valid for the given the raw [`BinaryView`]? - /// - /// Typical implementations will read the magic bytes (e.g. 'MZ'), this is a performance-sensitive - /// path so prefer inexpensive checks rather than comprehensive ones. - fn is_valid_for(&self, data: &BinaryView) -> bool; - - /// Is this [`BinaryViewType`] deprecated and should not be used? - /// - /// We specify this such that the view type may still be used by existing databases, but not - /// newly created views. - fn is_deprecated(&self) -> bool { - false - } - - /// Is this [`BinaryViewType`] able to be loaded forcefully? - /// - /// If so, it will be shown in the drop-down when a user opens a file with options. - fn is_force_loadable(&self) -> bool { - false - } - - /// Do instances of this [`BinaryViewType`] start with no loaded content? - /// - /// When true, the view has no meaningful default state: the user must make a - /// selection (e.g. load images from a shared cache) before any content exists. - /// Callers can use this to suppress restoring previously-saved view state for - /// files not being loaded from a database, since a saved layout would reference - /// content that isn't available on reopen. - fn has_no_initial_content(&self) -> bool { - false - } - - fn default_load_settings_for_data(&self, data: &BinaryView) -> Option> { - let settings_handle = - unsafe { BNGetBinaryViewDefaultLoadSettingsForData(self.as_ref().handle, data.handle) }; - - if settings_handle.is_null() { - None - } else { - unsafe { Some(Settings::ref_from_raw(settings_handle)) } - } - } - - fn load_settings_for_data(&self, _data: &BinaryView) -> Option> { - None - } -} - -pub trait BinaryViewTypeExt: BinaryViewTypeBase { - fn name(&self) -> String { - unsafe { BnString::into_string(BNGetBinaryViewTypeName(self.as_ref().handle)) } - } - - fn long_name(&self) -> String { - unsafe { BnString::into_string(BNGetBinaryViewTypeLongName(self.as_ref().handle)) } - } - - fn register_arch(&self, id: u32, endianness: Endianness, arch: &A) { - unsafe { - BNRegisterArchitectureForViewType( - self.as_ref().handle, - id, - endianness, - arch.as_ref().handle, - ); - } - } - - fn register_platform(&self, id: u32, plat: &Platform) { - let arch = plat.arch(); - - unsafe { - BNRegisterPlatformForViewType(self.as_ref().handle, id, arch.handle, plat.handle); - } - } - - /// Expanded identification of [`Platform`] for [`BinaryViewType`]'s. Supersedes [`BinaryViewTypeExt::register_arch`] - /// and [`BinaryViewTypeExt::register_platform`], as these have certain edge cases (overloaded elf families, for example) - /// that can't be represented. - /// - /// The callback returns a [`Platform`] object or `None` (failure), and most recently added callbacks are called first - /// to allow plugins to override any default behaviors. When a callback returns a platform, architecture will be - /// derived from the identified platform. - /// - /// The [`BinaryView`] is the *parent* view (usually 'Raw') that the [`BinaryView`] is being created for. This - /// means that generally speaking the callbacks need to be aware of the underlying file format, however the - /// [`BinaryView`] implementation may have created datavars in the 'Raw' view by the time the callback is invoked. - /// Behavior regarding when this callback is invoked and what has been made available in the [`BinaryView`] passed as an - /// argument to the callback is up to the discretion of the [`BinaryView`] implementation. - /// - /// The `id` ind `endian` arguments are used as a filter to determine which registered [`Platform`] recognizer callbacks - /// are invoked. - /// - /// Support for this API tentatively requires explicit support in the [`BinaryView`] implementation. - fn register_platform_recognizer(&self, id: u32, endian: Endianness, recognizer: R) - where - R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, - { - #[repr(C)] - struct PlatformRecognizerHandlerContext - where - R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, - { - recognizer: R, - } - - extern "C" fn cb_recognize_low_level_il( - ctxt: *mut c_void, - bv: *mut BNBinaryView, - metadata: *mut BNMetadata, - ) -> *mut BNPlatform - where - R: 'static + Fn(&BinaryView, &Metadata) -> Option> + Send + Sync, - { - let context = unsafe { &*(ctxt as *mut PlatformRecognizerHandlerContext) }; - let bv = unsafe { BinaryView::from_raw(bv).to_owned() }; - let metadata = unsafe { Metadata::from_raw(metadata).to_owned() }; - match (context.recognizer)(&bv, &metadata) { - Some(plat) => unsafe { Ref::into_raw(plat).handle }, - None => std::ptr::null_mut(), - } - } - - let recognizer = PlatformRecognizerHandlerContext { recognizer }; - // TODO: Currently we leak `recognizer`. - let raw = Box::into_raw(Box::new(recognizer)); - - unsafe { - BNRegisterPlatformRecognizerForViewType( - self.as_ref().handle, - id as u64, - endian, - Some(cb_recognize_low_level_il::), - raw as *mut c_void, - ) - } - } - - fn open(&self, data: &BinaryView) -> Result> { - let handle = unsafe { BNCreateBinaryViewOfType(self.as_ref().handle, data.handle) }; - - if handle.is_null() { - // TODO: Proper Result, possibly introduce BNSetError to populate. - return Err(()); - } - - unsafe { Ok(BinaryView::ref_from_raw(handle)) } - } - - fn parse(&self, data: &BinaryView) -> Result> { - let handle = unsafe { BNParseBinaryViewOfType(self.as_ref().handle, data.handle) }; - - if handle.is_null() { - // TODO: Proper Result, possibly introduce BNSetError to populate. - return Err(()); - } - - unsafe { Ok(BinaryView::ref_from_raw(handle)) } - } -} - -impl BinaryViewTypeExt for T {} - -/// A [`BinaryViewType`] acts as a factory for [`BinaryView`] objects. -/// -/// Each file format will have its own type, such as PE, ELF, or Mach-O. -#[derive(Copy, Clone, PartialEq, Eq, Hash)] -pub struct BinaryViewType { - pub handle: *mut BNBinaryViewType, -} - -impl BinaryViewType { - pub(crate) unsafe fn from_raw(handle: *mut BNBinaryViewType) -> Self { - debug_assert!(!handle.is_null()); - Self { handle } - } - - pub fn list_all() -> Array { - unsafe { - let mut count: usize = 0; - let types = BNGetBinaryViewTypes(&mut count as *mut _); - Array::new(types, count, ()) - } - } - - /// Enumerates all view types and checks to see if the given raw [`BinaryView`] is valid, - /// returning only those that are. - pub fn valid_types_for_data(data: &BinaryView) -> Array { - unsafe { - let mut count: usize = 0; - let types = BNGetBinaryViewTypesForData(data.handle, &mut count as *mut _); - Array::new(types, count, ()) - } - } - - /// Looks up a BinaryViewType by its short name - pub fn by_name(name: &str) -> Result { - let bytes = name.to_cstr(); - let handle = unsafe { BNGetBinaryViewTypeByName(bytes.as_ref().as_ptr() as *const _) }; - match handle.is_null() { - false => Ok(unsafe { BinaryViewType::from_raw(handle) }), - true => Err(()), - } - } -} - -impl BinaryViewTypeBase for BinaryViewType { - fn is_valid_for(&self, data: &BinaryView) -> bool { - unsafe { BNIsBinaryViewTypeValidForData(self.handle, data.handle) } - } - - fn is_deprecated(&self) -> bool { - unsafe { BNIsBinaryViewTypeDeprecated(self.handle) } - } - - fn is_force_loadable(&self) -> bool { - unsafe { BNIsBinaryViewTypeForceLoadable(self.handle) } - } - - fn has_no_initial_content(&self) -> bool { - unsafe { BNBinaryViewTypeHasNoInitialContent(self.handle) } - } - - fn load_settings_for_data(&self, data: &BinaryView) -> Option> { - let settings_handle = - unsafe { BNGetBinaryViewLoadSettingsForData(self.handle, data.handle) }; - - if settings_handle.is_null() { - None - } else { - unsafe { Some(Settings::ref_from_raw(settings_handle)) } - } - } -} - -impl Debug for BinaryViewType { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("BinaryViewType") - .field("name", &self.name()) - .field("long_name", &self.long_name()) - .finish() - } -} - -impl CoreArrayProvider for BinaryViewType { - type Raw = *mut BNBinaryViewType; - type Context = (); - type Wrapped<'a> = Guard<'a, BinaryViewType>; -} - -unsafe impl CoreArrayProviderInner for BinaryViewType { - unsafe fn free(raw: *mut Self::Raw, _count: usize, _context: &Self::Context) { - BNFreeBinaryViewTypeList(raw); - } - - unsafe fn wrap_raw<'a>(raw: &'a Self::Raw, _context: &'a Self::Context) -> Self::Wrapped<'a> { - Guard::new(BinaryViewType::from_raw(*raw), &()) - } -} - -impl AsRef for BinaryViewType { - fn as_ref(&self) -> &Self { - self - } -} - -unsafe impl Send for BinaryViewType {} -unsafe impl Sync for BinaryViewType {} - -pub trait CustomBinaryViewType: 'static + BinaryViewTypeBase + Sync { - fn create_custom_view<'builder>( - &self, - data: &BinaryView, - builder: CustomViewBuilder<'builder, Self>, - ) -> Result>; - - fn parse_custom_view<'builder>( - &self, - data: &BinaryView, - builder: CustomViewBuilder<'builder, Self>, - ) -> Result> { - // TODO: Check to make sure data.type_name is not Self::type_name ? - self.create_custom_view(data, builder) - } -} - -/// Represents a request from the core to instantiate a custom BinaryView -pub struct CustomViewBuilder<'a, T: CustomBinaryViewType + ?Sized> { - view_type: &'a T, - actual_parent: &'a BinaryView, -} - -pub unsafe trait CustomBinaryView: 'static + BinaryViewBase + Sync + Sized { - type Args: Send; - - fn new(handle: &BinaryView, args: &Self::Args) -> Result; - fn init(&mut self, args: Self::Args) -> Result<()>; - fn on_after_snapshot_data_applied(&mut self) {} -} - -/// Represents a partially initialized custom `BinaryView` that should be returned to the core -/// from the `create_custom_view` method of a `CustomBinaryViewType`. -#[must_use] -pub struct CustomView<'builder> { - // this object can't actually be treated like a real - // BinaryView as it isn't fully initialized until the - // core receives it from the BNCustomBinaryViewType::create - // callback. - handle: Ref, - _builder: PhantomData<&'builder ()>, -} - -impl<'a, T: CustomBinaryViewType> CustomViewBuilder<'a, T> { - /// Begins creating a custom BinaryView. - /// - /// This function may only be called from the `create_custom_view` function of a - /// `CustomBinaryViewType`. - /// - /// `parent` specifies the view that the core will treat as the parent view, that - /// Segments created against the created view will be backed by `parent`. It will - /// usually be (but is not required to be) the `data` argument of the `create_custom_view` - /// callback. - /// - /// `constructor` will not be called until well after the value returned by this function - /// has been returned by `create_custom_view` callback to the core, and may not ever - /// be called if the value returned by this function is dropped or leaked. - /// - /// # Errors - /// - /// This function will fail if the `FileMetadata` object associated with the *expected* parent - /// (i.e., the `data` argument passed to the `create_custom_view` function) already has an - /// associated `BinaryView` of the same `CustomBinaryViewType`. Multiple `BinaryView` objects - /// of the same `BinaryViewType` belonging to the same `FileMetadata` object is prohibited and - /// can cause strange, delayed segmentation faults. - /// - /// # Safety - /// - /// `constructor` should avoid doing anything with the object it returns, especially anything - /// that would cause the core to invoke any of the `BinaryViewBase` methods. The core isn't - /// going to consider the object fully initialized until after that callback has run. - /// - /// The `BinaryView` argument passed to the constructor function is the object that is expected - /// to be returned by the `AsRef` implementation required by the `BinaryViewBase` trait. - /// TODO FIXME whelp this is broke going to need 2 init callbacks - pub fn create(self, parent: &BinaryView, view_args: V::Args) -> Result> - where - V: CustomBinaryView, - { - let file = self.actual_parent.file(); - let view_type = self.view_type; - - let view_name = view_type.name(); - - if let Some(bv) = file.view_of_type(&view_name) { - // while it seems to work most of the time, you can get really unlucky - // if a free of the existing view of the same type kicks off while - // BNCreateBinaryViewOfType is still running. the freeObject callback - // will run for the new view before we've even finished initializing, - // and that's all she wrote. - // - // even if we deal with it gracefully in cb_free_object, - // BNCreateBinaryViewOfType is still going to crash, so we're just - // going to try and stop this from happening in the first place. - tracing::error!( - "attempt to create duplicate view of type '{}' (existing: {:?})", - view_name, - bv.handle - ); - - return Err(()); - } - - // struct representing the context of a BNCustomBinaryView. Can be safely - // dropped at any moment. - struct CustomViewContext - where - V: CustomBinaryView, - { - raw_handle: *mut BNBinaryView, - state: CustomViewContextState, - } - - enum CustomViewContextState - where - V: CustomBinaryView, - { - Uninitialized { args: V::Args }, - Initialized { view: V }, - // dummy state, used as a helper to change states, only happen if the - // `new` or `init` function fails. - None, - } - - impl CustomViewContext { - fn assume_init_ref(&self) -> &V { - let CustomViewContextState::Initialized { view } = &self.state else { - panic!("CustomViewContextState in invalid state"); - }; - view - } - } - - extern "C" fn cb_init(ctxt: *mut c_void) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::init", unsafe { - let context = &mut *(ctxt as *mut CustomViewContext); - let handle = BinaryView::ref_from_raw(context.raw_handle); - - // take the uninitialized state and use the args to call init - let mut state = CustomViewContextState::None; - core::mem::swap(&mut context.state, &mut state); - let CustomViewContextState::Uninitialized { args } = state else { - panic!("CustomViewContextState in invalid state"); - }; - match V::new(handle.as_ref(), &args) { - Ok(mut view) => match view.init(args) { - Ok(_) => { - // put the initialized state - context.state = CustomViewContextState::Initialized { view }; - true - } - Err(_) => { - tracing::error!( - "CustomBinaryView::init failed; custom view returned Err" - ); - false - } - }, - Err(_) => { - tracing::error!("CustomBinaryView::new failed; custom view returned Err"); - false - } - } - }) - } - - extern "C" fn cb_on_after_snapshot_data_applied(ctxt: *mut c_void) - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::onAfterSnapshotDataApplied", unsafe { - let context = &mut *(ctxt as *mut CustomViewContext); - if let CustomViewContextState::Initialized { view } = &mut context.state { - view.on_after_snapshot_data_applied(); - } - }) - } - - extern "C" fn cb_free_object(ctxt: *mut c_void) - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::freeObject", unsafe { - let context = ctxt as *mut CustomViewContext; - let context = Box::from_raw(context); - - if context.raw_handle.is_null() { - // being called here is essentially a guarantee that BNCreateBinaryViewOfType - // is above above us on the call stack somewhere -- no matter what we do, a crash - // is pretty much certain at this point. - // - // this has been observed when two views of the same BinaryViewType are created - // against the same BNFileMetaData object, and one of the views gets freed while - // the second one is being initialized -- somehow the partially initialized one - // gets freed before BNCreateBinaryViewOfType returns. - // - // multiples views of the same BinaryViewType in a BNFileMetaData object are - // prohibited, so an API contract was violated in order to get here. - // - // if we're here, it's too late to do anything about it, though we can at least not - // run the destructor on the custom view since that memory is uninitialized. - tracing::error!( - "BinaryViewBase::freeObject called on partially initialized object! crash imminent!" - ); - } else if matches!( - &context.state, - CustomViewContextState::None | CustomViewContextState::Uninitialized { .. } - ) { - // making it here means somebody went out of their way to leak a BinaryView - // after calling BNCreateCustomView and never gave the BNBinaryView handle - // to the core (which would have called cb_init) - // - // the result is a half-initialized BinaryView that the core will happily hand out - // references to via BNGetFileViewofType even though it was never initialized - // all the way. - // - // TODO update when this corner case gets fixed in the core? - // - // we can't do anything to prevent this, but we can at least have the crash - // not be our fault. - tracing::error!("BinaryViewBase::freeObject called on leaked/never initialized custom view!"); - } - }) - } - - extern "C" fn cb_read( - ctxt: *mut c_void, - dest: *mut c_void, - offset: u64, - len: usize, - ) -> usize - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::read", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - let dest = slice::from_raw_parts_mut(dest as *mut u8, len); - context.assume_init_ref().read(dest, offset) - }) - } - - extern "C" fn cb_write( - ctxt: *mut c_void, - offset: u64, - src: *const c_void, - len: usize, - ) -> usize - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::write", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - let src = slice::from_raw_parts(src as *const u8, len); - context.assume_init_ref().write(offset, src) - }) - } - - extern "C" fn cb_insert( - ctxt: *mut c_void, - offset: u64, - src: *const c_void, - len: usize, - ) -> usize - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::insert", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - let src = slice::from_raw_parts(src as *const u8, len); - context.assume_init_ref().insert(offset, src) - }) - } - - extern "C" fn cb_remove(ctxt: *mut c_void, offset: u64, len: u64) -> usize - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::remove", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().remove(offset, len as usize) - }) - } - - extern "C" fn cb_modification(ctxt: *mut c_void, offset: u64) -> ModificationStatus - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::modification_status", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().modification_status(offset) - }) - } - - extern "C" fn cb_offset_valid(ctxt: *mut c_void, offset: u64) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::offset_valid", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().offset_valid(offset) - }) - } - - extern "C" fn cb_offset_readable(ctxt: *mut c_void, offset: u64) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::readable", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().offset_readable(offset) - }) - } - - extern "C" fn cb_offset_writable(ctxt: *mut c_void, offset: u64) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::writable", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().offset_writable(offset) - }) - } - - extern "C" fn cb_offset_executable(ctxt: *mut c_void, offset: u64) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::offset_executable", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().offset_executable(offset) - }) - } - - extern "C" fn cb_offset_backed_by_file(ctxt: *mut c_void, offset: u64) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::offset_backed_by_file", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().offset_backed_by_file(offset) - }) - } - - extern "C" fn cb_next_valid_offset(ctxt: *mut c_void, offset: u64) -> u64 - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::next_valid_offset_after", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().next_valid_offset_after(offset) - }) - } - - extern "C" fn cb_start(ctxt: *mut c_void) -> u64 - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::start", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().start() - }) - } - - extern "C" fn cb_length(ctxt: *mut c_void) -> u64 - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::len", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().len() - }) - } - - extern "C" fn cb_entry_point(ctxt: *mut c_void) -> u64 - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::entry_point", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().entry_point() - }) - } - - extern "C" fn cb_executable(ctxt: *mut c_void) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::executable", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - context.assume_init_ref().executable() - }) - } - - extern "C" fn cb_endianness(ctxt: *mut c_void) -> Endianness - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::default_endianness", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - - context.assume_init_ref().default_endianness() - }) - } - - extern "C" fn cb_relocatable(ctxt: *mut c_void) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::relocatable", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - - context.assume_init_ref().relocatable() - }) - } - - extern "C" fn cb_address_size(ctxt: *mut c_void) -> usize - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::address_size", unsafe { - let context = &*(ctxt as *mut CustomViewContext); - - context.assume_init_ref().address_size() - }) - } - - extern "C" fn cb_save(ctxt: *mut c_void, _fa: *mut BNFileAccessor) -> bool - where - V: CustomBinaryView, - { - ffi_wrap!("BinaryViewBase::save", unsafe { - let _context = &*(ctxt as *mut CustomViewContext); - false - }) - } - - let ctxt = Box::new(CustomViewContext:: { - raw_handle: ptr::null_mut(), - state: CustomViewContextState::Uninitialized { args: view_args }, - }); - - let ctxt = Box::into_raw(ctxt); - - let mut bn_obj = BNCustomBinaryView { - context: ctxt as *mut _, - init: Some(cb_init::), - freeObject: Some(cb_free_object::), - externalRefTaken: None, - externalRefReleased: None, - read: Some(cb_read::), - write: Some(cb_write::), - insert: Some(cb_insert::), - remove: Some(cb_remove::), - getModification: Some(cb_modification::), - isValidOffset: Some(cb_offset_valid::), - isOffsetReadable: Some(cb_offset_readable::), - isOffsetWritable: Some(cb_offset_writable::), - isOffsetExecutable: Some(cb_offset_executable::), - isOffsetBackedByFile: Some(cb_offset_backed_by_file::), - getNextValidOffset: Some(cb_next_valid_offset::), - getStart: Some(cb_start::), - getLength: Some(cb_length::), - getEntryPoint: Some(cb_entry_point::), - isExecutable: Some(cb_executable::), - getDefaultEndianness: Some(cb_endianness::), - isRelocatable: Some(cb_relocatable::), - getAddressSize: Some(cb_address_size::), - save: Some(cb_save::), - onAfterSnapshotDataApplied: Some(cb_on_after_snapshot_data_applied::), - }; - - let view_name = view_name.to_cstr(); - unsafe { - let res = BNCreateCustomBinaryView( - view_name.as_ptr(), - file.handle, - parent.handle, - &mut bn_obj, - ); - assert!( - !res.is_null(), - "BNCreateCustomBinaryView cannot return null" - ); - (*ctxt).raw_handle = res; - Ok(CustomView { - handle: BinaryView::ref_from_raw(res), - _builder: PhantomData, - }) - } - } - - pub fn wrap_existing(self, wrapped_view: Ref) -> Result> { - Ok(CustomView { - handle: wrapped_view, - _builder: PhantomData, - }) - } -} diff --git a/rust/src/debuginfo.rs b/rust/src/debuginfo.rs index f4cee4ff8f..2710537f42 100644 --- a/rust/src/debuginfo.rs +++ b/rust/src/debuginfo.rs @@ -62,7 +62,6 @@ //! `DebugInfo` will then be automatically applied to binary views that contain debug information (via the setting `analysis.debugInfo.internal`), binary views that provide valid external debug info files (`analysis.debugInfo.external`), or manually fetched/applied as below: //! ```no_run //! # use binaryninja::debuginfo::DebugInfoParser; -//! # use binaryninja::binary_view::BinaryViewExt; //! let bv = binaryninja::load("example").unwrap(); //! let valid_parsers = DebugInfoParser::parsers_for_view(&bv); //! let parser = valid_parsers.get(0); diff --git a/rust/src/ffi.rs b/rust/src/ffi.rs index d1c63216a6..45d142bf23 100644 --- a/rust/src/ffi.rs +++ b/rust/src/ffi.rs @@ -34,7 +34,6 @@ pub(crate) fn time_from_bn(timestamp: u64) -> SystemTime { #[macro_export] macro_rules! ffi_span { ($name:expr, $bv:expr) => {{ - use $crate::binary_view::BinaryViewExt; #[allow(unused_imports)] use $crate::file_metadata::FileMetadata; ::tracing::info_span!($name, session_id = $bv.file().session_id().0).entered() diff --git a/rust/src/file_metadata.rs b/rust/src/file_metadata.rs index b58daa5587..7b8a60fdb4 100644 --- a/rust/src/file_metadata.rs +++ b/rust/src/file_metadata.rs @@ -30,7 +30,7 @@ use crate::project::file::ProjectFile; use std::ptr::NonNull; #[allow(unused_imports)] -use crate::custom_binary_view::BinaryViewType; +use crate::binary_view::BinaryViewType; new_id_type!(SessionId, usize); @@ -472,6 +472,9 @@ impl FileMetadata { /// The [`BinaryViewType`]s associated with this file. /// /// For example, opening a PE binary will have the following: "Raw", "PE". + /// + /// Because the type may not have been registered, and the actual [`BinaryViewType`] is not available, + /// we instead return the name of the view type. pub fn view_types(&self) -> Array { let mut count = 0; unsafe { diff --git a/rust/src/function.rs b/rust/src/function.rs index c19e2107a2..90432af69f 100644 --- a/rust/src/function.rs +++ b/rust/src/function.rs @@ -17,7 +17,7 @@ use binaryninjacore_sys::*; use crate::{ architecture::{Architecture, CoreArchitecture, CoreRegister, Register}, basic_block::{BasicBlock, BlockContext}, - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, calling_convention::CoreCallingConvention, component::Component, disassembly::{DisassemblySettings, DisassemblyTextLine}, @@ -1157,7 +1157,7 @@ impl Function { /// Function.add_tag, you'll create an "address tag". These are good for labeling /// specific instructions. /// - /// For tagging arbitrary data, consider [BinaryViewExt::add_tag]. + /// For tagging arbitrary data, consider [BinaryView::add_tag]. /// /// * `tag_type_name` - The name of the tag type for this Tag. /// * `data` - Additional data for the Tag. @@ -1167,7 +1167,7 @@ impl Function { /// # Example /// /// ```no_run - /// # use binaryninja::binary_view::{BinaryView, BinaryViewExt}; + /// # use binaryninja::binary_view::BinaryView; /// # use binaryninja::function::Function; /// # let fun: Function = todo!(); /// # let bv: BinaryView = todo!(); diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 5f23a9f6aa..f420fa30c6 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -37,7 +37,6 @@ pub mod collaboration; pub mod command; pub mod component; pub mod confidence; -pub mod custom_binary_view; pub mod data_buffer; pub mod data_notification; pub mod data_renderer; diff --git a/rust/src/platform.rs b/rust/src/platform.rs index bf135fae71..e70e127792 100644 --- a/rust/src/platform.rs +++ b/rust/src/platform.rs @@ -176,7 +176,7 @@ impl Platform { pub fn type_container(&self) -> TypeContainer { let type_container_ptr = NonNull::new(unsafe { BNGetPlatformTypeContainer(self.handle) }); // NOTE: I have no idea how this isn't a UAF, see the note in `TypeContainer::from_raw` - // TODO: We are cloning here for platforms but we dont need to do this for [BinaryViewExt::type_container] + // TODO: We are cloning here for platforms but we dont need to do this for [BinaryView::type_container] // TODO: Why does this require that we, construct a TypeContainer, duplicate the type container, then drop the original. unsafe { TypeContainer::from_raw(type_container_ptr.unwrap()) } } diff --git a/rust/src/section.rs b/rust/src/section.rs index 7668f54820..ee7e0ec7a7 100644 --- a/rust/src/section.rs +++ b/rust/src/section.rs @@ -81,7 +81,6 @@ impl Section { /// /// ```no_run /// # use binaryninja::section::Section; - /// # use binaryninja::binary_view::BinaryViewExt; /// let bv = binaryninja::load("example").unwrap(); /// bv.add_section(Section::builder("example".to_string(), 0..1024).align(4).entry_size(4)) /// ``` diff --git a/rust/src/segment.rs b/rust/src/segment.rs index 348d8f67e3..a042d1fdb7 100644 --- a/rust/src/segment.rs +++ b/rust/src/segment.rs @@ -41,6 +41,9 @@ impl SegmentBuilder { } } + /// The range of the data in the parent binary view. + /// + /// If this is not specified, then the segment is "unbacked" and will contain no data. pub fn parent_backing(mut self, parent_backing: Range) -> Self { self.parent_backing = Some(parent_backing); self @@ -107,7 +110,6 @@ impl Segment { /// /// ```no_run /// # use binaryninja::segment::{Segment, SegmentFlags}; - /// # use binaryninja::binary_view::BinaryViewExt; /// let bv = binaryninja::load("example").unwrap(); /// let segment_flags = SegmentFlags::new().writable(true).readable(true); /// bv.add_segment(Segment::builder(0..0x1000).flags(segment_flags)) diff --git a/rust/src/types.rs b/rust/src/types.rs index 65e50040ba..f45d93bc5d 100644 --- a/rust/src/types.rs +++ b/rust/src/types.rs @@ -36,7 +36,7 @@ use binaryninjacore_sys::*; use crate::{ architecture::Architecture, - binary_view::{BinaryView, BinaryViewExt}, + binary_view::BinaryView, calling_convention::CoreCallingConvention, rc::*, string::{BnString, IntoCStr}, @@ -643,7 +643,6 @@ impl Drop for TypeBuilder { /// As an example, defining a _named_ type within a [`BinaryView`]: /// /// ```no_run -/// # use crate::binaryninja::binary_view::BinaryViewExt; /// # use binaryninja::types::Type; /// let bv = binaryninja::load("example.bin").unwrap(); /// let my_custom_type_1 = Type::named_int(5, false, "my_w"); diff --git a/rust/src/types/library.rs b/rust/src/types/library.rs index 8743b8961a..9b543362ab 100644 --- a/rust/src/types/library.rs +++ b/rust/src/types/library.rs @@ -17,8 +17,6 @@ use std::ptr::NonNull; // Used for doc comments #[allow(unused_imports)] use crate::binary_view::BinaryView; -#[allow(unused_imports)] -use crate::binary_view::BinaryViewExt; // TODO: Introduce a FinalizedTypeLibrary that cannot be mutated, so we do not have APIs that are unusable. @@ -261,7 +259,7 @@ impl TypeLibrary { /// Referenced types will not automatically be added, so make sure to add referenced types to the /// library or use [`TypeLibrary::add_type_source`] to mark the references originating source. /// - /// To add objects from a binary view, prefer using [`BinaryViewExt::export_object_to_library`] which + /// To add objects from a binary view, prefer using [`BinaryView::export_object_to_library`] which /// will automatically pull in all referenced types and record additional dependencies as needed. pub fn add_named_object(&self, name: QualifiedName, type_: &Type) { let mut raw_name = QualifiedName::into_raw(name); @@ -280,7 +278,7 @@ impl TypeLibrary { /// Referenced types will not automatically be added, so make sure to add referenced types to the /// library or use [`TypeLibrary::add_type_source`] to mark the references originating source. /// - /// To add types from a binary view, prefer using [`BinaryViewExt::export_type_to_library`] which + /// To add types from a binary view, prefer using [`BinaryView::export_type_to_library`] which /// will automatically pull in all referenced types and record additional dependencies as needed. pub fn add_named_type(&self, name: QualifiedName, type_: &Type) { let mut raw_name = QualifiedName::into_raw(name); @@ -320,7 +318,7 @@ impl TypeLibrary { /// Get the object (function) associated with the given name, if any. /// - /// Prefer [`BinaryViewExt::import_type_library_object`] as it will recursively import types required. + /// Prefer [`BinaryView::import_type_library_object`] as it will recursively import types required. pub fn get_named_object(&self, name: QualifiedName) -> Option> { let mut raw_name = QualifiedName::into_raw(name); let t = unsafe { BNGetTypeLibraryNamedObject(self.as_raw(), &mut raw_name) }; @@ -330,7 +328,7 @@ impl TypeLibrary { /// Get the type associated with the given name, if any. /// - /// Prefer [`BinaryViewExt::import_type_library_type`] as it will recursively import types required. + /// Prefer [`BinaryView::import_type_library_type`] as it will recursively import types required. pub fn get_named_type(&self, name: QualifiedName) -> Option> { let mut raw_name = QualifiedName::into_raw(name); let t = unsafe { BNGetTypeLibraryNamedType(self.as_raw(), &mut raw_name) }; diff --git a/rust/src/types/structure.rs b/rust/src/types/structure.rs index 3b609287c2..6dd8048a6f 100644 --- a/rust/src/types/structure.rs +++ b/rust/src/types/structure.rs @@ -7,9 +7,9 @@ use crate::types::{ use binaryninjacore_sys::*; use std::fmt::{Debug, Formatter}; -// Needed for doc comments +// Used for documentation purposes. #[allow(unused)] -use crate::binary_view::BinaryViewExt; +use crate::binary_view::BinaryView; #[derive(PartialEq, Eq, Hash)] pub struct StructureBuilder { @@ -18,7 +18,6 @@ pub struct StructureBuilder { /// ```no_run /// // Includes -/// # use binaryninja::binary_view::BinaryViewExt; /// use binaryninja::types::{MemberAccess, MemberScope, Structure, StructureBuilder, Type}; /// /// // Types to use in the members @@ -349,7 +348,7 @@ impl Structure { /// /// We must pass a [`TypeContainer`] here so that we can resolve base structure members, as they /// are treated as members through this function. Typically, you get the [`TypeContainer`] - /// through the binary view with [`BinaryViewExt::type_container`]. + /// through the binary view with [`BinaryView::type_container`]. pub fn members_at_offset( &self, container: &TypeContainer, @@ -382,7 +381,7 @@ impl Structure { /// Returns the list of all structure members, including inherited ones. /// /// Because we must traverse through base structures, we have to provide the [`TypeContainer`]; - /// in most cases it is ok to provide the binary views container via [`BinaryViewExt::type_container`]. + /// in most cases it is ok to provide the binary views container via [`BinaryView::type_container`]. pub fn members_including_inherited( &self, container: &TypeContainer, diff --git a/rust/src/workflow.rs b/rust/src/workflow.rs index e53e000152..72d0223799 100644 --- a/rust/src/workflow.rs +++ b/rust/src/workflow.rs @@ -2,7 +2,7 @@ use binaryninjacore_sys::*; // Needed for documentation. #[allow(unused)] -use crate::binary_view::{memory_map::MemoryMap, BinaryViewBase, BinaryViewExt}; +use crate::binary_view::{memory_map::MemoryMap, BinaryViewBase}; use crate::basic_block::BasicBlock; use crate::binary_view::BinaryView; diff --git a/rust/tests/base_detection.rs b/rust/tests/base_detection.rs index e42c6071d5..5addcb295d 100644 --- a/rust/tests/base_detection.rs +++ b/rust/tests/base_detection.rs @@ -1,5 +1,4 @@ use binaryninja::base_detection::{BaseAddressDetectionConfidence, BaseAddressDetectionSettings}; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use std::path::PathBuf; diff --git a/rust/tests/binary_reader.rs b/rust/tests/binary_reader.rs index 0adac464e0..9aca3efedb 100644 --- a/rust/tests/binary_reader.rs +++ b/rust/tests/binary_reader.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryReader, BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::{BinaryReader, BinaryViewBase}; use binaryninja::headless::Session; use std::io::{Read, Seek, SeekFrom}; use std::path::PathBuf; diff --git a/rust/tests/binary_view.rs b/rust/tests/binary_view.rs index 11caf3d0f6..ff5f0514ef 100644 --- a/rust/tests/binary_view.rs +++ b/rust/tests/binary_view.rs @@ -1,15 +1,18 @@ use binaryninja::binary_view::search::SearchQuery; use binaryninja::binary_view::{ - AnalysisProgress, AnalysisState, BinaryViewBase, BinaryViewExt, StringType, + register_binary_view_type, AnalysisProgress, BinaryView, BinaryViewBase, CustomBinaryView, + CustomBinaryViewType, StringType, }; use binaryninja::data_buffer::DataBuffer; -use binaryninja::file_metadata::SaveSettings; +use binaryninja::file_metadata::{FileMetadata, SaveSettings}; use binaryninja::function::{Function, FunctionViewType}; use binaryninja::headless::Session; use binaryninja::main_thread::execute_on_main_thread_and_wait; use binaryninja::platform::Platform; use binaryninja::rc::Ref; +use binaryninja::segment::SegmentBuilder; use binaryninja::symbol::{Symbol, SymbolBuilder, SymbolType}; +use binaryninja::Endianness; use std::collections::{BTreeMap, HashSet}; use std::path::PathBuf; @@ -203,3 +206,73 @@ fn test_deterministic_functions() { insta::assert_debug_snapshot!(snapshot_name, functions); } } + +struct MyBinaryViewType; + +impl CustomBinaryViewType for MyBinaryViewType { + type CustomBinaryView = MyBinaryView; + const NAME: &'static str = "MyBinaryView"; + + fn create_binary_view(&self, _data: &BinaryView) -> Result { + Ok(MyBinaryView) + } + + fn is_valid_for(&self, data: &BinaryView) -> bool { + let mut buffer = [0u8; 4]; + data.read(&mut buffer, 0); + buffer == [0x42, 0x42, 0x42, 0x42] + } +} + +struct MyBinaryView; + +impl BinaryViewBase for MyBinaryView { + fn default_endianness(&self) -> Endianness { + Endianness::LittleEndian + } + + fn address_size(&self) -> usize { + 4 + } +} + +impl CustomBinaryView for MyBinaryView { + fn initialize(&mut self, view: &BinaryView) -> bool { + let test_sym = SymbolBuilder::new(SymbolType::Symbolic, "hello", 0).create(); + view.define_auto_symbol(&test_sym); + view.add_segment(SegmentBuilder::new(0..4).parent_backing(0..4).is_auto(true)); + true + } +} + +#[test] +fn test_custom_view() { + let _session = Session::new().expect("Failed to initialize session"); + let invalid_view = BinaryView::from_data(&FileMetadata::new(), &[0x0, 0x0, 0x0, 0x0]); + let valid_view = BinaryView::from_data(&FileMetadata::new(), &[0x42, 0x42, 0x42, 0x42]); + assert_eq!(MyBinaryViewType.is_valid_for(&invalid_view), false); + assert_eq!(MyBinaryViewType.is_valid_for(&valid_view), true); + + let (_, core_type) = register_binary_view_type(MyBinaryViewType); + assert_eq!(core_type.is_valid_for(&invalid_view), false); + assert_eq!(core_type.is_valid_for(&valid_view), true); + assert_eq!(core_type.name(), "MyBinaryView"); + assert_eq!(core_type.is_deprecated(), false); + assert_eq!(core_type.is_force_loadable(), false); + + let created_view = core_type + .create(&valid_view) + .expect("Failed to create view"); + assert_eq!(created_view.analysis_progress(), AnalysisProgress::Initial); + + let hello_symbol = created_view + .symbol_by_address(0) + .expect("Failed to get symbol"); + assert_eq!(hello_symbol.to_string(), "hello"); + + assert_eq!( + created_view.read_vec(0, 4), + vec![0x42, 0x42, 0x42, 0x42], + "View not backed by the parent data" + ); +} diff --git a/rust/tests/binary_writer.rs b/rust/tests/binary_writer.rs index b74b28374c..e6881b9824 100644 --- a/rust/tests/binary_writer.rs +++ b/rust/tests/binary_writer.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryReader, BinaryViewBase, BinaryViewExt, BinaryWriter}; +use binaryninja::binary_view::{BinaryReader, BinaryViewBase, BinaryWriter}; use binaryninja::headless::Session; use std::io::{Read, Seek, SeekFrom, Write}; use std::path::PathBuf; diff --git a/rust/tests/collaboration.rs b/rust/tests/collaboration.rs index 914935b58b..36066cf700 100644 --- a/rust/tests/collaboration.rs +++ b/rust/tests/collaboration.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::collaboration::{NoNameChangeset, Remote, RemoteFileType, RemoteProject}; use binaryninja::file_metadata::SaveSettings; use binaryninja::headless::Session; diff --git a/rust/tests/component.rs b/rust/tests/component.rs index 3341f0d7ba..2cddb468a0 100644 --- a/rust/tests/component.rs +++ b/rust/tests/component.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::component::ComponentBuilder; use binaryninja::headless::Session; use std::path::PathBuf; diff --git a/rust/tests/data_notification.rs b/rust/tests/data_notification.rs index 669c847418..f277692a0f 100644 --- a/rust/tests/data_notification.rs +++ b/rust/tests/data_notification.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::data_notification::*; use binaryninja::function::Function; use binaryninja::headless::Session; diff --git a/rust/tests/data_renderer.rs b/rust/tests/data_renderer.rs index fdf3969789..a2ab372d7f 100644 --- a/rust/tests/data_renderer.rs +++ b/rust/tests/data_renderer.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::data_renderer::{ register_data_renderer, render_lines_for_data, CustomDataRenderer, RegistrationType, TypeContext, diff --git a/rust/tests/debug_info.rs b/rust/tests/debug_info.rs index 407b41d5a5..3627b4a069 100644 --- a/rust/tests/debug_info.rs +++ b/rust/tests/debug_info.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::debuginfo::*; use binaryninja::headless::Session; use binaryninja::types::{MemberAccess, MemberScope, StructureBuilder, Type, TypeBuilder}; diff --git a/rust/tests/function.rs b/rust/tests/function.rs index 507b405db7..c7c9af7364 100644 --- a/rust/tests/function.rs +++ b/rust/tests/function.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::file_metadata::FileMetadata; use binaryninja::headless::Session; use binaryninja::platform::Platform; diff --git a/rust/tests/high_level_il.rs b/rust/tests/high_level_il.rs index d3a4b05ab5..aeb15cc6e9 100644 --- a/rust/tests/high_level_il.rs +++ b/rust/tests/high_level_il.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; +use binaryninja::binary_view::BinaryViewBase; use binaryninja::headless::Session; use binaryninja::high_level_il::{ HighLevelExpressionIndex, HighLevelILInstructionKind, HighLevelInstructionIndex, diff --git a/rust/tests/language_representation.rs b/rust/tests/language_representation.rs index f4aeb7bdfc..78af7d7f16 100644 --- a/rust/tests/language_representation.rs +++ b/rust/tests/language_representation.rs @@ -1,7 +1,7 @@ use std::path::PathBuf; use binaryninja::architecture::CoreArchitecture; -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::disassembly::{ DisassemblySettings, DisassemblyTextLine, InstructionTextToken, InstructionTextTokenKind, }; diff --git a/rust/tests/low_level_il.rs b/rust/tests/low_level_il.rs index e6f8d8ff3c..efae0a62bc 100644 --- a/rust/tests/low_level_il.rs +++ b/rust/tests/low_level_il.rs @@ -1,7 +1,6 @@ use binaryninja::architecture::{ Architecture, ArchitectureExt, CoreArchitecture, Intrinsic, Register, }; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use binaryninja::low_level_il::expression::{ ExpressionHandler, LowLevelExpressionIndex, LowLevelILExpressionKind, diff --git a/rust/tests/medium_level_il.rs b/rust/tests/medium_level_il.rs index a921965fc8..d4f7634587 100644 --- a/rust/tests/medium_level_il.rs +++ b/rust/tests/medium_level_il.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use binaryninja::medium_level_il::{ MediumLevelExpressionIndex, MediumLevelILInstructionKind, MediumLevelILLiftedInstructionKind, diff --git a/rust/tests/render_layer.rs b/rust/tests/render_layer.rs index 6f6ebc9818..6ca391df62 100644 --- a/rust/tests/render_layer.rs +++ b/rust/tests/render_layer.rs @@ -1,5 +1,4 @@ use binaryninja::basic_block::BasicBlock; -use binaryninja::binary_view::BinaryViewExt; use binaryninja::disassembly::{DisassemblyOption, DisassemblySettings, DisassemblyTextLine}; use binaryninja::function::NativeBlock; use binaryninja::headless::Session; diff --git a/rust/tests/section.rs b/rust/tests/section.rs index ea3d8e06f1..ab1703c613 100644 --- a/rust/tests/section.rs +++ b/rust/tests/section.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use binaryninja::section::{SectionBuilder, Semantics}; use std::path::PathBuf; diff --git a/rust/tests/type_container.rs b/rust/tests/type_container.rs index a0916ef41d..ab4cbb0b00 100644 --- a/rust/tests/type_container.rs +++ b/rust/tests/type_container.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::file_metadata::FileMetadata; use binaryninja::headless::Session; use binaryninja::platform::Platform; diff --git a/rust/tests/type_library.rs b/rust/tests/type_library.rs index 19115f3557..559aae7c19 100644 --- a/rust/tests/type_library.rs +++ b/rust/tests/type_library.rs @@ -1,4 +1,3 @@ -use binaryninja::binary_view::BinaryViewExt; use binaryninja::headless::Session; use binaryninja::platform::Platform; use binaryninja::types::{Type, TypeClass, TypeLibrary}; diff --git a/rust/tests/types.rs b/rust/tests/types.rs index c13a1c884a..a661b4ed71 100644 --- a/rust/tests/types.rs +++ b/rust/tests/types.rs @@ -1,4 +1,4 @@ -use binaryninja::binary_view::{BinaryView, BinaryViewExt}; +use binaryninja::binary_view::BinaryView; use binaryninja::confidence::Conf; use binaryninja::file_metadata::FileMetadata; use binaryninja::headless::Session; diff --git a/view/minidump/.gitignore b/view/minidump/.gitignore deleted file mode 100644 index 4fffb2f89c..0000000000 --- a/view/minidump/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/target -/Cargo.lock diff --git a/view/minidump/Cargo.toml b/view/minidump/Cargo.toml index adca858006..2f34407219 100644 --- a/view/minidump/Cargo.toml +++ b/view/minidump/Cargo.toml @@ -11,5 +11,6 @@ crate-type = ["cdylib"] [dependencies] binaryninja.workspace = true binaryninjacore-sys.workspace = true -minidump = "0.23.0" -tracing = "0.1" \ No newline at end of file +minidump = "0.26.1" +tracing = "0.1" +object = "0.39.1" \ No newline at end of file diff --git a/view/minidump/README.md b/view/minidump/README.md index 3c54ca8e68..799cf4b9da 100644 --- a/view/minidump/README.md +++ b/view/minidump/README.md @@ -1,21 +1,6 @@ -# Binary Ninja Minidump Loader +# Binary Ninja Minidump View -A Minidump memory dump loader plugin for Binary Ninja. - -![Screenshot of Binary Ninja using the "Minidump" Binary View, with a minidump loaded and the virtual addresses of the memory segments of the minidump showing in the Memory Map window](images/loaded-minidump-screenshot-border.png) - -This plugin adds a new _Minidump_ binary view type. When a binary with the magic number `MDMP` is opened, this plugin will automatically try to load in the binary as a minidump, and create a new _Minidump_ binary view to view the contents. - -The architecture is determined automatically from the platform information embedded in the minidump. - -![Screenshot showing the Minidump binary view type in the dropdown list of available binary views for an open binary](images/minidump-binary-view-type-screenshot-border.png) - -The loaded minidump's memory regions and modules can be navigated via the _Memory Map_ window. In the _Minidump_ binary view, the meanings of "Segments" and "Sections" in the Memory Map window are modified to mean the following: - -- The memory regions in the minidump are loaded as _Segments_. The _Data Offset_ and _Data Length_ fields of each segment are the corresponding addresses in the minidump file where the data for that memory region is located. -- The modules in the minidump are loaded as _Sections_, with the name of each section being the path to the module. - -![Screenshot showing the Memory Map window with the loaded minidump's memory segments and modules (i.e. "sections")](images/minidump-segments-sections-screenshot-border.png) +A Minidump binary view plugin for Binary Ninja. ## Supported Minidump Types @@ -44,22 +29,3 @@ minidump dumpfile.dmp - Loading Minidump files from platforms or APIs other than Windows' `MinidumpWriteDump`, such as those generated by [Google Breakpad](https://chromium.googlesource.com/breakpad/breakpad/). - Loading and applyng debug information from the minidump file. In Windows minidump files, `MinidumpModuleList` streams contain information about the PDB file which contains the debug information for the module; this isn't currently read or applied, however. -- Integration with Binary Ninja's built-in debugger. Minidump files can contain information about threads, register values, and stack frames, and it would be nice in the future for minidump files to be loadable back into the debugger in order to resume a debugging session. This isn't currently done, however. - -## Building and Installing - -This plugin currently needs to be built from source, then copied into your user plugin folder. - -``` -cargo build --release -cp target/release/libminidump_bn.so ~/.binaryninja/plugins/ -``` - -The code in this plugin targets the `dev` branch of the [Binary Ninja Rust API](https://github.com/Vector35/binaryninja-api/tree/dev/rust). - -To update the Binary Ninja Rust API dependency: - -``` -cargo update -p binaryninja -cargo build --release -``` \ No newline at end of file diff --git a/view/minidump/images/loaded-minidump-screenshot-border.png b/view/minidump/images/loaded-minidump-screenshot-border.png deleted file mode 100644 index 51b8282cde67636fc8f57676ced6edff4f409469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266633 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 RB8~7uXh*uPHH_T?ZiBp7f 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 HdinnVuKo2BccF-+^T~> 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�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 { - let mut memory_info_list_writer = Vec::new(); - match memory_info_list.print(&mut memory_info_list_writer) { - Ok(_) => { - if let Ok(memory_info_str) = str::from_utf8(&memory_info_list_writer) { - tracing::info!("{memory_info_str}"); - } else { - tracing::error!("Could not convert the memory information description from minidump into a valid string"); - } - } - Err(_) => { - tracing::error!("Could not get memory information from minidump"); - } - } - } else { - tracing::error!( - "Could not parse a valid MinidumpMemoryInfoList stream from the minidump" - ); - } - } else { - tracing::error!("Could not parse a valid minidump file from the parent binary view's data buffer"); - } - } else { - tracing::error!("Could not read data from parent binary view"); - } - } else { - tracing::error!("Could not get the parent binary view"); - } -} diff --git a/view/minidump/src/lib.rs b/view/minidump/src/lib.rs index 1b1f7f1967..4e057378fe 100644 --- a/view/minidump/src/lib.rs +++ b/view/minidump/src/lib.rs @@ -1,35 +1,12 @@ -use binaryninja::binary_view::BinaryView; -use binaryninja::command::{register_command, Command}; -use binaryninja::custom_binary_view::register_view_type; +use crate::view::MinidumpBinaryViewType; +use binaryninja::binary_view::register_binary_view_type; -mod command; mod view; -struct PrintMemoryInformationCommand; - -impl Command for PrintMemoryInformationCommand { - fn action(&self, binary_view: &BinaryView) { - command::print_memory_information(binary_view); - } - - fn valid(&self, _binary_view: &BinaryView) -> bool { - true // TODO: Of course, the command will not always be valid! - } -} - #[no_mangle] #[allow(non_snake_case)] pub extern "C" fn CorePluginInit() -> bool { binaryninja::tracing_init!("Minidump"); - tracing::debug!("Registering minidump binary view type"); - register_view_type("Minidump", "Minidump", view::MinidumpBinaryViewType::new); - - tracing::debug!("Registering minidump plugin commands"); - register_command( - "Minidump\\[DEBUG] Print Minidump Memory Information", - "Print a human-readable description of the contents of the MinidumpMemoryInfoList stream in the loaded minidump", - PrintMemoryInformationCommand {}, - ); - + register_binary_view_type(MinidumpBinaryViewType); true } diff --git a/view/minidump/src/view.rs b/view/minidump/src/view.rs index 8baf30c2b7..2c72f81e0b 100644 --- a/view/minidump/src/view.rs +++ b/view/minidump/src/view.rs @@ -1,357 +1,137 @@ -use std::collections::HashMap; -use std::ops::Range; - -use binaryninja::section::Section; -use binaryninja::segment::{Segment, SegmentFlags}; -use minidump::format::MemoryProtection; -use minidump::{ - Minidump, MinidumpMemory64List, MinidumpMemoryInfoList, MinidumpMemoryList, MinidumpModuleList, - MinidumpStream, MinidumpSystemInfo, Module, -}; - -use binaryninja::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; -use binaryninja::custom_binary_view::{ - BinaryViewType, BinaryViewTypeBase, CustomBinaryView, CustomBinaryViewType, CustomView, - CustomViewBuilder, -}; +use binaryninja::binary_view::{BinaryView, BinaryViewBase}; +use binaryninja::binary_view::{CustomBinaryView, CustomBinaryViewType}; +use binaryninja::data_buffer::DataBuffer; use binaryninja::platform::Platform; +use binaryninja::rc::Ref; +use binaryninja::section::{SectionBuilder, Semantics}; +use binaryninja::segment::SegmentFlags; +use binaryninja::symbol::{SymbolBuilder, SymbolType}; use binaryninja::Endianness; +use minidump::format::MemoryProtection; +use minidump::system_info::{Cpu, Os, PointerWidth}; +use minidump::{Minidump, MinidumpMemoryInfoList, MinidumpModuleList}; +use minidump::{MinidumpSystemInfo, Module}; +use object::{Object, ObjectSection, ObjectSymbol, SectionKind, SymbolKind}; -type BinaryViewResult = binaryninja::binary_view::Result; - -/// The _Minidump_ binary view type, which the Rust plugin registers with the Binary Ninja core -/// (via `binaryninja::custombinaryview::register_view_type`) as a possible binary view -/// that can be applied to opened binaries. -/// -/// If this view type is valid for an opened binary (determined by `is_valid_for`), -/// the Binary Ninja core then uses this view type to create an actual instance of the _Minidump_ -/// binary view (via `create_custom_view`). -pub struct MinidumpBinaryViewType { - view_type: BinaryViewType, -} - -impl MinidumpBinaryViewType { - pub fn new(view_type: BinaryViewType) -> Self { - MinidumpBinaryViewType { view_type } - } -} - -impl AsRef for MinidumpBinaryViewType { - fn as_ref(&self) -> &BinaryViewType { - &self.view_type - } -} - -impl BinaryViewTypeBase for MinidumpBinaryViewType { - fn is_deprecated(&self) -> bool { - false - } - - fn is_force_loadable(&self) -> bool { - false - } - - fn is_valid_for(&self, data: &BinaryView) -> bool { - let mut magic_number = Vec::::new(); - data.read_into_vec(&mut magic_number, 0, 4); - - magic_number == b"MDMP" - } -} +pub struct MinidumpBinaryViewType; impl CustomBinaryViewType for MinidumpBinaryViewType { - fn create_custom_view<'builder>( - &self, - data: &BinaryView, - builder: CustomViewBuilder<'builder, Self>, - ) -> BinaryViewResult> { - tracing::debug!("Creating MinidumpBinaryView from registered MinidumpBinaryViewType"); - - let binary_view = builder.create::(data, ()); - binary_view - } -} - -#[derive(Debug)] -struct SegmentData { - rva_range: Range, - mapped_addr_range: Range, -} - -impl SegmentData { - fn from_addresses_and_size(rva: u64, mapped_addr: u64, size: u64) -> Self { - SegmentData { - rva_range: Range { - start: rva, - end: rva + size, - }, - mapped_addr_range: Range { - start: mapped_addr, - end: mapped_addr + size, - }, + type CustomBinaryView = MinidumpBinaryView; + const NAME: &'static str = "Minidump"; + + fn create_binary_view(&self, data: &BinaryView) -> Result { + match MinidumpBinaryView::new(data) { + Ok(minidump_binary_view) => Ok(minidump_binary_view), + Err(e) => { + tracing::error!("Failed to create minidump binary view: {}", e); + Err(()) + } } } -} -#[derive(Debug)] -struct SegmentMemoryProtection { - readable: bool, - writable: bool, - executable: bool, + fn is_valid_for(&self, data: &BinaryView) -> bool { + // Check for the MDMP magic bytes + let magic = [0x4d, 0x44, 0x4d, 0x50]; + let mut buffer = [0u8; 4]; + data.read(&mut buffer, 0); + buffer == magic + } } -/// An instance of the actual _Minidump_ custom binary view. +/// An instance of the actual custom Minidump binary view. +/// /// This contains the main logic to load the memory segments inside a minidump file into the binary view. pub struct MinidumpBinaryView { - /// The handle to the "real" BinaryView object, in the Binary Ninja core. - inner: binaryninja::rc::Ref, + minidump: Minidump<'static, Vec>, + endianness: Endianness, + address_size: usize, + /// The entry point of the main module. + /// + /// This will be set inside [`MinidumpBinaryView::initialize`], so won't be immediately available. + main_entry_point: Option, } impl MinidumpBinaryView { - fn new(view: &BinaryView) -> Self { - MinidumpBinaryView { - inner: view.to_owned(), - } - } - - fn init(&self) -> BinaryViewResult<()> { - let parent_view = self.parent_view().ok_or(())?; - let read_buffer = parent_view - .read_buffer(0, parent_view.len() as usize) - .ok_or(())?; - - if let Ok(minidump_obj) = Minidump::read(read_buffer.get_data()) { - // Architecture, platform information - if let Ok(minidump_system_info) = minidump_obj.get_stream::() { - if let Some(platform) = MinidumpBinaryView::translate_minidump_platform( - minidump_system_info.cpu, - minidump_obj.endian, - minidump_system_info.os, - ) { - self.set_default_platform(&platform); - } else { - tracing::error!( - "Could not parse valid system information from minidump: could not map system information in MinidumpSystemInfo stream (arch {:?}, endian {:?}, os {:?}) to a known architecture", - minidump_system_info.cpu, - minidump_obj.endian, - minidump_system_info.os, - ); - return Err(()); - } - } else { - tracing::error!( - "Could not parse system information from minidump: could not find a valid MinidumpSystemInfo stream" - ); - return Err(()); - } - - // Memory segments - let mut segment_data = Vec::::new(); - - // Memory segments in a full memory dump (MinidumpMemory64List) - // Grab the shared base RVA for all entries in the MinidumpMemory64List, - // since the minidump crate doesn't expose this to us - if let Ok(raw_stream) = minidump_obj.get_raw_stream(MinidumpMemory64List::STREAM_TYPE) { - if let Ok(base_rva_array) = raw_stream[8..16].try_into() { - let base_rva = u64::from_le_bytes(base_rva_array); - tracing::debug!("Found BaseRVA value {:#x}", base_rva); - - if let Ok(minidump_memory_list) = - minidump_obj.get_stream::() - { - let mut current_rva = base_rva; - for memory_segment in minidump_memory_list.iter() { - tracing::debug!( - "Found memory segment at RVA {:#x} with virtual address {:#x} and size {:#x}", - current_rva, - memory_segment.base_address, - memory_segment.size, - ); - segment_data.push(SegmentData::from_addresses_and_size( - current_rva, - memory_segment.base_address, - memory_segment.size, - )); - current_rva += memory_segment.size; - } - } - } else { - tracing::error!( - "Could not parse BaseRVA value shared by all entries in the MinidumpMemory64List stream" - ) - } - } else { - tracing::warn!( - "Could not read memory from minidump: could not find a valid MinidumpMemory64List stream. This minidump may not be a full memory dump. Trying to find partial dump memory from a MinidumpMemoryList now..." - ); - // Memory segments in a regular memory dump (MinidumpMemoryList), - // i.e. one that does not include the full process memory data. - if let Ok(minidump_memory_list) = minidump_obj.get_stream::() { - for memory_segment in minidump_memory_list.by_addr() { - tracing::debug!( - "Found memory segment at RVA {:#x} with virtual address {:#x} and size {:#x}", - memory_segment.desc.memory.rva, - memory_segment.base_address, - memory_segment.size - ); - segment_data.push(SegmentData::from_addresses_and_size( - memory_segment.desc.memory.rva as u64, - memory_segment.base_address, - memory_segment.size, - )); - } - } else { - tracing::error!( - "Could not read any memory from minidump: could not find a valid MinidumpMemory64List stream or a valid MinidumpMemoryList stream." - ); - } - } - - // Memory protection information - let mut segment_protection_data = HashMap::new(); - - if let Ok(minidump_memory_info_list) = - minidump_obj.get_stream::() - { - for memory_info in minidump_memory_info_list.iter() { - if let Some(memory_range) = memory_info.memory_range() { - tracing::debug!( - "Found memory protection info for memory segment ranging from virtual address {:#x} to {:#x}: {:#?}", - memory_range.start, - memory_range.end, - memory_info.protection - ); - segment_protection_data.insert( - // The range returned to us by MinidumpMemoryInfoList is an - // end-inclusive range_map::Range; we need to add 1 to - // the end index to make it into an end-exclusive std::ops::Range. - Range { - start: memory_range.start, - end: memory_range.end + 1, - }, - memory_info.protection, - ); - } - } + pub fn new(data: &BinaryView) -> Result { + let read_buffer = data + .read_buffer(0, data.len() as usize) + .ok_or("Failed to read data from binary view".to_string())?; + let minidump = Minidump::read(read_buffer.get_data().to_vec()) + .map_err(|e| format!("Failed to parse minidump: {}", e))?; + let system_info = minidump + .get_stream::() + .map_err(|e| format!("Failed to get system info stream: {}", e))?; + let endianness = match minidump.endian { + minidump::Endian::Little => Endianness::LittleEndian, + minidump::Endian::Big => Endianness::BigEndian, + }; + let address_size = match system_info.cpu.pointer_width() { + PointerWidth::Bits32 => 4, + PointerWidth::Bits64 => 8, + PointerWidth::Unknown => { + tracing::warn!("Unknown pointer width, defaulting to 32-bit"); + 4 } + }; - for segment in segment_data.iter() { - if let Some(segment_protection) = - segment_protection_data.get(&segment.mapped_addr_range) - { - let segment_memory_protection = - MinidumpBinaryView::translate_memory_protection(*segment_protection); - - tracing::info!( - "Adding memory segment at virtual address {:#x} to {:#x}, from data range {:#x} to {:#x}, with protections readable {}, writable {}, executable {}", - segment.mapped_addr_range.start, - segment.mapped_addr_range.end, - segment.rva_range.start, - segment.rva_range.end, - segment_memory_protection.readable, - segment_memory_protection.writable, - segment_memory_protection.executable, - ); - - let segment_flags = SegmentFlags::new() - .readable(segment_memory_protection.readable) - .writable(segment_memory_protection.writable) - .executable(segment_memory_protection.executable); - - self.add_segment( - Segment::builder(segment.mapped_addr_range.clone()) - .parent_backing(segment.rva_range.clone()) - .is_auto(true) - .flags(segment_flags), - ); - } else { - tracing::error!( - "Could not find memory protection information for memory segment from {:#x} to {:#x}", segment.mapped_addr_range.start, - segment.mapped_addr_range.end, - ); - } - } + Ok(MinidumpBinaryView { + minidump, + endianness, + address_size, + main_entry_point: None, + }) + } - // Module information - // This stretches the concept a bit, but we can add each module as a - // separate "section" of the binary. - // Sections can be named, and can span multiple segments. - if let Ok(minidump_module_list) = minidump_obj.get_stream::() { - for module_info in minidump_module_list.by_addr() { - tracing::info!( - "Found module with name {} at virtual address {:#x} with size {:#x}", - module_info.name, - module_info.base_address(), - module_info.size(), - ); - let module_address_range = Range { - start: module_info.base_address(), - end: module_info.base_address() + module_info.size(), - }; - self.add_section( - Section::builder(module_info.name.clone(), module_address_range) - .is_auto(true), - ); - } - } else { - tracing::warn!( - "Could not find valid module information in minidump: could not find a valid MinidumpModuleList stream" - ); - } - } else { - tracing::error!("Could not parse data as minidump"); - return Err(()); - } - Ok(()) + pub fn translate_platform( + &self, + system_info: &MinidumpSystemInfo, + ) -> Result, String> { + let platform_name = self.translate_platform_name(system_info.os, system_info.cpu)?; + Platform::by_name(platform_name) + .ok_or_else(|| format!("Could not find platform {}", platform_name)) } - fn translate_minidump_platform( - minidump_cpu_arch: minidump::system_info::Cpu, - minidump_endian: minidump::Endian, - minidump_os: minidump::system_info::Os, - ) -> Option> { - match minidump_os { - minidump::system_info::Os::Windows => match minidump_cpu_arch { - minidump::system_info::Cpu::Arm64 => Platform::by_name("windows-aarch64"), - minidump::system_info::Cpu::Arm => Platform::by_name("windows-armv7"), - minidump::system_info::Cpu::X86 => Platform::by_name("windows-x86"), - minidump::system_info::Cpu::X86_64 => Platform::by_name("windows-x86_64"), - _ => None, + pub fn translate_platform_name(&self, os: Os, cpu: Cpu) -> Result<&'static str, String> { + match os { + Os::Windows => match cpu { + Cpu::Arm64 => Ok("windows-aarch64"), + Cpu::Arm => Ok("windows-armv7"), + Cpu::X86 => Ok("windows-x86"), + Cpu::X86_64 => Ok("windows-x86_64"), + _ => Err("Unsupported CPU architecture".to_string()), }, - minidump::system_info::Os::MacOs => match minidump_cpu_arch { - minidump::system_info::Cpu::Arm64 => Platform::by_name("mac-aarch64"), - minidump::system_info::Cpu::Arm => Platform::by_name("mac-armv7"), - minidump::system_info::Cpu::X86 => Platform::by_name("mac-x86"), - minidump::system_info::Cpu::X86_64 => Platform::by_name("mac-x86_64"), - _ => None, + Os::MacOs => match cpu { + Cpu::Arm64 => Ok("mac-aarch64"), + Cpu::Arm => Ok("mac-armv7"), + Cpu::X86 => Ok("mac-x86"), + Cpu::X86_64 => Ok("mac-x86_64"), + _ => Err("Unsupported CPU architecture".to_string()), }, - minidump::system_info::Os::Linux => match minidump_cpu_arch { - minidump::system_info::Cpu::Arm64 => Platform::by_name("linux-aarch64"), - minidump::system_info::Cpu::Arm => Platform::by_name("linux-armv7"), - minidump::system_info::Cpu::X86 => Platform::by_name("linux-x86"), - minidump::system_info::Cpu::X86_64 => Platform::by_name("linux-x86_64"), - minidump::system_info::Cpu::Ppc => match minidump_endian { - minidump::Endian::Little => Platform::by_name("linux-ppc32_le"), - minidump::Endian::Big => Platform::by_name("linux-ppc32"), + Os::Linux => match cpu { + Cpu::Arm64 => Ok("linux-aarch64"), + Cpu::Arm => Ok("linux-armv7"), + Cpu::X86 => Ok("linux-x86"), + Cpu::X86_64 => Ok("linux-x86_64"), + Cpu::Ppc => match self.endianness { + Endianness::LittleEndian => Ok("linux-ppc32_le"), + Endianness::BigEndian => Ok("linux-ppc32"), }, - minidump::system_info::Cpu::Ppc64 => match minidump_endian { - minidump::Endian::Little => Platform::by_name("linux-ppc64_le"), - minidump::Endian::Big => Platform::by_name("linux-ppc64"), + Cpu::Ppc64 => match self.endianness { + Endianness::LittleEndian => Ok("linux-ppc64_le"), + Endianness::BigEndian => Ok("linux-ppc64"), }, - _ => None, + _ => Err("Unsupported CPU architecture".to_string()), }, - minidump::system_info::Os::NaCl => None, - minidump::system_info::Os::Android => None, - minidump::system_info::Os::Ios => None, - minidump::system_info::Os::Ps3 => None, - minidump::system_info::Os::Solaris => None, - _ => None, + // TODO: Support iOS + Os::Ios => Err("Unsupported operating system".to_string()), + _ => Err("Unsupported operating system".to_string()), } } - fn translate_memory_protection( + pub fn translate_memory_protection( + &self, minidump_memory_protection: MemoryProtection, - ) -> SegmentMemoryProtection { + ) -> SegmentFlags { let (readable, writable, executable) = match minidump_memory_protection { MemoryProtection::PAGE_NOACCESS => (false, false, false), MemoryProtection::PAGE_READONLY => (true, false, false), @@ -367,50 +147,163 @@ impl MinidumpBinaryView { MemoryProtection::PAGE_WRITECOMBINE => (false, false, false), _ => (false, false, false), }; - SegmentMemoryProtection { - readable, - writable, - executable, - } - } -} - -impl AsRef for MinidumpBinaryView { - fn as_ref(&self) -> &BinaryView { - &self.inner + SegmentFlags::new() + .readable(readable) + .writable(writable) + .executable(executable) } } impl BinaryViewBase for MinidumpBinaryView { - // TODO: This should be filled out with the actual address size - // from the platform information in the minidump. - fn address_size(&self) -> usize { - 0 + fn entry_point(&self) -> u64 { + self.main_entry_point.unwrap_or(0) } fn default_endianness(&self) -> Endianness { - // TODO: This should be filled out with the actual endianness - // from the platform information in the minidump. - Endianness::LittleEndian + self.endianness } - fn entry_point(&self) -> u64 { - // TODO: We should fill this out with a real entry point. - // This can be done by getting the main module of the minidump - // with MinidumpModuleList::main_module, - // then parsing the PE metadata of the main module to find its entry point(s). - 0 + fn address_size(&self) -> usize { + self.address_size } } -unsafe impl CustomBinaryView for MinidumpBinaryView { - type Args = (); +impl CustomBinaryView for MinidumpBinaryView { + fn initialize(&mut self, view: &BinaryView) -> bool { + let Ok(system_info) = self.minidump.get_stream::() else { + tracing::error!("Could not find a valid MinidumpSystemInfo stream"); + return false; + }; - fn new(handle: &BinaryView, _args: &Self::Args) -> BinaryViewResult { - Ok(MinidumpBinaryView::new(handle)) - } + let platform = match self.translate_platform(&system_info) { + Ok(platform) => platform, + Err(err) => { + tracing::error!("Could not determine platform: {}", err); + return false; + } + }; + view.set_default_platform(&platform); + + let Some(unified_memory_list) = self.minidump.get_memory() else { + tracing::error!("Could not find a valid memory list stream"); + return false; + }; + + // Some full memory dumps don't have memory info, so we will fall back to default segment flags in that case. + let memory_info_list = self + .minidump + .get_stream::() + .inspect_err(|e| tracing::warn!("Could not find a valid memory info list stream: '{}' no segment flags will be set", e)) + .ok(); + + for memory in unified_memory_list.iter() { + let Some(memory_range) = memory.memory_range() else { + tracing::error!( + "Could not find a valid memory range for memory segment: {:?}", + memory + ); + continue; + }; + + // If we are opening the view again, this will already be filled from the first load, so skip it. + if view + .memory_map() + .get_active_region_at(memory_range.start) + .is_some() + { + tracing::debug!("Skipping memory segment {:0x} because it overlaps with an existing memory region", memory_range.start); + continue; + } + + let segment_flags = memory_info_list + .as_ref() + .and_then(|list| list.memory_info_at_address(memory.base_address())) + .map(|info| self.translate_memory_protection(info.protection)); + + // TODO: The parent backing _is_ the memory range itself, we currently add that memory range + // TODO: after the fact instead of deriving it from the contents of the file itself. + let buffer = DataBuffer::new(memory.bytes()); + view.memory_map().add_data_memory_region( + &format!("{:0x}", memory_range.start), + memory_range.start, + &buffer, + segment_flags, + ); + } + + let Ok(module_list) = self.minidump.get_stream::() else { + tracing::warn!( + "Could not find a valid module list stream, no module sections will be added!" + ); + return true; + }; + + let main_module_addr = module_list + .main_module() + .map(|module| module.base_address()); + + for module in module_list.iter() { + tracing::info!( + "Loading module '{}' at {:0x}", + module.name, + module.base_address() + ); + let mut buffer: Vec = vec![0; module.size() as usize]; + let read_length = view.read(&mut buffer, module.base_address()); + if read_length != module.size() as usize { + tracing::error!("Could not read module: {:?}", module); + continue; + } + let file = match object::File::parse(&*buffer) { + Ok(file) => file, + Err(e) => { + tracing::error!("Could not parse module: {:?}: {}", module.name, e); + continue; + } + }; + for section in file.sections() { + let section_name = + format!("{}:{}", module.name, section.name().unwrap_or("")); + let section_range = section.address()..section.address() + section.size(); + let section_semantics = match section.kind() { + SectionKind::Unknown => Semantics::DefaultSection, + SectionKind::Text => Semantics::ReadOnlyCode, + SectionKind::Data => Semantics::ReadWriteData, + SectionKind::ReadOnlyData => Semantics::ReadOnlyData, + SectionKind::ReadOnlyDataWithRel => Semantics::ReadOnlyData, + SectionKind::ReadOnlyString => Semantics::ReadOnlyData, + SectionKind::UninitializedData => Semantics::ReadOnlyData, + _ => Semantics::DefaultSection, + }; + let section_builder = SectionBuilder::new(section_name, section_range) + .align(section.align()) + .semantics(section_semantics) + .is_auto(true); + view.add_section(section_builder); + } + for symbol in file.symbols() { + let symbol_name = symbol.name().unwrap_or(""); + let symbol_type = match symbol.kind() { + SymbolKind::Unknown => SymbolType::Symbolic, + SymbolKind::Text => SymbolType::Function, + SymbolKind::Data => SymbolType::Data, + SymbolKind::Section => SymbolType::Symbolic, + SymbolKind::File => SymbolType::Symbolic, + SymbolKind::Label => SymbolType::LocalLabel, + SymbolKind::Tls => SymbolType::Symbolic, + _ => SymbolType::Symbolic, + }; + let symbol = + SymbolBuilder::new(symbol_type, symbol_name, symbol.address()).create(); + view.define_auto_symbol(&symbol); + } + view.add_entry_point(file.entry()); + // Set this so [`BinaryView::entry_point`] knows which is the main entry point. + if main_module_addr.is_some_and(|addr| addr == module.base_address()) { + self.main_entry_point = Some(file.entry()); + } + } - fn init(&mut self, _args: Self::Args) -> BinaryViewResult<()> { - MinidumpBinaryView::init(self) + true } } From 35c38a68db0449ed54eeba59bee7a514ec6467cf Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Thu, 23 Apr 2026 12:50:48 -0700 Subject: [PATCH 2/2] [Rust] Update repository API unit tests following recent changes --- rust/tests/repository.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rust/tests/repository.rs b/rust/tests/repository.rs index ac861b2cde..0dc26517f9 100644 --- a/rust/tests/repository.rs +++ b/rust/tests/repository.rs @@ -4,15 +4,14 @@ use binaryninja::repository::RepositoryManager; #[test] fn test_list() { let _session = Session::new().expect("Failed to initialize session"); - let manager = RepositoryManager::default(); - let repositories = manager.repositories(); + let repositories = RepositoryManager::repositories(); for repository in &repositories { let repo_path = repository.path(); - let repository_by_path = manager.repository_by_path(&repo_path).unwrap(); + let repository_by_path = RepositoryManager::repository_by_path(&repo_path).unwrap(); assert_eq!(repository.url(), repository_by_path.url()); } - let repository = manager.default_repository(); + let repository = RepositoryManager::default_repository(); let _full_path = repository.full_path(); let _path = repository.path(); let _url = repository.url();