diff --git a/src/pe/debug.rs b/src/pe/debug.rs index fa9c5c31..a2b55e92 100644 --- a/src/pe/debug.rs +++ b/src/pe/debug.rs @@ -2,9 +2,9 @@ use crate::error; use scroll::{Pread, Pwrite, SizeWith}; use crate::pe::data_directories; +use crate::pe::options; use crate::pe::section_table; use crate::pe::utils; -use crate::pe::options; #[derive(Debug, PartialEq, Copy, Clone, Default)] pub struct DebugData<'a> { @@ -19,7 +19,13 @@ impl<'a> DebugData<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result { - Self::parse_with_opts(bytes, dd, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts( + bytes, + dd, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts( @@ -77,7 +83,13 @@ impl ImageDebugDirectory { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result { - Self::parse_with_opts(bytes, dd, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts( + bytes, + dd, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } fn parse_with_opts( @@ -85,7 +97,7 @@ impl ImageDebugDirectory { dd: data_directories::DataDirectory, sections: &[section_table::SectionTable], file_alignment: u32, - opts: &options::ParseOptions + opts: &options::ParseOptions, ) -> error::Result { let rva = dd.virtual_address as usize; let offset = utils::find_offset(rva, sections, file_alignment, opts).ok_or_else(|| { @@ -119,7 +131,11 @@ impl<'a> CodeviewPDB70DebugInfo<'a> { Self::parse_with_opts(bytes, idd, &options::ParseOptions::default()) } - pub fn parse_with_opts(bytes: &'a [u8], idd: &ImageDebugDirectory, opts: &options::ParseOptions) -> error::Result> { + pub fn parse_with_opts( + bytes: &'a [u8], + idd: &ImageDebugDirectory, + opts: &options::ParseOptions, + ) -> error::Result> { if idd.data_type != IMAGE_DEBUG_TYPE_CODEVIEW { // not a codeview debug directory // that's not an error, but it's not a CodeviewPDB70DebugInfo either diff --git a/src/pe/exception.rs b/src/pe/exception.rs index ce0b69e3..d26854d3 100644 --- a/src/pe/exception.rs +++ b/src/pe/exception.rs @@ -49,8 +49,8 @@ use scroll::{self, Pread, Pwrite}; use crate::error; use crate::pe::data_directories; -use crate::pe::section_table; use crate::pe::options; +use crate::pe::section_table; use crate::pe::utils; /// The function has an exception handler that should be called when looking for functions that need @@ -666,9 +666,15 @@ impl<'a> ExceptionData<'a> { bytes: &'a [u8], directory: data_directories::DataDirectory, sections: &[section_table::SectionTable], - file_alignment: u32 + file_alignment: u32, ) -> error::Result { - Self::parse_with_opts(bytes, directory, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts( + bytes, + directory, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } /// Parses exception data from the image at the given offset. @@ -677,7 +683,7 @@ impl<'a> ExceptionData<'a> { directory: data_directories::DataDirectory, sections: &[section_table::SectionTable], file_alignment: u32, - opts: &options::ParseOptions + opts: &options::ParseOptions, ) -> error::Result { let size = directory.size as usize; @@ -775,7 +781,7 @@ impl<'a> ExceptionData<'a> { pub fn get_unwind_info( &self, function: RuntimeFunction, - sections: &[section_table::SectionTable] + sections: &[section_table::SectionTable], ) -> error::Result> { self.get_unwind_info_with_opts(function, sections, &options::ParseOptions::default()) } @@ -785,7 +791,7 @@ impl<'a> ExceptionData<'a> { &self, mut function: RuntimeFunction, sections: &[section_table::SectionTable], - opts: &options::ParseOptions + opts: &options::ParseOptions, ) -> error::Result> { while function.unwind_info_address % 2 != 0 { let rva = (function.unwind_info_address & !1) as usize; @@ -793,9 +799,10 @@ impl<'a> ExceptionData<'a> { } let rva = function.unwind_info_address as usize; - let offset = utils::find_offset(rva, sections, self.file_alignment, opts).ok_or_else(|| { - error::Error::Malformed(format!("cannot map unwind rva ({:#x}) into offset", rva)) - })?; + let offset = + utils::find_offset(rva, sections, self.file_alignment, opts).ok_or_else(|| { + error::Error::Malformed(format!("cannot map unwind rva ({:#x}) into offset", rva)) + })?; UnwindInfo::parse(self.bytes, offset) } @@ -804,7 +811,7 @@ impl<'a> ExceptionData<'a> { fn get_function_by_rva( &self, rva: usize, - sections: &[section_table::SectionTable] + sections: &[section_table::SectionTable], ) -> error::Result { self.get_function_by_rva_with_opts(rva, sections, &options::ParseOptions::default()) } @@ -813,11 +820,15 @@ impl<'a> ExceptionData<'a> { &self, rva: usize, sections: &[section_table::SectionTable], - opts: &options::ParseOptions + opts: &options::ParseOptions, ) -> error::Result { - let offset = utils::find_offset(rva, sections, self.file_alignment, opts).ok_or_else(|| { - error::Error::Malformed(format!("cannot map exception rva ({:#x}) into offset", rva)) - })?; + let offset = + utils::find_offset(rva, sections, self.file_alignment, opts).ok_or_else(|| { + error::Error::Malformed(format!( + "cannot map exception rva ({:#x}) into offset", + rva + )) + })?; self.get_function_by_offset(offset) } diff --git a/src/pe/export.rs b/src/pe/export.rs index 9f360951..b4705617 100644 --- a/src/pe/export.rs +++ b/src/pe/export.rs @@ -5,8 +5,8 @@ use log::debug; use crate::error; -use crate::pe::options; use crate::pe::data_directories; +use crate::pe::options; use crate::pe::section_table; use crate::pe::utils; @@ -72,7 +72,13 @@ impl<'a> ExportData<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result> { - Self::parse_with_opts(bytes, dd, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts( + bytes, + dd, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts( @@ -364,7 +370,13 @@ impl<'a> Export<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result>> { - Self::parse_with_opts(bytes, export_data, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts( + bytes, + export_data, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts( diff --git a/src/pe/import.rs b/src/pe/import.rs index b16da9e7..614e0f81 100644 --- a/src/pe/import.rs +++ b/src/pe/import.rs @@ -7,8 +7,8 @@ use scroll::ctx::TryFromCtx; use scroll::{Pread, Pwrite, SizeWith}; use crate::pe::data_directories; -use crate::pe::section_table; use crate::pe::options; +use crate::pe::section_table; use crate::pe::utils; use log::{debug, warn}; @@ -99,7 +99,13 @@ impl<'a> SyntheticImportLookupTableEntry<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result> { - Self::parse_with_opts::(bytes, offset, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts::( + bytes, + offset, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts>( @@ -192,7 +198,13 @@ impl<'a> SyntheticImportDirectoryEntry<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result> { - Self::parse_with_opts::(bytes, import_directory_entry, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts::( + bytes, + import_directory_entry, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts>( @@ -208,9 +220,12 @@ impl<'a> SyntheticImportDirectoryEntry<'a> { let import_lookup_table = { let import_lookup_table_rva = import_directory_entry.import_lookup_table_rva; let import_address_table_rva = import_directory_entry.import_address_table_rva; - if let Some(import_lookup_table_offset) = - utils::find_offset(import_lookup_table_rva as usize, sections, file_alignment, opts) - { + if let Some(import_lookup_table_offset) = utils::find_offset( + import_lookup_table_rva as usize, + sections, + file_alignment, + opts, + ) { debug!("Synthesizing lookup table imports for {} lib, with import lookup table rva: {:#x}", name, import_lookup_table_rva); let import_lookup_table = SyntheticImportLookupTableEntry::parse::( bytes, @@ -223,9 +238,12 @@ impl<'a> SyntheticImportDirectoryEntry<'a> { import_lookup_table ); Some(import_lookup_table) - } else if let Some(import_address_table_offset) = - utils::find_offset(import_address_table_rva as usize, sections, file_alignment, opts) - { + } else if let Some(import_address_table_offset) = utils::find_offset( + import_address_table_rva as usize, + sections, + file_alignment, + opts, + ) { debug!("Synthesizing lookup table imports for {} lib, with import address table rva: {:#x}", name, import_lookup_table_rva); let import_address_table = SyntheticImportLookupTableEntry::parse::( bytes, @@ -288,7 +306,13 @@ impl<'a> ImportData<'a> { sections: &[section_table::SectionTable], file_alignment: u32, ) -> error::Result> { - Self::parse_with_opts::(bytes, dd, sections, file_alignment, &options::ParseOptions::default()) + Self::parse_with_opts::( + bytes, + dd, + sections, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn parse_with_opts>( @@ -303,7 +327,18 @@ impl<'a> ImportData<'a> { "import_directory_table_rva {:#x}", import_directory_table_rva ); - let offset = &mut utils::find_offset(import_directory_table_rva, sections, file_alignment, opts).ok_or_else(|| error::Error::Malformed(format!("Cannot create ImportData; cannot map import_directory_table_rva {:#x} into offset", import_directory_table_rva)))?; + let offset = &mut utils::find_offset( + import_directory_table_rva, + sections, + file_alignment, + opts, + ) + .ok_or_else(|| { + error::Error::Malformed(format!( + "Cannot create ImportData; cannot map import_directory_table_rva {:#x} into offset", + import_directory_table_rva + )) + })?; debug!("import data offset {:#x}", offset); let mut import_data = Vec::new(); loop { diff --git a/src/pe/mod.rs b/src/pe/mod.rs index 243e8f5f..53af6278 100644 --- a/src/pe/mod.rs +++ b/src/pe/mod.rs @@ -5,7 +5,6 @@ use alloc::vec::Vec; -pub mod options; pub mod characteristic; pub mod data_directories; pub mod debug; @@ -14,6 +13,7 @@ pub mod export; pub mod header; pub mod import; pub mod optional_header; +pub mod options; pub mod relocation; pub mod section_table; pub mod symbol; @@ -97,11 +97,21 @@ impl<'a> PE<'a> { ); let file_alignment = optional_header.windows_fields.file_alignment; if let Some(export_table) = *optional_header.data_directories.get_export_table() { - if let Ok(ed) = - export::ExportData::parse_with_opts(bytes, export_table, §ions, file_alignment, opts) - { + if let Ok(ed) = export::ExportData::parse_with_opts( + bytes, + export_table, + §ions, + file_alignment, + opts, + ) { debug!("export data {:#?}", ed); - exports = export::Export::parse_with_opts(bytes, &ed, §ions, file_alignment, opts)?; + exports = export::Export::parse_with_opts( + bytes, + &ed, + §ions, + file_alignment, + opts, + )?; name = ed.name; debug!("name: {:#?}", name); export_data = Some(ed); @@ -148,7 +158,7 @@ impl<'a> PE<'a> { debug_table, §ions, file_alignment, - opts + opts, )?); } diff --git a/src/pe/options.rs b/src/pe/options.rs index 064e068e..5fea632f 100644 --- a/src/pe/options.rs +++ b/src/pe/options.rs @@ -8,8 +8,6 @@ pub struct ParseOptions { impl ParseOptions { /// Returns a parse options structure with default values pub fn default() -> Self { - ParseOptions { - resolve_rva: true, - } + ParseOptions { resolve_rva: true } } -} \ No newline at end of file +} diff --git a/src/pe/utils.rs b/src/pe/utils.rs index 3a614f58..b9cdec12 100644 --- a/src/pe/utils.rs +++ b/src/pe/utils.rs @@ -2,8 +2,8 @@ use crate::error; use alloc::string::ToString; use scroll::Pread; -use super::section_table; use super::options; +use super::section_table; use crate::pe::data_directories::DataDirectory; use core::cmp; @@ -127,7 +127,13 @@ pub fn get_data<'a, T>( where T: scroll::ctx::TryFromCtx<'a, scroll::Endian, Error = scroll::Error>, { - get_data_with_opts(bytes, sections, directory, file_alignment, &options::ParseOptions::default()) + get_data_with_opts( + bytes, + sections, + directory, + file_alignment, + &options::ParseOptions::default(), + ) } pub fn get_data_with_opts<'a, T>(