summaryrefslogtreecommitdiff
path: root/rust/tests/binary_view.rs
blob: 65f6b45b5992e7ff2e2a3e0d11bcb79afbf533a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use binaryninja::binary_view::{AnalysisState, BinaryViewBase, BinaryViewExt};
use binaryninja::headless::Session;
use binaryninja::symbol::{SymbolBuilder, SymbolType};
use rstest::*;
use std::path::PathBuf;

#[fixture]
#[once]
fn session() -> Session {
    Session::new().expect("Failed to initialize session")
}

#[rstest]
fn test_binary_loading(_session: &Session) {
    let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
    let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
    assert!(view.has_initial_analysis(), "No initial analysis");
    assert_eq!(view.analysis_progress().state, AnalysisState::IdleState);
    assert_eq!(view.file().is_analysis_changed(), true);
    assert_eq!(view.file().is_database_backed(), false);
}

#[rstest]
fn test_binary_saving(_session: &Session) {
    let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
    let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
    // Verify the contents before we modify.
    let original_contents = view.read_vec(0x1560, 4);
    assert_eq!(original_contents, [0x00, 0xf1, 0x00, 0x00]);
    assert_eq!(view.write(0x1560, &[0xff, 0xff, 0xff, 0xff]), 4);
    // Verify that we modified the binary
    let modified_contents = view.read_vec(0x1560, 4);
    assert_eq!(modified_contents, [0xff, 0xff, 0xff, 0xff]);
    // Save the modified file
    assert!(view.save_to_path(out_dir.join("atox.obj.new")));
    // Verify that the file exists and is modified.
    let new_view =
        binaryninja::load(out_dir.join("atox.obj.new")).expect("Failed to load new view");
    assert_eq!(new_view.read_vec(0x1560, 4), [0xff, 0xff, 0xff, 0xff]);
}

#[rstest]
fn test_binary_saving_database(_session: &Session) {
    let out_dir = env!("OUT_DIR").parse::<PathBuf>().unwrap();
    let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view");
    // Update a symbol to verify modification
    let entry_function = view
        .entry_point_function()
        .expect("Failed to get entry point function");
    let new_entry_func_symbol =
        SymbolBuilder::new(SymbolType::Function, "test", entry_function.start()).create();
    view.define_user_symbol(&new_entry_func_symbol);
    // Verify that we modified the binary
    assert_eq!(entry_function.symbol().raw_name().as_str(), "test");
    // Save the modified database.
    assert!(view.file().create_database(out_dir.join("atox.obj.bndb")));
    // Verify that the file exists and is modified.
    let new_view =
        binaryninja::load(out_dir.join("atox.obj.bndb")).expect("Failed to load new view");
    let new_entry_function = new_view
        .entry_point_function()
        .expect("Failed to get entry point function");
    assert_eq!(new_entry_function.symbol().raw_name().as_str(), "test");
}