diff options
| -rw-r--r-- | docs/about/open-source.md | 3 | ||||
| -rw-r--r-- | rust/Cargo.lock | 56 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/lib.rs | 10 | ||||
| -rw-r--r-- | rust/examples/dwarf/shared/Cargo.toml | 2 | ||||
| -rw-r--r-- | rust/examples/dwarf/shared/src/lib.rs | 63 |
5 files changed, 103 insertions, 31 deletions
diff --git a/docs/about/open-source.md b/docs/about/open-source.md index ea45a19c..5e8da5a6 100644 --- a/docs/about/open-source.md +++ b/docs/about/open-source.md @@ -247,6 +247,7 @@ The previous tools are used in the generation of our documentation, but are not - [which] ([which license] - MIT) - [x509-signature] ([x509-signature license] - APACHE 2.0 / MIT) - [zerocopy] ([zerocopy license] - APACHE 2.0 / MIT) + - [zstd-rs] ([zstd-rs license] - MIT) * Other - [yasm] ([yasm license] - 2-clause BSD) used for assembling x86 and x64 @@ -356,6 +357,8 @@ Please note that we offer no support for running Binary Ninja with modified Qt l [JSON for Modern C++ license]: https://github.com/nlohmann/json/blob/develop/LICENSE.MIT [zstd]: https://github.com/facebook/zstd/ [zstd license]: https://github.com/facebook/zstd/blob/dev/LICENSE +[zstd-rs]: https://github.com/gyscos/zstd-rs +[zstd-rs license]: https://github.com/gyscos/zstd-rs/blob/main/LICENSE [deprecation]: https://github.com/briancurtin/deprecation [deprecation license]: https://github.com/briancurtin/deprecation/blob/master/LICENSE [API / Documentation]: https://github.com/vector35/binaryninja-api diff --git a/rust/Cargo.lock b/rust/Cargo.lock index e922d98e..2484a7ba 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -171,6 +171,17 @@ dependencies = [ ] [[package]] +name = "cc" +version = "1.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e80e3b6a3ab07840e1cae9b0666a63970dc28e8ed5ffbcdacbfc760c281bfc1" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] name = "cexpr" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -361,6 +372,8 @@ version = "0.1.0" dependencies = [ "binaryninja", "gimli", + "thiserror", + "zstd", ] [[package]] @@ -532,6 +545,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -764,6 +786,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] name = "powerfmt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1214,3 +1242,31 @@ dependencies = [ "quote", "syn 2.0.52", ] + +[[package]] +name = "zstd" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.13+zstd.1.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust/examples/dwarf/dwarf_import/src/lib.rs b/rust/examples/dwarf/dwarf_import/src/lib.rs index 114084a1..13c18a8c 100644 --- a/rust/examples/dwarf/dwarf_import/src/lib.rs +++ b/rust/examples/dwarf/dwarf_import/src/lib.rs @@ -385,7 +385,15 @@ fn parse_dwarf( let endian = get_endian(view); let mut section_reader = |section_id: SectionId| -> _ { create_section_reader(section_id, view, endian, dwo_file) }; - let mut dwarf = Dwarf::load(&mut section_reader).unwrap(); + + let mut dwarf = match Dwarf::load(&mut section_reader) { + Ok(x) => x, + Err(e) => { + error!("Failed to load DWARF info: {}", e); + return Err(()); + } + }; + if dwo_file { dwarf.file_type = DwarfFileType::Dwo; } diff --git a/rust/examples/dwarf/shared/Cargo.toml b/rust/examples/dwarf/shared/Cargo.toml index c5b9a978..ac20aac1 100644 --- a/rust/examples/dwarf/shared/Cargo.toml +++ b/rust/examples/dwarf/shared/Cargo.toml @@ -7,3 +7,5 @@ edition = "2021" [dependencies] binaryninja = {path="../../../"} gimli = "0.31" +zstd = "0.13.2" +thiserror = "1.0" diff --git a/rust/examples/dwarf/shared/src/lib.rs b/rust/examples/dwarf/shared/src/lib.rs index 7a957c6b..23baa42c 100644 --- a/rust/examples/dwarf/shared/src/lib.rs +++ b/rust/examples/dwarf/shared/src/lib.rs @@ -12,22 +12,31 @@ // See the License for the specific language governing permissions and // limitations under the License. -use gimli::{EndianRcSlice, Endianity, Error, RunTimeEndian, SectionId}; - -use binaryninja::binaryninjacore_sys::*; +use gimli::{EndianRcSlice, Endianity, RunTimeEndian, SectionId}; use binaryninja::{ binaryview::{BinaryView, BinaryViewBase, BinaryViewExt}, - databuffer::DataBuffer, Endianness, settings::Settings, }; -use std::{ffi::CString, rc::Rc}; +use std::rc::Rc; ////////////////////// // Dwarf Validation +#[derive(thiserror::Error, Debug)] +pub enum Error { + #[error("unknown section compression method {0:#x}")] + UnknownCompressionMethod(u32), + + #[error("{0}")] + GimliError(#[from] gimli::Error), + + #[error("{0}")] + IoError(#[from] std::io::Error), +} + pub fn is_non_dwo_dwarf(view: &BinaryView) -> bool { view.section_by_name(".debug_info").is_ok() || view.section_by_name("__debug_info").is_ok() } @@ -134,32 +143,26 @@ pub fn create_section_reader<'a, Endian: 'a + Endianity>( let offset = section.start() + compressed_header_size as u64; let len = section.len() - compressed_header_size; - if let Ok(buffer) = view.read_buffer(offset, len) { - use std::ptr; - let transform_name = - CString::new("Zlib").unwrap().into_bytes_with_nul(); - let transform = - unsafe { BNGetTransformByName(transform_name.as_ptr() as *mut _) }; - - // Omega broke - let raw_buf: *mut BNDataBuffer = - unsafe { BNCreateDataBuffer(ptr::null_mut(), 0) }; - if unsafe { - BNDecode( - transform, - std::mem::transmute(buffer), - raw_buf, - ptr::null_mut(), - 0, - ) - } { - let output_buffer: DataBuffer = - unsafe { std::mem::transmute(raw_buf) }; + let ch_type_vec = view.read_vec(section.start(), 4); + let ch_type = endian.read_u32(&ch_type_vec); - return Ok(EndianRcSlice::new( - output_buffer.get_data().into(), - endian, - )); + if let Ok(buffer) = view.read_buffer(offset, len) { + match ch_type { + 1 => { + return Ok(EndianRcSlice::new( + buffer.zlib_decompress().get_data().into(), + endian, + )); + }, + 2 => { + return Ok(EndianRcSlice::new( + zstd::decode_all(buffer.get_data())?.as_slice().into(), + endian + )); + }, + x => { + return Err(Error::UnknownCompressionMethod(x)); + } } } } |
