C# を使用してパケット データをスニッフィングしたい HTTP だけでなく、すべてのタイプのデータをスニッフィングする必要がある
私がそれをやろうとすると、このエラーが発生します:
System.Net.Sockets.SocketException: System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) の System.Net.Sockets.Socket でのアクセス許可によって禁止されている方法でソケットにアクセスしようとしました。バインド (エンドポイント ローカル EP)
public void StartCapture(string InterfaceIp)
{
try
{
//Start capturing the packets...
//For sniffing the socket to capture the packets has to be a raw socket, with the
//address family being of type internetwork, and protocol being IP
mainSocket = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Raw, System.Net.Sockets.ProtocolType.IP);
//Bind the socket to the selected IP address
mainSocket.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(InterfaceIp), 0));
//Set the socket options
mainSocket.SetSocketOption(System.Net.Sockets.SocketOptionLevel.IP, //Applies only to IP packets
System.Net.Sockets.SocketOptionName.HeaderIncluded, //Set the include the header
true); //option to true
byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4] { 1, 0, 0, 0 }; //Capture outgoing packets
//Socket.IOControl is analogous to the WSAIoctl method of Winsock 2
mainSocket.IOControl(System.Net.Sockets.IOControlCode.ReceiveAll, //Equivalent to SIO_RCVALL constant
//of Winsock 2
byTrue,
byOut);
//Start receiving the packets asynchronously
mainSocket.BeginReceive(byteData, 0, byteData.Length, System.Net.Sockets.SocketFlags.None,
new AsyncCallback(OnReceive), null);
}
catch (Exception ex)
{
//Report Exception
}
}
注:私はASP.Netを使用しています。パケットのヘッダーだけでなく、データを盗聴することが非常に重要です
偽装を使用しても問題は解決しませんでしたが、問題はソケットにアクセスするための適切な権限がないことに関連していると思います
問題の解決策を見つけました。これは、保護され、単一の IP アドレスに制限されているソケットへのバインドを制限する最近の実装に関連しています
ここにいくつかの興味深いリンクがあります
http://msdn.microsoft.com/en-us/library/cc150667(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ms740668%28v=VS.85%29.aspx