4

我一直在尝试编写一个可以嗅探 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);
}
4

3 回答 3

6

当您使用原始套接字嗅探数据时,您正在接收 Internet 协议 (IP) 数据包。每个 IP 数据包都以一个IP 标头开始。此标头通常为 20 字节长,但也可以更长。IP头之后是传输层的头,例如传输控制协议(TCP)头或用户数据报协议(UDP)头。在此标头之后是您要查找的数据,即 HTTP。因此,当您解析数据时,您需要先跳过 IP 标头和传输层标头。

于 2009-12-05T03:20:55.767 回答
5

您可能想在此处查看此 C# 网络嗅探器的源代码。

于 2009-12-05T02:46:19.963 回答
5

首先,您为什么要使用原始套接字编写此代码并更改 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);
            }
        }
于 2009-12-05T03:15:51.143 回答