summaryrefslogtreecommitdiff
path: root/rust/examples
diff options
context:
space:
mode:
authorKyleMiles <krm504@nyu.edu>2023-08-04 18:14:00 -0400
committerKyleMiles <krm504@nyu.edu>2023-08-22 10:00:01 -0400
commit02ea8d7309a0c0777ac8a07bfc1e0fd497e9f5f5 (patch)
treea193d8d33e8f7a841ac5fd7bd874beb585c4bd36 /rust/examples
parentb7a03b4d5e24485691ece768c1ea219312e9b9f8 (diff)
DWARF : Update gimli dependency
Diffstat (limited to 'rust/examples')
-rw-r--r--rust/examples/dwarf/dwarf_import/Cargo.toml2
-rw-r--r--rust/examples/dwarf/dwarf_import/src/lib.rs5
-rw-r--r--rust/examples/dwarf/dwarfdump/Cargo.toml2
-rw-r--r--rust/examples/dwarf/dwarfdump/src/lib.rs5
-rw-r--r--rust/examples/dwarf/shared/Cargo.toml2
-rw-r--r--rust/examples/dwarf/shared/src/lib.rs144
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(&section_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(&section_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(&section_header[24..32]) == section.start()
- })
- {
- if (endian.read_u64(&current_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(&section_header[24..32]) == section.start()
+ })
+ {
+ if (endian.read_u64(&current_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() + &section_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() + &section_name[1..]) {
+ Ok(DWARFReader::new(
+ view.read_vec(section.start(), section.len()),
+ endian,
+ ))
+ } else {
+ Ok(DWARFReader::new(vec![], endian))
+ }
}