diff options
| author | KyleMiles <krm504@nyu.edu> | 2023-08-04 18:14:00 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2023-08-22 10:00:01 -0400 |
| commit | 02ea8d7309a0c0777ac8a07bfc1e0fd497e9f5f5 (patch) | |
| tree | a193d8d33e8f7a841ac5fd7bd874beb585c4bd36 /rust/examples | |
| parent | b7a03b4d5e24485691ece768c1ea219312e9b9f8 (diff) | |
DWARF : Update gimli dependency
Diffstat (limited to 'rust/examples')
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/Cargo.toml | 2 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarf_import/src/lib.rs | 5 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarfdump/Cargo.toml | 2 | ||||
| -rw-r--r-- | rust/examples/dwarf/dwarfdump/src/lib.rs | 5 | ||||
| -rw-r--r-- | rust/examples/dwarf/shared/Cargo.toml | 2 | ||||
| -rw-r--r-- | rust/examples/dwarf/shared/src/lib.rs | 144 |
6 files changed, 81 insertions, 79 deletions
diff --git a/rust/examples/dwarf/dwarf_import/Cargo.toml b/rust/examples/dwarf/dwarf_import/Cargo.toml index 322a4dd6..07605991 100644 --- a/rust/examples/dwarf/dwarf_import/Cargo.toml +++ b/rust/examples/dwarf/dwarf_import/Cargo.toml @@ -10,5 +10,5 @@ crate-type = ["cdylib"] [dependencies] dwarfreader = { path = "../shared/" } binaryninja = { path = "../../../" } -gimli = "0.26.1" +gimli = "0.27" log = "0.4.17" diff --git a/rust/examples/dwarf/dwarf_import/src/lib.rs b/rust/examples/dwarf/dwarf_import/src/lib.rs index e4f8a994..69fe42aa 100644 --- a/rust/examples/dwarf/dwarf_import/src/lib.rs +++ b/rust/examples/dwarf/dwarf_import/src/lib.rs @@ -218,8 +218,9 @@ fn parse_dwarf( // gimli setup let endian = get_endian(view); - let section_reader = create_section_reader(view, endian, dwo_file); - let mut dwarf = Dwarf::load(§ion_reader).unwrap(); + 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(); if dwo_file { dwarf.file_type = DwarfFileType::Dwo; } diff --git a/rust/examples/dwarf/dwarfdump/Cargo.toml b/rust/examples/dwarf/dwarfdump/Cargo.toml index da25a756..1d3411a0 100644 --- a/rust/examples/dwarf/dwarfdump/Cargo.toml +++ b/rust/examples/dwarf/dwarfdump/Cargo.toml @@ -10,4 +10,4 @@ crate-type = ["cdylib"] [dependencies] dwarfreader = { path = "../shared/" } binaryninja = {path="../../../"} -gimli = "0.26" +gimli = "0.27" diff --git a/rust/examples/dwarf/dwarfdump/src/lib.rs b/rust/examples/dwarf/dwarfdump/src/lib.rs index 71af87c4..08a237f4 100644 --- a/rust/examples/dwarf/dwarfdump/src/lib.rs +++ b/rust/examples/dwarf/dwarfdump/src/lib.rs @@ -29,6 +29,7 @@ use gimli::{ EntriesTreeNode, Reader, ReaderOffset, + SectionId, Unit, UnitSectionOffset, }; @@ -259,7 +260,9 @@ fn dump_dwarf(bv: &BinaryView) { graph.append(&graph_root); let endian = dwarfreader::get_endian(bv); - let section_reader = dwarfreader::create_section_reader(bv, endian, false); + let section_reader = |section_id: SectionId| -> _ { + dwarfreader::create_section_reader(section_id, bv, endian, false) + }; let dwarf = Dwarf::load(§ion_reader).unwrap(); let mut iter = dwarf.units(); diff --git a/rust/examples/dwarf/shared/Cargo.toml b/rust/examples/dwarf/shared/Cargo.toml index 121e9a91..9cbd5a22 100644 --- a/rust/examples/dwarf/shared/Cargo.toml +++ b/rust/examples/dwarf/shared/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] binaryninja = {path="../../../"} -gimli = "0.26" +gimli = "0.27" diff --git a/rust/examples/dwarf/shared/src/lib.rs b/rust/examples/dwarf/shared/src/lib.rs index 6e667dfc..fd141f1f 100644 --- a/rust/examples/dwarf/shared/src/lib.rs +++ b/rust/examples/dwarf/shared/src/lib.rs @@ -213,94 +213,92 @@ impl<Endian: Endianity> Reader for DWARFReader<Endian> { } pub fn create_section_reader<'a, Endian: 'a + Endianity>( + section_id: SectionId, view: &'a BinaryView, endian: Endian, dwo_file: bool, -) -> Box<dyn Fn(SectionId) -> Result<DWARFReader<Endian>, Error> + 'a> { - Box::new(move |section_id: SectionId| { - let section_name = if dwo_file && section_id.dwo_name().is_some() { - section_id.dwo_name().unwrap() - } else { - section_id.name() - }; +) -> Result<DWARFReader<Endian>, Error> { + let section_name = if dwo_file && section_id.dwo_name().is_some() { + section_id.dwo_name().unwrap() + } else { + section_id.name() + }; - if let Ok(section) = view.section_by_name(section_name) { - // TODO : This is kinda broke....should add rust wrappers for some of this - if let Some(symbol) = view - .symbols() + if let Ok(section) = view.section_by_name(section_name) { + // TODO : This is kinda broke....should add rust wrappers for some of this + if let Some(symbol) = view + .symbols() + .iter() + .find(|symbol| symbol.full_name().as_str() == "__elf_section_headers") + { + if let Some(data_var) = view + .data_variables() .iter() - .find(|symbol| symbol.full_name().as_str() == "__elf_section_headers") + .find(|var| var.address == symbol.address()) { - if let Some(data_var) = view - .data_variables() - .iter() - .find(|var| var.address == symbol.address()) - { - // TODO : This should eventually be wrapped by some DataView sorta thingy thing, like how python does it - let data_type = data_var.type_with_confidence().contents; - let data = view.read_vec(data_var.address, data_type.width() as usize); - let element_type = data_type.element_type().unwrap().contents; + // TODO : This should eventually be wrapped by some DataView sorta thingy thing, like how python does it + let data_type = data_var.type_with_confidence().contents; + let data = view.read_vec(data_var.address, data_type.width() as usize); + let element_type = data_type.element_type().unwrap().contents; - // TODO : broke af? - if let Some(current_section_header) = data - .chunks(element_type.width() as usize) - .find(|section_header| { - endian.read_u64(§ion_header[24..32]) == section.start() - }) - { - if (endian.read_u64(¤t_section_header[8..16]) & 2048) != 0 { - // Get section, trim header, decompress, return - let offset = section.start() + 24; // TODO : Super broke AF - let len = section.len() - 24; + // TODO : broke af? + if let Some(current_section_header) = data + .chunks(element_type.width() as usize) + .find(|section_header| { + endian.read_u64(§ion_header[24..32]) == section.start() + }) + { + if (endian.read_u64(¤t_section_header[8..16]) & 2048) != 0 { + // Get section, trim header, decompress, return + let offset = section.start() + 24; // TODO : Super broke AF + let len = section.len() - 24; - if let Ok(buffer) = view.read_buffer(offset, len) { - // Incredibly broke as fuck - use std::ptr; - let transform_name = - CString::new("Zlib").unwrap().into_bytes_with_nul(); - let transform = unsafe { - BNGetTransformByName(transform_name.as_ptr() as *mut _) - }; + if let Ok(buffer) = view.read_buffer(offset, len) { + // Incredibly broke as fuck + 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) }; + // 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) }; - return Ok(DWARFReader::new( - output_buffer.get_data().into(), - endian, - )); - } + return Ok(DWARFReader::new( + output_buffer.get_data().into(), + endian, + )); } } } } } - let offset = section.start(); - let len = section.len(); - if len == 0 { - Ok(DWARFReader::new(vec![], endian)) - } else { - Ok(DWARFReader::new(view.read_vec(offset, len), endian)) - } - } else if let Ok(section) = view.section_by_name("__".to_string() + §ion_name[1..]) { - Ok(DWARFReader::new( - view.read_vec(section.start(), section.len()), - endian, - )) - } else { + } + let offset = section.start(); + let len = section.len(); + if len == 0 { Ok(DWARFReader::new(vec![], endian)) + } else { + Ok(DWARFReader::new(view.read_vec(offset, len), endian)) } - }) + } else if let Ok(section) = view.section_by_name("__".to_string() + §ion_name[1..]) { + Ok(DWARFReader::new( + view.read_vec(section.start(), section.len()), + endian, + )) + } else { + Ok(DWARFReader::new(vec![], endian)) + } } |
