pubfn parse_with_opts<T: Bitfield<'a>>(
bytes: &'a [u8],
import_directory_entry: ImportDirectoryEntry,
sections: &[section_table::SectionTable],
file_alignment: u32,
opts: &options::ParseOptions,
) -> error::Result<SyntheticImportDirectoryEntry<'a>> { const LE: scroll::Endian = scroll::LE; let name_rva = import_directory_entry.name_rva; let name = utils::try_name(bytes, name_rva as usize, sections, file_alignment, opts)?; 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; iflet 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_with_opts::<T>(
bytes,
import_lookup_table_offset,
sections,
file_alignment,
opts,
)?;
debug!( "Successfully synthesized import lookup table entry from lookup table: {:#?}",
import_lookup_table
);
Some(import_lookup_table)
} elseiflet 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_with_opts::<T>(
bytes,
import_address_table_offset,
sections,
file_alignment,
opts,
)?;
debug!( "Successfully synthesized import lookup table entry from IAT: {:#?}",
import_address_table
);
Some(import_address_table)
} else {
None
}
};
let import_address_table_offset = &mut utils::find_offset(
import_directory_entry.import_address_table_rva as usize,
sections,
file_alignment,
opts,
)
.ok_or_else(|| {
error::Error::Malformed(format!( "Cannot map import_address_table_rva {:#x} into offset for {}",
import_directory_entry.import_address_table_rva, name
))
})?; letmut import_address_table = Vec::new(); loop { let import_address = bytes
.gread_with::<T>(import_address_table_offset, LE)?
.into(); if import_address == 0 { break;
} else {
import_address_table.push(import_address);
}
}
Ok(SyntheticImportDirectoryEntry {
import_directory_entry,
name,
import_lookup_table,
import_address_table,
})
}
}
#[derive(Debug)] /// Contains a list of synthesized import data for this binary, e.g., which symbols from which libraries it is importing from pubstruct ImportData<'a> { pub import_data: Vec<SyntheticImportDirectoryEntry<'a>>,
}
#[derive(Debug)] /// A synthesized symbol import, the name is pre-indexed, and the binary offset is computed, as well as which dll it belongs to pubstruct Import<'a> { pub name: Cow<'a, str>, pub dll: &'a str, pub ordinal: u16, pub offset: usize, pub rva: usize, pub size: usize,
}
impl<'a> Import<'a> { pubfn parse<T: Bitfield<'a>>(
_bytes: &'a [u8],
import_data: &ImportData<'a>,
_sections: &[section_table::SectionTable],
) -> error::Result<Vec<Import<'a>>> { letmut imports = Vec::new(); for data in &import_data.import_data { iflet Some(ref import_lookup_table) = data.import_lookup_table { let dll = data.name; let import_base = data.import_directory_entry.import_address_table_rva as usize;
debug!("Getting imports from {}", &dll); for (i, entry) in import_lookup_table.iter().enumerate() { let offset = import_base + (i * T::size_of()); useself::SyntheticImportLookupTableEntry::*; let (rva, name, ordinal) = match *entry {
HintNameTableRVA((rva, ref hint_entry)) => { // if hint_entry.name = "" && hint_entry.hint = 0 { // println!("<PE.Import> warning hint/name table rva from {} without hint {:#x}", dll, rva); // }
(rva, Cow::Borrowed(hint_entry.name), hint_entry.hint)
}
OrdinalNumber(ordinal) => { let name = format!("ORDINAL {}", ordinal);
(0x0, Cow::Owned(name), ordinal)
}
}; let import = Import {
name,
ordinal,
dll,
size: T::size_of(),
offset,
rva: rva as usize,
};
imports.push(import);
}
}
}
Ok(imports)
}
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-19)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.