public bool Verify(OptionalHeader header, byte * pFilePointer, uint fileSize, PEHeader * pPeHeader) { //1. The name is not empty. if (GetNameAsString().Trim() == "") { return false; } //2. VirtualAddress is a multiple of the section alignment. if (VirtualAddress == 0 || (VirtualAddress % header.SectionAlignment) != 0) { return false; } //3. SizeOfRawData is a multiple of the file alignment. if ((SizeOfRawData % header.FileAlignment) != 0) { return false; } //4. PointerToRawData is a multiple of the file alignment if ((PointerToRawData % header.FileAlignment) != 0) { return false; } //5. PointerToRawData == 0 <-> SizeOfRawData == 0 if ((PointerToRawData == 0) != (SizeOfRawData == 0)) { return false; } //6. If PointerToRawData is not null, it must fit inside the file. try { if (PointerToRawData > fileSize || checked(PointerToRawData + SizeOfRawData) > fileSize) { return false; } } catch (OverflowException) { return false; } //7. PointerToRelocations must be 0. if (PointerToRelocations != 0) { return false; } //8. PointerToLineNumbers must be 0. if (PointerToLineNumbers != 0) { return false; } //9. NumberOfRelocations must be 0. if (NumberOfRelocations != 0) { return false; } //10. NumberOfLineNumbers must be 0. if (NumberOfLineNumbers != 0) { return false; } //11. The characteristics must be valid. We seperate out the check for //bits marked as reserved from the check for defined bits that we don't support. if ((Characteristics & SectionCharacteristics.Reserved) != 0) { return false; } if ((Characteristics & SectionCharacteristics.DisallowedFlags) != 0) { return false; } return true; }
public bool Verify(uint fileSize, PEHeader * pPEHeader) { FluentAsserts.AssumeNotNull((void *)pPEHeader); fileSize.AssumeGT(0U); if (CodeSize > ImageSize) { return false; } if (InitializedDataSize > ImageSize) { return false; } if (UninitializedDataSize > ImageSize) { return false; } try { if (checked(CodeSize + InitializedDataSize + UninitializedDataSize) > ImageSize) { return false; } } catch (OverflowException) { return false; } if (AddressOfEntryPoint != 0 && AddressOfEntryPoint < BaseOfCode) { return false; } if (SectionAlignment < FileAlignment) { return false; } if (FileAlignment < 512 || FileAlignment > 0x10000) { return false; } //Is file alignment a power of 2? if (((FileAlignment) & (FileAlignment - 1)) != 0) { return false; } if (Win32VersionValue != 0) { return false; } //Is the header size a multiple of the file alignment? if ((HeaderSize & (FileAlignment - 1)) != 0) { return false; } if (HeaderSize > fileSize) { return false; } try { //Is the reported header large enough to actually hold all the headers? if ( HeaderSize < checked( LAYOUT_SIZE + (NumberOfDataDirectories * sizeof(RVAAndSize)) + sizeof(PEHeader) + PEFile.MSDosStubSize + (pPEHeader->NumberOfSections * sizeof(SectionHeader)) ) ) { return false; } } catch (OverflowException) { return false; } if ( Subsystem != ImageSubsystem.IMAGE_SUBSYSTEM_WINDOWS_CUI && Subsystem != ImageSubsystem.IMAGE_SUBSYSTEM_WINDOWS_GUI ) { return false; } if ((DllCharacteristics.RESERVED_BITS & DllCharacteristics) != 0) { return false; } if ((DllCharacteristics & DllCharacteristics.IMAGE_DLLCHARACTERISTICS_WDM_DRIVER) != 0) { return false; } if (StackReserveSize < StackCommitSize) { return false; } StackReserveSize.AssumeLTE(SIZE_MAX); StackCommitSize.AssumeLTE(SIZE_MAX); if (HeapReserveSize < HeapCommitSize) { return false; } HeapReserveSize.AssumeLTE(SIZE_MAX); HeapCommitSize.AssumeLTE(SIZE_MAX); if (LoaderFlags != 0) { return false; } if (NumberOfDataDirectories < 16) { return false; } if (! DataDirectories[15].IsZero()) { return false; } if (CLRRuntimeHeader.IsZero()) { return false; } if (CLRRuntimeHeader.Size < sizeof(CLRHeader)) { return false; } for (int i = 0; i < NumberOfDataDirectories; ++i) { if (DataDirectories[i].RVA > ImageSize) { return false; } if (! DataDirectories[i].IsConsistent()) { return false; } } return true; }