diff options
| author | Mason Reed <mason@vector35.com> | 2025-02-06 23:58:33 -0500 |
|---|---|---|
| committer | Mason Reed <mason@vector35.com> | 2025-02-06 23:58:33 -0500 |
| commit | f9bd8eb2a8aa8b492d4145624d12e7014c7ee65c (patch) | |
| tree | 2d9fa45c718eab1bb373a290eddfa7e38d806faa /rust | |
| parent | 3fd8d8123d52330dc1fae22371c4b4298f709eba (diff) | |
Fix BinaryReader and BinaryWriter not respecting image base in Rust API
Diffstat (limited to 'rust')
| -rw-r--r-- | rust/src/binary_reader.rs | 2 | ||||
| -rw-r--r-- | rust/src/binary_writer.rs | 17 | ||||
| -rw-r--r-- | rust/tests/binary_reader.rs | 5 | ||||
| -rw-r--r-- | rust/tests/binary_writer.rs | 4 |
4 files changed, 16 insertions, 12 deletions
diff --git a/rust/src/binary_reader.rs b/rust/src/binary_reader.rs index da29b515..1ee4e73e 100644 --- a/rust/src/binary_reader.rs +++ b/rust/src/binary_reader.rs @@ -105,6 +105,8 @@ impl Seek for BinaryReader { SeekFrom::Current(offset) => self.seek_to_relative_offset(offset), SeekFrom::Start(offset) => self.seek_to_offset(offset), SeekFrom::End(end_offset) => { + // We do NOT need to add the image base here as + // the reader (unlike the writer) can set the virtual base. let offset = self.view .len() diff --git a/rust/src/binary_writer.rs b/rust/src/binary_writer.rs index ce713435..e4387d70 100644 --- a/rust/src/binary_writer.rs +++ b/rust/src/binary_writer.rs @@ -17,7 +17,7 @@ use binaryninjacore_sys::*; use std::fmt::Debug; -use crate::binary_view::{BinaryView, BinaryViewBase}; +use crate::binary_view::{BinaryView, BinaryViewBase, BinaryViewExt}; use crate::Endianness; use crate::rc::Ref; @@ -85,14 +85,13 @@ impl Seek for BinaryWriter { SeekFrom::Current(offset) => self.seek_to_relative_offset(offset), SeekFrom::Start(offset) => self.seek_to_offset(offset), SeekFrom::End(end_offset) => { - let offset = - self.view - .len() - .checked_add_signed(end_offset) - .ok_or(std::io::Error::new( - ErrorKind::Other, - "Seeking from end overflowed", - ))?; + let view_end = self.view.original_image_base() + self.view.len(); + let offset = view_end + .checked_add_signed(end_offset) + .ok_or(std::io::Error::new( + ErrorKind::Other, + "Seeking from end overflowed", + ))?; self.seek_to_offset(offset); } }; diff --git a/rust/tests/binary_reader.rs b/rust/tests/binary_reader.rs index 88017052..592025e0 100644 --- a/rust/tests/binary_reader.rs +++ b/rust/tests/binary_reader.rs @@ -1,5 +1,5 @@ use binaryninja::binary_reader::BinaryReader; -use binaryninja::binary_view::BinaryViewBase; +use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; use binaryninja::headless::Session; use rstest::*; use std::io::{Read, Seek, SeekFrom}; @@ -55,6 +55,9 @@ fn test_binary_reader_read(_session: &Session) { let view = binaryninja::load(out_dir.join("atox.obj")).expect("Failed to create view"); let mut reader = BinaryReader::new(&view); + // We want to do seeks with the image base. + reader.set_virtual_base(view.original_image_base()); + reader .seek(SeekFrom::Start(0)) .expect("Failed to seek to start"); diff --git a/rust/tests/binary_writer.rs b/rust/tests/binary_writer.rs index bc9c2165..632d0e64 100644 --- a/rust/tests/binary_writer.rs +++ b/rust/tests/binary_writer.rs @@ -1,5 +1,5 @@ use binaryninja::binary_reader::BinaryReader; -use binaryninja::binary_view::BinaryViewBase; +use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt}; use binaryninja::binary_writer::BinaryWriter; use binaryninja::headless::Session; use rstest::*; @@ -17,7 +17,7 @@ fn test_binary_writer_seek(_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"); let mut writer = BinaryWriter::new(&view); - let end_offset = view.len(); + let end_offset = view.original_image_base() + view.len(); // Test seeking to a specific position writer |
