Pergunta

Eu venho tentando escrever um script que vai farejar cabeçalhos HTTP. Até agora eu tenho o soquete ligado a porta 80 e os pacotes parecem ser recebido, mas eu não posso obtê-los em forma de string. Tudo o que saídas é "E" continuamente. Mudei os bytes em hex anteriormente e não parece estar chegando alguns dados, mas o código atual é incapaz de alterar os bytes em uma string. Existe alguma outra maneira de decodificar os bytes que vai dar uma seqüência adequada?

byte[] input = BitConverter.GetBytes(1);
byte[] buffer = new byte[4096];
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
s.Bind(new IPEndPoint(IPAddress.Parse(strIP), 80));
s.IOControl(IOControlCode.ReceiveAll, input, null);
int bytes;
bytes = s.Receive(buffer);
while (bytes > 0)
{
    log(System.Text.Encoding.ASCII.GetString(buffer, 0, bytes));
    bytes = s.Receive(buffer);
}
Foi útil?

Solução

Quando você sniff dados usando um pacotes brutos socket, você está recebendo Protocolo de Internet (IP). Cada pacote IP começa com uma IP cabeçalho . Este cabeçalho é tipicamente de 20 bytes de comprimento, mas pode ser mais longo do que isto. Após o cabeçalho IP é o cabeçalho para a camada de transporte, por exemplo, o Transmission Control Protocol (TCP) cabeçalho ou Protocolo de datagrama (UDP) o do utilizador. Após este cabeçalho vem os dados que você está procurando, ou seja, o HTTP. Assim quando você está analisando os dados, você precisa pular o cabeçalho IP eo cabeçalho Transport Layer primeiro.

Outras dicas

Em primeiro lugar, por que você está escrevendo isso usando soquetes brutos e mudando o IOControl? Eu tentei executar o código no Vista e que não iria funcionar, mesmo como administrador. você pode usar um nível maior de abstração, como TcpClient vez?

Em segundo lugar, você precisa enviar um pedido antes de obter uma resposta. O pedido mais simples que você pode enviar é "GET / \ n", onde \ n é o personagem para uma nova linha.

Aqui está um código que você pode usar (as necessidades método de gravação para verificar o valor de retorno também, mas isso é omitido por simplicidade):

        using (TcpClient tcpClient = new TcpClient(strIP, 80))
        {
            using (Stream s = tcpClient.GetStream())
            {
                byte[] bytesToSend = Encoding.ASCII.GetBytes("GET /\n");
                s.Write(bytesToSend, 0, bytesToSend.Length);
                int bytes;
                byte[] buffer = new byte[4096];
                do
                {
                    bytes = s.Read(buffer, 0, buffer.Length);
                    Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, bytes));
                } while (bytes > 0);
            }
        }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top