2009-08-15 4 views
0

Я использую SharpPCap от Tamir, чтобы попытаться отправить данные в мой msn.Winpcap - Проблемы с отправкой данных

В настоящее время для целей тестирования моя идея - дождаться любого сообщения, полученного [email protected], а затем снова отправить сам пакет, то есть сделать любое сообщение повторяющимся навсегда на моем MSN. Я думал, что это должно сработать, поскольку я просто получаю сам пакет и получаю его снова.

По какой-то причине ничего не появляется в моем msn, хотя я увижу на панели напечатано много «пойманных данных, пересылая их». Есть идеи? Благодаря

class Program { 
    static PcapDevice device; 

    static void Main(string[] args) { 
     device = SharpPcap.GetAllDevices()[0]; 
     device.PcapOnPacketArrival += 
       new SharpPcap.PacketArrivalEvent(device_PcapOnPacketArrival2); 
     device.PcapOpen(true, 1000); 
     device.PcapStartCapture(); 

     Console.ReadKey(); 
    } 

    static void device_PcapOnPacketArrival2(object sender, Packet packet) { 
     TCPPacket tcpPacket = packet as TCPPacket; 

     if (tcpPacket == null) { 
      return; 
     } 

     string data = Encoding.Default.GetString(tcpPacket.Data); 

     if (!data.StartsWith("MSG [email protected]")) { 
      return; 
     } 

     Console.WriteLine("caught data, resending it"); 

     device.PcapSendPacket(tcpPacket); 
    } 
} 
+0

Вы уверены, что это C++? Для меня это похоже на C#. –

+0

Это C#, но это вряд ли имеет значение для самого вопроса. –

+0

@devoured elysium: Это может быть очень важно для людей, пытающихся использовать ваш образец кода. Например, я бы не попытался воспроизвести его, если бы он был на C++. –

ответ

6

Одной из ключевых особенностей TCP является «отбрасывание дублированных пакетов»

Итак, чтобы решить вашу проблему с WinPcap, вам придется захватить все пакеты одного сообщения MSN и отправить его в новых пакетах. Надеюсь, MSN этого не примет.

В этом случае изучение проблемы с протоколом MSN может привести к решению этой проблемы.

CodeProject Howto: Connect_To_MSN_Messenger

Может быть, C# Lib MSNP-Sharp как-то решает проблему или, по крайней мере, дает лучшее понимание Microsoft Notification Protocol

3

Вот мое подозрение ...

Вы повторно отправить пакет, который я считаю, сделаю сетевой драйвер думает, что получил тот же пакет дважды. Это может произойти в различных случаях, например, при первом приходе, которое требуется для поступления, поэтому отправитель отправляется в случае его утраты.

Сетевой драйвер (или MSN) затем обнаружит дубликат и отменит его - в конце концов, он уже видел эти данные, поэтому ему не нужна избыточная копия. Поэтому явная отправка одного и того же пакета снова в принципе не имеет никакой цели.

Вы также должны учесть, что видите один пакет в потоке данных. Нет никакой гарантии, что этот пакет содержит ровно одну команду, говорящую «вот одно сообщение». Например, он может заканчиваться первым битом следующего сообщения. Просто вставка дополнительных данных в поток будет не только сложной, но вам также нужно будет понять протокол, чтобы сделать это правильно.


Теперь, когда вы говорите «ничего не появляется на моем MSN» не вы имеете в виду не дополнительных сообщений, или о том, что первое сообщение не появляется? Если это то, что вы просто не получаете повторения, то это объясняет выше. Если вы эффективно блокируете MSN, запустив эту программу, то это явно несколько отличается.

+0

Спасибо за ответ. У меня было такое же представление о том, что он думает о его удвоенном пакете, но если это так, то как узнать о нем Windows? У него должен быть какой-то хэш-код или что-то еще. И я не могу найти это где-то. Когда я говорю, что ничего не появляется в msn, я имею в виду повторный пакет. Оригинал появляется. –

+0

и я не могу найти, что somwhere = и я не могу найти это свойство на экземпляре TcpPacket, я имею в виду. –

+1

Это будет в заголовке TCP - порядковый номер. –

1

Я бы предположить, что MSN имеет некоторый вид нумерации пакетов на уровне приложений, проверка целостности и проверка паролей. Все остальное было бы преступно некомпетентным для такого рода громких целей.

Предположим, что MSN применяет шифрование с кодовым потоком к отправляемым им пакетам ... в этом случае получение дублированного пакета просто приведет к мусору, поскольку состояние алгоритма шифрования будет иным (дешифрование наборов пакетов состояние дешифрования для следующего пакета в последовательности).Таким образом, дублированный пакет будет выглядеть как плохой пакет для MSN, и он будет проигнорирован.

Поэтому повторные пакеты, скорее всего, будут работать, но MSN обязательно будут игнорировать их на уровне приложения. Если вы не понимаете протокол уровня приложения MSN, вы не сможете дублировать сообщения любым простым способом.

0

Вы не можете повторить пакет tcp и ожидать, что сокет получит его, на каждом пакете есть порядковые номера. Если бы это был UDP, это могло бы работать, но вы также не можете полагаться на пакеты для представления всего сообщения либо udp, либо tcp.

Вы работаете на слишком низком уровне, используйте поставщиков слоистых услуг, чтобы получить между интерфейсом и сокетом, это похоже на реализацию протокола по TCP, там вы можете повторять пакеты, и, скорее всего, не будет проверки заявки боковая сторона.

Смежные вопросы