diff options
| author | Mason Reed <mason@vector35.com> | 2025-07-13 17:34:02 -0400 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-07-15 12:34:43 -0400 |
| commit | bd1b6b8a1a75df296da5c7afa8107ba301c9cd8e (patch) | |
| tree | b0155db15147c9d91da10519ee72eb87560ba2d4 /rust/tests/binary_view.rs | |
| parent | fa3c81fd9b4287792c3e3d534a7d237d6005cb5f (diff) | |
[Rust] Add `BinaryView::search` and friends
Diffstat (limited to 'rust/tests/binary_view.rs')
| -rw-r--r-- | rust/tests/binary_view.rs | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/rust/tests/binary_view.rs b/rust/tests/binary_view.rs index 5e8206e0..c3dfc1b8 100644 --- a/rust/tests/binary_view.rs +++ b/rust/tests/binary_view.rs @@ -1,11 +1,13 @@ +use binaryninja::binary_view::search::SearchQuery; use binaryninja::binary_view::{AnalysisState, BinaryViewBase, BinaryViewExt}; -use binaryninja::function::Function; +use binaryninja::data_buffer::DataBuffer; +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::symbol::{Symbol, SymbolBuilder, SymbolType}; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashSet}; use std::path::PathBuf; #[test] @@ -100,6 +102,48 @@ fn test_binary_view_strings() { } #[test] +fn test_binary_view_search() { + let _session = Session::new().expect("Failed to initialize session"); + let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap(); + let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view"); + let image_base = view.original_image_base(); + + // Test text search. + let txt_1580 = view + .find_next_text(0, view.end(), "minkernel", FunctionViewType::MediumLevelIL) + .expect("Failed to find text 'minkernel'"); + assert_eq!(txt_1580, image_base + 0x1580); + + // Test data search. + // 65 5c 6d 69 6e 6b 65 72 6e 65 6c (prepend bytes + minkernel) + let data = DataBuffer::new(&[ + 0x65, 0x5c, 0x6d, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + ]); + let data_1580 = view + .find_next_data(0, view.end(), &data) + .expect("Failed to find data"); + assert_eq!(data_1580, image_base + 0x1580); + + // Test constant search. + let constant = 0x80000000; + let const_2607b = view + .find_next_constant(0, view.end(), constant, FunctionViewType::MediumLevelIL) + .expect("Failed to find constant"); + assert_eq!(const_2607b, image_base + 0x2607b); + + // Test binary search. + let query = SearchQuery::new("42 2e 64 65 ?? 75 67 24"); + let mut found: HashSet<u64> = HashSet::new(); + let found_any = view.search(&query, |offset, _data| { + found.insert(offset); + true + }); + assert!(found_any); + assert_eq!(found.len(), 1); + assert_eq!(found.contains(&(&image_base + 0x63)), true); +} + +#[test] fn test_binary_tags() { let _session = Session::new().expect("Failed to initialize session"); let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap(); |
