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."));
    }
}