Pergunta

Gostaria de capturar todos os pacotes HTTP de entrada de minha máquina. Para fazer isso eu estou usando SharpPcap que é um wrapper WinPcap.

SharpPcap funciona muito bem, mas ele captura pacotes TCP e isso é muito baixo nível para fazer o que quero. Alguém sabe como posso easly chegar completos solicitações HTTP / respostas de todos esses pacotes TCP?

Graças

Foi útil?

Solução

SharpPcap já é capaz de capturar pacotes da mesma maneira que wireshark faz (apenas no código em vez de um GUI). E você pode analisá-los diretamente ou você pode despejá-los para a unidade no formato de arquivo .pcap comum.

Os passos para analisar uma captura são:

  • Escolha uma interface
  • Abrir uma conexão em modo promíscuo
  • Iniciar captura ou usando um loop while ou um evento de retorno de chamada
  • Parse o pacote cru para o tipo que você quiser

Se despejo você está lendo .pcap arquiva o processo é quase o mesmo, exceto que você chama um leitor de captura desligada, não precisa escolher uma interface, e não precisam para definir o modo promíscuo. Todos os filtros padrão que wireshark, tcpdump, ea maioria dos outros frameworks PCAP usam são suportados no SharpPcap. Para uma referência a estes verifique o homem tcpdump.

Atualmente, não há suporte para análise HTTP diretamente, mas analisar os pacotes TCP é realmente fácil.

Quando você receber o pacote cru (não analisada) faça o seguinte:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

O Packet.Net (um componente separado e incluído de SharpPcap) analisador é capaz de puxar para fora a porção de TCP directamente mesmo se a comunicação é encapsulado por VPN, PPoE, ou PPP.

uso

Depois de ter o TCPPacket analisado basta pegar packet.PayloadBytes para a carga em uma matriz de bytes que deve conter o cabeçalho HTTP em bytes-primas que podem ser convertidos para o formato de texto adequada (não tenho certeza se os cabeçalhos HTTP UTF-8 ou ASCII que codifica a esse nível). Deve haver uma abundância de ferramentas / bibliotecas disponíveis gratuitamente para analisar os cabeçalhos HTTP.


Para extrair o HTTP pacote de TCP:

Você precisa coletar os pacotes TCP da conexão como eles entram e se os dados são fragmentados (maior que 1500 bytes) que você precisa para voltar a montar as peças na memória. Para descobrir quais as partes ir em que ordem você precisa controlar cuidadosamente os números seqüência / confirmação.

Isso é uma coisa não-trivial para realizar com SharpPcap porque você está trabalhando com uma parte muito menor da pilha e re-montagem a conexão manualmente.

Wireshark tem um artigo interessante sobre como fazer isso em C.

A partir de agora, SharpPcap não suporta TCP payload de análise.


Se você está procurando exemplos fáceis de seguir de como usar SharpPcap baixar a árvore fonte e olhar para os exemplos de projetos incluídos. Há também um tutorial para SharpPcap em codeproject .

Se você tem mais perguntas e / ou você quiser fazer quaisquer solicitações de recursos para o projeto, sinta-se livre para postar no projeto SourceForge. É longe de ser morto e continua a ser em desenvolvimento ativo.

Nota: Chris Morgan é o líder do projeto e eu sou um dos desenvolvedores para SharpPcap / Packet.Net.

Update: O projeto tutorial sobre projeto de código é agora up-to-date para coincidir com a API atual

.

Outras dicas

A decodificação um fluxo TCP em HTTP pares de pedido / resposta é não-trivial. Ferramentas como WireShark fazer isso com um esforço considerável.

Eu escrevi um invólucro WireShark para Ruby (não que isso irá ajudá-lo), mas antes que eu escrevi Eu tentei usar tshark (a versão de linha de comando de WireShark). Isso não resolver o meu problema, mas pode funcionar para você. Veja como:

Você capturar os pacotes e gravá-los em um arquivo pcap (SharpPcap provavelmente tem uma maneira de fazer isso). Em algum momento perto do arquivo tampa e iniciar um outro, em seguida, no velho tshark uma experiência com um filtro para o tráfego HTTP, e um sinalizador que indica que você deseja que a saída no formato PDML. Você vai encontrar este é um formato XML, facilmente analisado com as ferramentas System.Xml, que contém o valor de cada campo HTTP em uma variedade de formatos. Você pode escrever código C # para tshark desova, e tubo de seu fluxo StdOut em um leitor de XML para que você obtenha os pacotes fora do tshark à medida que surgem. Eu não recomendo usar o analisador DOM como a saída PDML para um grande arquivo de captura pode ficar louco muito rapidamente.

A menos que suas necessidades são complexas (como os meus eram), isso pode ser tudo que você precisa.

Eu acho que você está perto da solução: se você tem os pacotes TCP do tráfego HTTP, você só tem que extrair o payload TCP, a fim de reconstruir o pedido / resposta HTTP. Veja este SO entrada sobre uma possível maneira de fazê-lo.

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