pub trait PE: Buffer + Sized {
Show 78 methods
// Required methods
fn get_type(&self) -> PEType;
fn is_allocated(&self) -> bool;
// Provided methods
fn get_cstring_size(
&self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<usize, Error> { ... }
fn get_widestring_size(
&self,
offset: usize,
max_size: Option<usize>,
) -> Result<usize, Error> { ... }
fn get_cstring(
&self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<&[CChar], Error> { ... }
fn get_mut_cstring(
&mut self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<&mut [CChar], Error> { ... }
fn get_widestring(
&self,
offset: usize,
max_size: Option<usize>,
) -> Result<&[WChar], Error> { ... }
fn get_mut_widestring(
&mut self,
offset: usize,
max_size: Option<usize>,
) -> Result<&mut [WChar], Error> { ... }
fn translate(&self, addr: PETranslation) -> Result<usize, Error> { ... }
fn get_dos_header(&self) -> Result<ImageDOSHeader, Error> { ... }
fn get_mut_dos_header(&mut self) -> Result<ImageDOSHeader, Error> { ... }
fn get_valid_dos_header(&self) -> Result<ImageDOSHeader, Error> { ... }
fn get_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error> { ... }
fn get_mut_dos_header_ref(&mut self) -> Result<&mut ImageDOSHeader, Error> { ... }
fn get_valid_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error> { ... }
fn get_valid_mut_dos_header_ref(
&mut self,
) -> Result<&mut ImageDOSHeader, Error> { ... }
fn e_lfanew(&self) -> Result<Offset, Error> { ... }
fn get_dos_stub(&self) -> Result<&[u8], Error> { ... }
fn get_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error> { ... }
fn get_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error> { ... }
fn get_valid_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error> { ... }
fn get_valid_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error> { ... }
fn get_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error> { ... }
fn get_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error> { ... }
fn get_nt_headers_32_ref(&self) -> Result<&ImageNTHeaders32, Error> { ... }
fn get_mut_nt_headers_32_ref(
&mut self,
) -> Result<&mut ImageNTHeaders32, Error> { ... }
fn get_nt_headers_64_ref(&self) -> Result<&ImageNTHeaders64, Error> { ... }
fn get_mut_nt_headers_64_ref(
&mut self,
) -> Result<&mut ImageNTHeaders64, Error> { ... }
fn get_valid_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error> { ... }
fn get_valid_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error> { ... }
fn get_nt_magic(&self) -> Result<u16, Error> { ... }
fn get_arch(&self) -> Result<Arch, Error> { ... }
fn get_valid_nt_headers(&self) -> Result<NTHeaders, Error> { ... }
fn get_valid_mut_nt_headers(&mut self) -> Result<NTHeadersMut, Error> { ... }
fn validate_checksum(&self) -> Result<bool, Error> { ... }
fn calculate_checksum(&self) -> Result<u32, Error> { ... }
fn get_entrypoint(&self) -> Result<RVA, Error> { ... }
fn get_image_base(&self) -> Result<u64, Error> { ... }
fn get_data_directory_offset(&self) -> Result<Offset, Error> { ... }
fn get_data_directory_size(&self) -> Result<usize, Error> { ... }
fn get_data_directory_table(&self) -> Result<&[ImageDataDirectory], Error> { ... }
fn get_mut_data_directory_table(
&mut self,
) -> Result<&mut [ImageDataDirectory], Error> { ... }
fn get_data_directory(
&self,
dir: ImageDirectoryEntry,
) -> Result<ImageDataDirectory, Error> { ... }
fn get_mut_data_directory(
&mut self,
dir: ImageDirectoryEntry,
) -> Result<ImageDataDirectory, Error> { ... }
fn has_data_directory(&self, dir: ImageDirectoryEntry) -> bool { ... }
fn cast_directory<T: Copy>(
&self,
dir: ImageDirectoryEntry,
) -> Result<T, Error> { ... }
fn cast_directory_mut<T: Copy>(
&mut self,
dir: ImageDirectoryEntry,
) -> Result<T, Error> { ... }
fn get_section_table_offset(&self) -> Result<Offset, Error> { ... }
fn get_section_table(&self) -> Result<&[ImageSectionHeader], Error> { ... }
fn get_mut_section_table(
&mut self,
) -> Result<&mut [ImageSectionHeader], Error> { ... }
fn get_section_by_offset(
&self,
offset: Offset,
) -> Result<ImageSectionHeader, Error> { ... }
fn get_mut_section_by_offset(
&mut self,
offset: Offset,
) -> Result<ImageSectionHeader, Error> { ... }
fn get_section_by_rva(&self, rva: RVA) -> Result<ImageSectionHeader, Error> { ... }
fn get_mut_section_by_rva(
&mut self,
rva: RVA,
) -> Result<ImageSectionHeader, Error> { ... }
fn get_section_by_name<S: AsRef<str>>(
&self,
name: S,
) -> Result<ImageSectionHeader, Error> { ... }
fn get_mut_section_by_name(
&mut self,
name: String,
) -> Result<ImageSectionHeader, Error> { ... }
fn add_section(
&mut self,
section: &ImageSectionHeader,
) -> Result<ImageSectionHeader, Error> { ... }
fn append_section(
&mut self,
section: &ImageSectionHeader,
) -> Result<ImageSectionHeader, Error> { ... }
fn validate_offset(&self, offset: Offset) -> bool { ... }
fn validate_rva(&self, rva: RVA) -> bool { ... }
fn validate_va(&self, va: VA) -> bool { ... }
fn is_aligned_to_file(&self, offset: Offset) -> bool { ... }
fn is_aligned_to_section(&self, rva: RVA) -> bool { ... }
fn align_to_file(&self, offset: Offset) -> Result<Offset, Error> { ... }
fn align_to_section(&self, rva: RVA) -> Result<RVA, Error> { ... }
fn offset_to_rva(&self, offset: Offset) -> Result<RVA, Error> { ... }
fn offset_to_va(&self, offset: Offset) -> Result<VA, Error> { ... }
fn rva_to_offset(&self, rva: RVA) -> Result<Offset, Error> { ... }
fn rva_to_va(&self, rva: RVA) -> Result<VA, Error> { ... }
fn va_to_rva(&self, va: VA) -> Result<RVA, Error> { ... }
fn va_to_offset(&self, va: VA) -> Result<Offset, Error> { ... }
fn get_resource_address(&self, offset: ResourceOffset) -> Result<RVA, Error> { ... }
fn calculate_header_size(&self) -> Result<usize, Error> { ... }
fn calculate_disk_size(&self) -> Result<usize, Error> { ... }
fn calculate_memory_size(&self) -> Result<usize, Error> { ... }
fn calculate_imphash(&self) -> Result<Vec<u8>, Error> { ... }
fn recreate_image(&self, pe_type: PEType) -> Result<Vec<u8>, Error> { ... }
fn fix_image_size(&mut self) -> Result<(), Error> { ... }
}Expand description
Represents a type which handles PE data.
Required Methods§
Sourcefn is_allocated(&self) -> bool
fn is_allocated(&self) -> bool
Only for Windows. Return if the PE has been allocated by VirtualAlloc.
Provided Methods§
Sourcefn get_cstring_size(
&self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<usize, Error>
fn get_cstring_size( &self, offset: usize, thunk: bool, max_size: Option<usize>, ) -> Result<usize, Error>
Get the size of a zero-terminated C-string in the data.
Sourcefn get_widestring_size(
&self,
offset: usize,
max_size: Option<usize>,
) -> Result<usize, Error>
fn get_widestring_size( &self, offset: usize, max_size: Option<usize>, ) -> Result<usize, Error>
Gets the size of a zero-terminated UTF16 string in the data.
Sourcefn get_cstring(
&self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<&[CChar], Error>
fn get_cstring( &self, offset: usize, thunk: bool, max_size: Option<usize>, ) -> Result<&[CChar], Error>
Get a zero-terminated C-string from the data. The thunk option is there to handle imports by name, whose null terminated value size is dependent on how long the string is (i.e., if it’s an odd length, an extra zero is appended).
§Example
use exe::{PE, VecPE};
use exe::types::{Offset, CCharString};
let pefile = VecPE::from_disk_file("test/dll.dll").unwrap();
let dll_name = pefile.get_cstring(Offset(0x328).into(), false, None).unwrap();
assert_eq!(dll_name.as_str().unwrap(), "dll.dll");Sourcefn get_mut_cstring(
&mut self,
offset: usize,
thunk: bool,
max_size: Option<usize>,
) -> Result<&mut [CChar], Error>
fn get_mut_cstring( &mut self, offset: usize, thunk: bool, max_size: Option<usize>, ) -> Result<&mut [CChar], Error>
Get a mutable zero-terminated C-string from the data.
Sourcefn get_widestring(
&self,
offset: usize,
max_size: Option<usize>,
) -> Result<&[WChar], Error>
fn get_widestring( &self, offset: usize, max_size: Option<usize>, ) -> Result<&[WChar], Error>
Get a zero-terminated UTF16 string from the data.
Sourcefn get_mut_widestring(
&mut self,
offset: usize,
max_size: Option<usize>,
) -> Result<&mut [WChar], Error>
fn get_mut_widestring( &mut self, offset: usize, max_size: Option<usize>, ) -> Result<&mut [WChar], Error>
Get a mutable zero-terminated UTF16 string from the data.
Sourcefn translate(&self, addr: PETranslation) -> Result<usize, Error>
fn translate(&self, addr: PETranslation) -> Result<usize, Error>
Translate an address into an offset usable by the Buffer trait based on the PE object’s
type (i.e., the result of PE::get_type).
This differs from rva_to_offset because it does not directly rely on the section table.
Rather, if the image is a memory image, it treats RVAs as buffer offsets, because that’s what they
are in memory. Otherwise, it converts the RVA into an offset via the section table. The reverse goes
for if the PE image is a disk image and an Offset is provided.
Typically, if you’re going to directly access data with the Buffer, you’ll
want to call this function instead of calling rva_to_offset and similar functions
because this function should guarantee the buffer offset is correct.
§Example
use exe::{PE, VecPE};
use exe::types::Offset;
let pefile = VecPE::from_memory_file("test/compiled_dumped.bin").unwrap();
let offset = Offset(0x400);
assert_eq!(pefile.translate(offset.into()).unwrap(), 0x1000);Sourcefn get_dos_header(&self) -> Result<ImageDOSHeader, Error>
fn get_dos_header(&self) -> Result<ImageDOSHeader, Error>
Get the DOS header without verifying its contents.
Sourcefn get_mut_dos_header(&mut self) -> Result<ImageDOSHeader, Error>
fn get_mut_dos_header(&mut self) -> Result<ImageDOSHeader, Error>
Get a mutable DOS header without verifying its contents.
Sourcefn get_valid_dos_header(&self) -> Result<ImageDOSHeader, Error>
fn get_valid_dos_header(&self) -> Result<ImageDOSHeader, Error>
Get the DOS header and verify it’s a valid DOS header.
Sourcefn get_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error>
fn get_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error>
Get a reference to the DOS header without verifying its contents.
Sourcefn get_mut_dos_header_ref(&mut self) -> Result<&mut ImageDOSHeader, Error>
fn get_mut_dos_header_ref(&mut self) -> Result<&mut ImageDOSHeader, Error>
Get a mutable reference to the DOS header without verifying its contents.
Sourcefn get_valid_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error>
fn get_valid_dos_header_ref(&self) -> Result<&ImageDOSHeader, Error>
Get a valid reference to the DOS header.
Sourcefn get_valid_mut_dos_header_ref(&mut self) -> Result<&mut ImageDOSHeader, Error>
fn get_valid_mut_dos_header_ref(&mut self) -> Result<&mut ImageDOSHeader, Error>
Get a mutable reference to the DOS header without verifying its contents.
Sourcefn get_dos_stub(&self) -> Result<&[u8], Error>
fn get_dos_stub(&self) -> Result<&[u8], Error>
Sourcefn get_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error>
fn get_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error>
Get 32-bit NT headers without verifying its contents.
Sourcefn get_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error>
fn get_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error>
Get mutable 32-bit NT headers without verifying its contents.
Sourcefn get_valid_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error>
fn get_valid_nt_headers_32(&self) -> Result<ImageNTHeaders32, Error>
Get 32-bit NT headers and verify that they’re 32-bit NT headers.
Sourcefn get_valid_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error>
fn get_valid_mut_nt_headers_32(&mut self) -> Result<ImageNTHeaders32, Error>
Get mutable 32-bit NT headers and verify that they’re 32-bit NT headers.
Sourcefn get_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error>
fn get_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error>
Get 64-bit NT headers without verifying its contents.
Sourcefn get_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error>
fn get_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error>
Get mutable 64-bit NT headers without verifying its contents.
Sourcefn get_nt_headers_32_ref(&self) -> Result<&ImageNTHeaders32, Error>
fn get_nt_headers_32_ref(&self) -> Result<&ImageNTHeaders32, Error>
Get a reference to 32-bit NT headers without verifying its contents.
Sourcefn get_mut_nt_headers_32_ref(&mut self) -> Result<&mut ImageNTHeaders32, Error>
fn get_mut_nt_headers_32_ref(&mut self) -> Result<&mut ImageNTHeaders32, Error>
Get a mutable reference to 32-bit NT headers without verifying its contents.
Sourcefn get_nt_headers_64_ref(&self) -> Result<&ImageNTHeaders64, Error>
fn get_nt_headers_64_ref(&self) -> Result<&ImageNTHeaders64, Error>
Get a reference to 64-bit NT headers without verifying its contents.
Sourcefn get_mut_nt_headers_64_ref(&mut self) -> Result<&mut ImageNTHeaders64, Error>
fn get_mut_nt_headers_64_ref(&mut self) -> Result<&mut ImageNTHeaders64, Error>
Get a mutable reference to 64-bit NT headers without verifying its contents.
Sourcefn get_valid_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error>
fn get_valid_nt_headers_64(&self) -> Result<ImageNTHeaders64, Error>
Get 64-bit NT headers and verify that they’re 64-bit NT headers.
Sourcefn get_valid_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error>
fn get_valid_mut_nt_headers_64(&mut self) -> Result<ImageNTHeaders64, Error>
Get mutable 64-bit NT headers and verify that they’re 64-bit NT headers.
Sourcefn get_nt_magic(&self) -> Result<u16, Error>
fn get_nt_magic(&self) -> Result<u16, Error>
Get the NT signature from the optional header of the NT headers.
Sourcefn get_valid_nt_headers(&self) -> Result<NTHeaders, Error>
fn get_valid_nt_headers(&self) -> Result<NTHeaders, Error>
Get the NT headers of this PE file, inferring from the content of the file which architecture it is and validating the headers.
§Example
use exe::{PE, VecPE};
use exe::headers::HDR64_MAGIC;
use exe::types::NTHeaders;
let image = VecPE::from_disk_file("test/normal64.exe").unwrap();
let headers = image.get_valid_nt_headers().unwrap();
let magic = match headers {
NTHeaders::NTHeaders32(hdr32) => hdr32.optional_header.magic,
NTHeaders::NTHeaders64(hdr64) => hdr64.optional_header.magic,
};
assert_eq!(magic, HDR64_MAGIC);Sourcefn get_valid_mut_nt_headers(&mut self) -> Result<NTHeadersMut, Error>
fn get_valid_mut_nt_headers(&mut self) -> Result<NTHeadersMut, Error>
Get mutable NT headers of this PE file, inferring from the content of the file which architecture it is and validating the headers.
Sourcefn validate_checksum(&self) -> Result<bool, Error>
fn validate_checksum(&self) -> Result<bool, Error>
Validate the checksum in the image with the calculated checksum.
Sourcefn calculate_checksum(&self) -> Result<u32, Error>
fn calculate_checksum(&self) -> Result<u32, Error>
Calculate the checksum of the PE image.
Sourcefn get_entrypoint(&self) -> Result<RVA, Error>
fn get_entrypoint(&self) -> Result<RVA, Error>
Get the entrypoint of this PE file.
Sourcefn get_image_base(&self) -> Result<u64, Error>
fn get_image_base(&self) -> Result<u64, Error>
Get the image base of this PE file.
On Windows, if the buffer has been allocated with VirtualAlloc (like a VallocBuffer), return that base address instead.
Otherwise, return ImageBase from the NT headers.
Sourcefn get_data_directory_offset(&self) -> Result<Offset, Error>
fn get_data_directory_offset(&self) -> Result<Offset, Error>
Get the offset to the data directory within the PE file.
Sourcefn get_data_directory_size(&self) -> Result<usize, Error>
fn get_data_directory_size(&self) -> Result<usize, Error>
Get the size of the data directory. Rounds down number_of_rva_and_sizes to 16, which is what
the Windows loader does.
Sourcefn get_data_directory_table(&self) -> Result<&[ImageDataDirectory], Error>
fn get_data_directory_table(&self) -> Result<&[ImageDataDirectory], Error>
Get the data directory table.
Normally one would expect this to be a part of ImageOptionalHeader, but
ImageOptionalHeader::number_of_rva_and_sizes controls
the size of the array. Therefore, we can’t stick it in the optional header, because that would
produce a variable-sized structure, which Rust doesn’t support.
Sourcefn get_mut_data_directory_table(
&mut self,
) -> Result<&mut [ImageDataDirectory], Error>
fn get_mut_data_directory_table( &mut self, ) -> Result<&mut [ImageDataDirectory], Error>
Get a mutable data directory table.
Sourcefn get_data_directory(
&self,
dir: ImageDirectoryEntry,
) -> Result<ImageDataDirectory, Error>
fn get_data_directory( &self, dir: ImageDirectoryEntry, ) -> Result<ImageDataDirectory, Error>
Get the data directory reference represented by the ImageDirectoryEntry enum.
Returns Error::BadDirectory if the given directory is inaccessible due to the directory
size.
Sourcefn get_mut_data_directory(
&mut self,
dir: ImageDirectoryEntry,
) -> Result<ImageDataDirectory, Error>
fn get_mut_data_directory( &mut self, dir: ImageDirectoryEntry, ) -> Result<ImageDataDirectory, Error>
Get the mutable data directory reference represented by the ImageDirectoryEntry enum.
Sourcefn has_data_directory(&self, dir: ImageDirectoryEntry) -> bool
fn has_data_directory(&self, dir: ImageDirectoryEntry) -> bool
Check whether or not this PE file has a given data directory.
A PE file “has” a data directory if the following conditions are met:
- the directory is present in the data directory array
- the RVA is nonzero
- the RVA is valid
Sourcefn cast_directory<T: Copy>(&self, dir: ImageDirectoryEntry) -> Result<T, Error>
fn cast_directory<T: Copy>(&self, dir: ImageDirectoryEntry) -> Result<T, Error>
Parse an object at the given data directory identified by ImageDirectoryEntry.
Sourcefn cast_directory_mut<T: Copy>(
&mut self,
dir: ImageDirectoryEntry,
) -> Result<T, Error>
fn cast_directory_mut<T: Copy>( &mut self, dir: ImageDirectoryEntry, ) -> Result<T, Error>
Parse a mutable object at the given data directory identified by ImageDirectoryEntry.
Sourcefn get_section_table_offset(&self) -> Result<Offset, Error>
fn get_section_table_offset(&self) -> Result<Offset, Error>
Get the offset to the section table within the PE file.
Sourcefn get_section_table(&self) -> Result<&[ImageSectionHeader], Error>
fn get_section_table(&self) -> Result<&[ImageSectionHeader], Error>
Get the section table of the PE file.
Sourcefn get_mut_section_table(&mut self) -> Result<&mut [ImageSectionHeader], Error>
fn get_mut_section_table(&mut self) -> Result<&mut [ImageSectionHeader], Error>
Get a mutable section table from the PE file.
Sourcefn get_section_by_offset(
&self,
offset: Offset,
) -> Result<ImageSectionHeader, Error>
fn get_section_by_offset( &self, offset: Offset, ) -> Result<ImageSectionHeader, Error>
Get a reference to a section in the PE file by a given offset. Yields a
Error::SectionNotFound error if the offset wasn’t found to be in a section.
Sourcefn get_mut_section_by_offset(
&mut self,
offset: Offset,
) -> Result<ImageSectionHeader, Error>
fn get_mut_section_by_offset( &mut self, offset: Offset, ) -> Result<ImageSectionHeader, Error>
Get a mutable reference to a section in the PE file by a given offset. Yields a
Error::SectionNotFound error if the offset wasn’t found to be in a section.
Sourcefn get_section_by_rva(&self, rva: RVA) -> Result<ImageSectionHeader, Error>
fn get_section_by_rva(&self, rva: RVA) -> Result<ImageSectionHeader, Error>
Get a reference to a section in the PE file by a given RVA. Yields a
Error::SectionNotFound error if the RVA wasn’t found to be in a section.
Sourcefn get_mut_section_by_rva(
&mut self,
rva: RVA,
) -> Result<ImageSectionHeader, Error>
fn get_mut_section_by_rva( &mut self, rva: RVA, ) -> Result<ImageSectionHeader, Error>
Get a mutable reference to a section in the PE file by a given RVA. Yields a
Error::SectionNotFound error if the RVA wasn’t found to be in a section.
Sourcefn get_section_by_name<S: AsRef<str>>(
&self,
name: S,
) -> Result<ImageSectionHeader, Error>
fn get_section_by_name<S: AsRef<str>>( &self, name: S, ) -> Result<ImageSectionHeader, Error>
Get a reference to a section in the PE file by its name. Yields a
Error::SectionNotFound error if the name wasn’t found in the section table.
Sourcefn get_mut_section_by_name(
&mut self,
name: String,
) -> Result<ImageSectionHeader, Error>
fn get_mut_section_by_name( &mut self, name: String, ) -> Result<ImageSectionHeader, Error>
Get a mutable reference to a section in the PE file by its name. Yields a
Error::SectionNotFound error if the name wasn’t found in the section table.
Sourcefn add_section(
&mut self,
section: &ImageSectionHeader,
) -> Result<ImageSectionHeader, Error>
fn add_section( &mut self, section: &ImageSectionHeader, ) -> Result<ImageSectionHeader, Error>
Add a given section header to the section table. Returns a mutable reference to the section header as it exists in the section table.
Sourcefn append_section(
&mut self,
section: &ImageSectionHeader,
) -> Result<ImageSectionHeader, Error>
fn append_section( &mut self, section: &ImageSectionHeader, ) -> Result<ImageSectionHeader, Error>
Append a given section header to the end of the PE sections. This function differs from add_section by setting the
new section’s pointer_to_raw_data and virtual_address
to the end of the previous section’s boundaries.
Returns a mutable reference to the new section as it exists in the section table.
Sourcefn validate_offset(&self, offset: Offset) -> bool
fn validate_offset(&self, offset: Offset) -> bool
Verify that the given offset is a valid offset.
An offset is validated if it is less than the length of the buffer.
Sourcefn validate_rva(&self, rva: RVA) -> bool
fn validate_rva(&self, rva: RVA) -> bool
Verify that the given RVA is a valid RVA.
An RVA is validated if it is less than the size of the image.
Sourcefn validate_va(&self, va: VA) -> bool
fn validate_va(&self, va: VA) -> bool
Verify that the given VA is a valid VA for this image.
A VA is validated if it lands between the image base and the end of the image, determined by its size.
In other words: image_base <= VA < (image_base+image_size)
Sourcefn is_aligned_to_file(&self, offset: Offset) -> bool
fn is_aligned_to_file(&self, offset: Offset) -> bool
Check if a given Offset is aligned to the file_alignment attribute of the
optional header.
Sourcefn is_aligned_to_section(&self, rva: RVA) -> bool
fn is_aligned_to_section(&self, rva: RVA) -> bool
Check if a given RVA is aligned to the section_alignment attribute of the
optional header.
Sourcefn align_to_file(&self, offset: Offset) -> Result<Offset, Error>
fn align_to_file(&self, offset: Offset) -> Result<Offset, Error>
Aligns a given Offset to the file_alignment attribute of the
optional header.
Sourcefn align_to_section(&self, rva: RVA) -> Result<RVA, Error>
fn align_to_section(&self, rva: RVA) -> Result<RVA, Error>
Aligns a given RVA to the section_alignment attribute of the
optional header.
Sourcefn offset_to_rva(&self, offset: Offset) -> Result<RVA, Error>
fn offset_to_rva(&self, offset: Offset) -> Result<RVA, Error>
Convert an offset to an RVA address. Produces Error::InvalidRVA if the produced
RVA is invalid or if the section it was transposed from no longer contains it.
Sourcefn rva_to_offset(&self, rva: RVA) -> Result<Offset, Error>
fn rva_to_offset(&self, rva: RVA) -> Result<Offset, Error>
Convert an RVA to an offset address. Produces a Error::InvalidOffset error if
the produced offset is invalid or if the section it was transposed from no longer contains it.
Sourcefn rva_to_va(&self, rva: RVA) -> Result<VA, Error>
fn rva_to_va(&self, rva: RVA) -> Result<VA, Error>
Convert an RVA to a VA address. Produces a Error::InvalidVA error if the produced
VA is invalid.
Sourcefn va_to_rva(&self, va: VA) -> Result<RVA, Error>
fn va_to_rva(&self, va: VA) -> Result<RVA, Error>
Convert a VA to an RVA. Produces a Error::InvalidRVA error if the produced RVA
is invalid.
Sourcefn get_resource_address(&self, offset: ResourceOffset) -> Result<RVA, Error>
fn get_resource_address(&self, offset: ResourceOffset) -> Result<RVA, Error>
Get an RVA object relative to the resource directory.
This is useful for gathering addresses when parsing the resource directory. Returns Error::OutOfBounds
if the offset doesn’t fit in the resource directory.
Sourcefn calculate_header_size(&self) -> Result<usize, Error>
fn calculate_header_size(&self) -> Result<usize, Error>
Calculates the size of the image headers.
Sourcefn calculate_disk_size(&self) -> Result<usize, Error>
fn calculate_disk_size(&self) -> Result<usize, Error>
Calculate the size of the image as it appears on disk. Note that if there is appended data at the end of the file, it will not be factored in.
Sourcefn calculate_memory_size(&self) -> Result<usize, Error>
fn calculate_memory_size(&self) -> Result<usize, Error>
Calculate the size of the image as it appears in memory.
Sourcefn recreate_image(&self, pe_type: PEType) -> Result<Vec<u8>, Error>
fn recreate_image(&self, pe_type: PEType) -> Result<Vec<u8>, Error>
Creates a new vector representing either what the image looks like on disk (i.e., a PEType::Disk image)
or what the image looks like in memory (i.e., a PEType::Memory image).
Note that for Memory images, it does not use caluclate_memory_size.
It rather relies on the size_of_image field, as that’s what the loader does.
Sourcefn fix_image_size(&mut self) -> Result<(), Error>
fn fix_image_size(&mut self) -> Result<(), Error>
Recalculate the PE’s memory size with calculate_memory_size and set this value as the
header’s size_of_image value.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".