Починить http сниффер

Александр16 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
30.08.2013

Имеется 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

Можете ли вы предложить решение проблемы? Исходники предоставлю