Починить http сниффер
Имеется HTTP сниффер на C# под .NET4. Вкратце его особенности:
1. В Program.cs встроен код, который проверяет запущен ли сниф от имени администратора, в случае если в винде установлен высокий уровень контроля учетных записей. Если нет, то перед запуском выдается окно с просьбой запустить от админа
2. Привязка к сетевому интерфейсу
///
/// Привязка к сетевому интерфейсу
///
///
public void Bind(out string lastError)
{
lastError = "";
try
{
IPHostEntry HosyEntry = Dns.GetHostEntry((Dns.GetHostName()));
if (HosyEntry.AddressList.Length > 0)
{
foreach (IPAddress ip in HosyEntry.AddressList)
{
string S = ip.ToString();
if (S.ToString().Length
{
Console.WriteLine(S);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
socket.Bind(new IPEndPoint(IPAddress.Parse(S.ToString()), 0));
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
byte[] byInc = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4];
buffer = new byte[4096];
socket.IOControl(IOControlCode.ReceiveAll, byInc, byOut);
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, OnReceive, null);
break;
}
}
}
}
catch (Exception exp)
{
lastError = exp.Message;
logger.saveLog("Bind error "+lastError);
}
}
3. Функция перехвата полученного пакета выглядит следующим образом:
private void OnReceive(IAsyncResult ar)
{
try
{
int nReceived = socket.EndReceive(ar);
if (PacketParser.Check(TargetString, buffer, nReceived, out host))
{
//проверяем является ли пакет http и посылается ли он интересующему нас хосту
}
//заново настраиваем отслеживание пакетов
buffer = new byte[4096];
try
{
//logger.saveLog("socket.BeginReceive");
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, OnReceive, null);
}
catch
{
logger.saveLog("Next beginreceive error");
}
}
catch { }
}
4. Функция анализа пакета следующая:
public static bool Check(string Filter, byte[] Buffer, int Length,out string host)
{
host = "";
IPHeader ipHeader = new IPHeader(Buffer, Length);
//Вот здесь на одном из компов с windows7 постоянно вместо TCP получаем UDP
if (ipHeader.ProtocolType == Protocol.TCP)
{
TCPHeader tcpHeader = new TCPHeader(ipHeader.Data, ipHeader.MessageLength);
…….
…….
…...
=================
Тестировался на компьютерах с windows7. В основном работает нормально, но на одном из них проблема в данном участке:
public static bool Check(string Filter, byte[] Buffer, int Length,out string host)
{
host = "";
IPHeader ipHeader = new IPHeader(Buffer, Length);
if (ipHeader.ProtocolType == Protocol.TCP)
{
вот здесь всегда Protocol.UDP вместо Protocol.TCP и соответственно ничего не распознается. То есть когда я в браузере перехожу на какую либо страницу (и в том же фидлере идет перехват), у меня сниффер ловит только Protocol. UDP
Можете ли вы предложить решение проблемы? Исходники предоставлю