public sealed class RvaBoundsRule : IValidationRule
{
public string RuleName => nameof(RvaBoundsRule);
public ValidationSeverity Severity => ValidationSeverity.Error;
public Task<ValidationResult> ValidateAsync(PeImageInfo peInfo, CancellationToken cancellationToken)
{
var sizeOfImage = peInfo.NtHeaders.OptionalHeader.SizeOfImage;
var ok = peInfo.Sections.All(s => s.VirtualAddress + Math.Max(s.VirtualSize, s.SizeOfRawData) <= sizeOfImage);
return Task.FromResult(new ValidationResult(RuleName, Severity, ok, ok ? "RVA bounds are valid." : "Section exceeds SizeOfImage."));
}
}