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?

Foi útil?

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.).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top