public sealed class OverlappingSectionsRule : IValidationRule
{
public string RuleName => nameof(OverlappingSectionsRule);
public ValidationSeverity Severity => ValidationSeverity.Error;
public Task<ValidationResult> ValidateAsync(PeImageInfo peInfo, CancellationToken cancellationToken)
{
for (var i = 0; i < peInfo.Sections.Count; i++)
{
for (var j = i + 1; j < peInfo.Sections.Count; j++)
{
var a = peInfo.Sections[i];
var b = peInfo.Sections[j];
var aEnd = a.VirtualAddress + Math.Max(a.VirtualSize, a.SizeOfRawData);
var bEnd = b.VirtualAddress + Math.Max(b.VirtualSize, b.SizeOfRawData);
if (a.VirtualAddress < bEnd && b.VirtualAddress < aEnd)
{
return Task.FromResult(new ValidationResult(RuleName, Severity, false, "Overlapping sections detected."));
}
}
}
return Task.FromResult(new ValidationResult(RuleName, Severity, true, "No overlapping sections detected."));
}
}