Determine o endereço MAC do Next Hop no C#
-
20-09-2019 - |
Pergunta
Estou escrevendo um aplicativo que injeta pacotes usando SharppCap.
No entanto, como estou construindo os pacotes por conta própria e conheço apenas o endereço IP do destino, tenho que determinar o endereço físico do próximo salto. Eu sempre posso enviar um ping para o controle remoto endereço de IP, cheire e pegue o Endereço MAC Do pacote cheirado. No entanto, eu esperava que haja uma maneira menos complicada de fazê -lo em C#.
Obviamente, obter o endereço IP do próximo salto também será muito útil, pois eu posso usar o Sendarp para determinar seu endereço MAC.
Obter a tabela de roteamento servirá. Como eu obteria isso usando código?
Solução
Eu tive alguns problemas com o WMI (parece que não se pode correlacionar entre um índice de interface no WIN32_IP4ROUTETABLE com um dispositivo real; a documentação do MSDN está errada e outras técnicas mais hackish falham em alguns computadores).
Então, eu escolhi usar o não gerenciado Getbestroute, o que realmente me salvou muito tempo, porque permite que o Windows tome a decisão de roteamento e retorne o endereço IP do próximo salto e o identificador da NIC, levando a esse endereço. Também é muito mais rápido do que executar uma consulta contra o WMI.
Você pode encontrar o próprio NIC, procurando esse identificador na lista retornada por GetAdaptersInfo.
Espero que ajude ...
Outras dicas
Os endereços físicos são resolvidos pelo Protocolo de Resolução de Endereço - Basta enviar um Arp reuest com o endereço IP para resolver.
Se o destino não estiver na rede local, o pacote deverá ser enviado para o gateway padrão e é necessário executar uma solicitação ARP para o gateway padrão. O gateway padrão pode ser obtido usando métodos do System.net.networkInformation espaço para nome.
NetworkInterface.GetAllNetworkInterfaces()[0].GetIPProperties().GatewayAddresses
A maneira completamente hackish de fazê -lo seria executar o comando "arp -a" e ler e analisar os resultados do comando (usando o Arp cache já mantido pelo Windows).
Caso contrário, você precisa incluir ARP na pilha de protocolos. É assim que seu próprio sistema funciona para descobrir para onde enviar quadros. Ou, por fim, se você não estiver preocupado em ser ineficiente, poderá definir seu destino Ethernet como: FF: FF: FF: FF: FF: FF e inundar todos na mesma LAN que você. Quando algo responder ou você obtém um pacote, cache -o para ter o endereço MAC de destino adequado.
Pessoalmente, se você fizesse a inundação que todo mundo se aproximava da minha rede, eu o machucaria, mas, dependendo da sua situação, pode ser um hack bastante fácil. No entanto, fazer uma implementação 100% de pilha completa é bastante complexa, pois existem muitos casos de borda que devem ser bem suportados (como lidar com o proxy ARP, ARP gratuito, etc.).