我一直在尝试编写一个可以嗅探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);
}
答案 0 :(得分:6)
使用原始套接字嗅探数据时,您将收到Internet协议(IP)数据包。每个IP数据包都以IP header开头。此标头通常长20个字节,但可能比此长。 IP报头之后是传输层的报头,例如Transmission Control Protocol(TCP)报头或User Datagram Protocol(UDP)报头。在此标题之后是您要查找的数据,即HTTP。因此,当您解析数据时,您需要首先跳过IP标头和传输层标头。
答案 1 :(得分:5)
您可能想要查看此C#网络嗅探器here的源代码。
答案 2 :(得分: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);
}
}