Анализ подсетей с нотацией CIDRC#

Место общения программистов C#
Ответить
Anonymous
 Анализ подсетей с нотацией CIDR

Сообщение Anonymous »

Проблема со сканером ARP.
У меня есть функции для анализа введенных подсетей в диапазоне 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»