У меня есть функции для анализа введенных подсетей в диапазоне IP-адресов, которые я могу перебирать, чтобы отправлять запросы ARP в сеть и возвращать действующие хосты в сети. .
Я вижу, что приложение Wireshark генерирует пакеты ARP, но с неправильными подсетями.
Например, когда я ввожу подсеть 192.168.1.1/24 в Wireshark я вижу 1.1.168.X вместо 192.168.1.X

Также по какой-то причине он не работает с 192.168.1.0/24, только с 192.168.1.1/24 с нулем на конце он ничего не делает.
Это код для сканера:
[DllImport("iphlpapi.dll", ExactSpelling = true)]
private static extern int SendARP(int DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen);
private static uint macAddrLen = (uint)new byte[6].Length;
private async Task PerformArpScan()
{
ScanResults.Clear();
foreach (var subnet in Subnets)
{
var (networkAddress, cidr) = ParseSubnet(subnet);
var hosts = GenerateIPRange(networkAddress, cidr).ToList();
var results = new ConcurrentBag();
await Task.Run(() =>
{
Parallel.ForEach(hosts, new ParallelOptions { MaxDegreeOfParallelism = 20 }, ip =>
{
var result = SendArpRequest(ip);
if (result != null)
{
results.Add(result);
}
});
});
await Dispatcher.InvokeAsync(() =>
{
foreach (var result in results)
{
ScanResults.Add(result);
}
});
}
}
private ScanResult SendArpRequest(IPAddress ipAddress)
{
byte[] macAddr = new byte[6];
uint macAddrLen = (uint)macAddr.Length;
try
{
int result = SendARP(BitConverter.ToInt32(ipAddress.GetAddressBytes().Reverse().ToArray(), 0), 0, macAddr, ref macAddrLen);
if (result == 0)
{
string macAddressString = string.Join(":", macAddr.Take((int)macAddrLen).Select(b => b.ToString("X2")));
return new ScanResult
{
IpAddress = ipAddress.ToString(),
MacAddress = macAddressString,
Status = "Online",
OpenPorts = "N/A"
};
}
}
catch (Exception ex)
{
Console.WriteLine($"Error sending ARP request to {ipAddress}: {ex.Message}");
}
return null;
}
private (IPAddress, int) ParseSubnet(string subnet)
{
var parts = subnet.Split('/');
var ip = IPAddress.Parse(parts[0]);
var cidr = int.Parse(parts[1]);
// Ensure we're using the network address
var ipBytes = ip.GetAddressBytes();
var mask = uint.MaxValue cidr);
for (uint i = startIP + 1; i < endIP; i++)
{
yield return new IPAddress(BitConverter.GetBytes(i));
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... r-notation