【问题标题】:C# Getting packet dataC# 获取数据包数据
【发布时间】:2010-12-23 11:37:23
【问题描述】:

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

【问题讨论】:

    标签: c# sockets http-headers packets


    【解决方案1】:

    当您使用 raw 套接字嗅探数据时,您正在接收 Internet 协议 (IP) 数据包。每个 IP 数据包都以IP header 开头。此标头通常为 20 字节长,但也可以更长。 IP头之后是传输层的头,例如Transmission Control Protocol(TCP)头或User Datagram Protocol(UDP)头。在此标头之后是您要查找的数据,即 HTTP。所以在解析数据的时候,需要先跳过IP头和传输层头。

    【讨论】:

      【解决方案2】:

      首先,您为什么要使用原始套接字编写此代码并更改 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);
                  }
              }
      

      【讨论】:

        【解决方案3】:

        您可能需要查看此 C# 网络嗅探器的源代码 here

        【讨论】:

        • 谢谢,我看过这个,但我认为它只是将数据作为字节数组返回,而不是作为字符串返回。标头中的数据是否可能导致转换为字符串时出现问题?
        猜你喜欢
        • 2015-12-21
        • 2012-12-02
        • 1970-01-01
        • 2021-06-18
        • 2013-01-22
        • 1970-01-01
        • 1970-01-01
        • 2020-05-30
        • 2020-05-15
        相关资源
        最近更新 更多