我一直在试图写一个脚本,将嗅探HTTP标头。到目前为止,我已经得到了套接字绑定到端口80和包似乎接受,但我不能让他们进入字符串形式。所有输出是“E”不断。我换了个字节为十六进制更早,似乎有一些数据进来,但目前的代码是无法改变的字节为一个字符串。有解码字节的一些其他的方式,将给予一个适当的字符串?

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);
}
有帮助吗?

解决方案

在嗅探使用的原始插座,你接收互联网协议(IP)分组中的数据。每个IP包的开头是一个 IP头。此标头通常为20个字节长,但它可以是长于。以下IP标头被用于传输层报头,例如,传输控制协议(TCP)头或用户数据报协议(UDP)标头。这种头部后面就是你要寻找的数据,即HTTP。因此,当你解析数据,你需要跳过IP报头和传输层报头第一。

其他提示

您可能想签的源代码,这个C#网络嗅探器,这里

首先,你为什么写这使用原始套接字和改变的IOControl?我试着运行您在Vista的代码,它是行不通的,即使管理员。你可以使用一个更高层次的抽象,如TcpClient的呢?

其次,你需要你的回应之前发送的请求。可以发送的最简单的请求是“GET / \ n”,其中\ n是一个新的行的字符。

下面是一些代码,可以使用(Write方法需要检查的返回值也一样,但是这是为了简化省略):

        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);
            }
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top