6
0
mirror of https://github.com/EddieIvan01/memexec synced 2024-06-28 09:51:45 +00:00
memexec/src/peparser/check.rs

58 lines
1.8 KiB
Rust
Raw Permalink Normal View History

2020-11-10 07:46:52 +00:00
use super::def::*;
use super::error::{Error, Result};
use super::header::ImageNtHeaders;
impl IMAGE_DOS_HEADER {
pub(crate) fn is_valid(&self) -> Result<()> {
if self.e_magic != IMAGE_DOS_SIGNATURE {
return Err(Error::InvalidDosSignature);
}
if self.e_lfanew == 0 {
return Err(Error::InvalidNtHeaderOffset);
}
Ok(())
}
}
impl<'a> ImageNtHeaders<'a> {
pub(crate) fn is_valid(&self) -> Result<()> {
match *self {
ImageNtHeaders::x86(h) => {
if h.Signature != IMAGE_NT_SIGNATURE {
return Err(Error::InvalidNtSignature);
};
if h.FileHeader.Machine != IMAGE_FILE_MACHINE_I386 {
return Err(Error::UnsupportedMachine);
}
2020-11-13 13:05:55 +00:00
// 32-bit .NET assembly may not set IMAGE_FILE_32BIT_MACHINE
2020-11-10 07:46:52 +00:00
if h.FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == 0
2020-11-13 13:05:55 +00:00
// || h.FileHeader.Characteristics & IMAGE_FILE_32BIT_MACHINE == 0
2020-11-10 07:46:52 +00:00
{
return Err(Error::InvalidFileHeaderCharacteristics);
}
}
ImageNtHeaders::x64(h) => {
if h.Signature != IMAGE_NT_SIGNATURE {
return Err(Error::InvalidNtSignature);
};
if h.FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64 {
return Err(Error::UnsupportedMachine);
}
if h.FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE == 0
2020-11-13 13:05:55 +00:00
// || h.FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE == 0
2020-11-10 07:46:52 +00:00
{
return Err(Error::InvalidFileHeaderCharacteristics);
}
}
};
Ok(())
}
}