diff --git a/src/pe/import.rs b/src/pe/import.rs index 31343234..fdbf9022 100644 --- a/src/pe/import.rs +++ b/src/pe/import.rs @@ -11,6 +11,7 @@ use crate::pe::options; use crate::pe::section_table; use crate::pe::utils; +use crate::pe::options::ParseMode; use log::{debug, warn}; pub const IMPORT_BY_ORDINAL_32: u32 = 0x8000_0000; @@ -361,15 +362,26 @@ impl<'a> ImportData<'a> { if import_directory_entry.is_null() || !import_directory_entry.is_possibly_valid() { break; } else { - let entry = SyntheticImportDirectoryEntry::parse_with_opts::( + let entry_result = SyntheticImportDirectoryEntry::parse_with_opts::( bytes, import_directory_entry, sections, file_alignment, opts, - )?; - debug!("entry {:#?} at {:#x}", entry, offset); - import_data.push(entry); + ); + match entry_result { + Ok(entry) => { + debug!("entry {entry:#?}"); + import_data.push(entry); + } + Err(err) if matches!(opts.parse_mode, ParseMode::Permissive) => { + warn!("Failed to parse import data: {err:?}"); + continue; + } + Err(err) => { + return Err(err); + } + } } } debug!("finished ImportData"); diff --git a/src/pe/options.rs b/src/pe/options.rs index 2330ba00..4f02ee42 100644 --- a/src/pe/options.rs +++ b/src/pe/options.rs @@ -40,4 +40,9 @@ impl ParseOptions { parse_mode: ParseMode::Strict, } } + + pub fn with_parse_mode(mut self, parse_mode: ParseMode) -> Self { + self.parse_mode = parse_mode; + self + } }