Winpcap - 发送数据有麻烦

时间:2009-08-15 15:20:52

标签: c# .net packet-capture winpcap packet-sniffers

我正在使用Tamir的SharpPCap尝试将数据发送到我的msn。

目前,出于测试目的,我的想法是等待mymsn@msn.com收到的任何消息,然后再次发送数据包,也就是说,在我的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 mymsn@msn.com")) {
            return;
        }

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

        device.PcapSendPacket(tcpPacket);
    }
}

4 个答案:

答案 0 :(得分:6)

TCP的一个关键功能是“丢弃重复的数据包”

因此,要使用WinPcap解决您的问题,您必须捕获一个MSN消息的所有数据包并将其重新发送到新数据包中。希望MSN不接受这一点。

在这种情况下,学习如何处理MSN协议可以解决这个问题。

CodeProject Howto:Connect_To_MSN_Messenger

也许这个C#lib MSNP-Sharp以某种方式解决了您的问题,或者至少让您更好地理解Microsoft Notification Protocol

答案 1 :(得分:3)

这是我的怀疑......

你正在重新发送数据包,我认为这会让网络驱动程序认为它收到了两次相同的数据包。这可能发生在各种情况下,例如第一次出现需要一段时间才能到达,所以发件人重新发送以防万一丢失。

然后,网络驱动程序(或MSN)将发现副本并将其丢弃 - 毕竟,它已经看到了数据,因此它不需要冗余副本。因此,明确地再次发送相同的数据包基本没有用处。

您还必须考虑在数据中看到一个数据包。无法保证该数据包包含完全单个命令,说“这是一条消息”。例如,它可能以下一条消息的第一位结束。只是在流中插入额外的数据不仅困难,而且还需要了解协议才能正确完成。


现在当你说“我的MSN上没有任何内容”时,你的意思是没有额外的消息,或者第一条消息没有出现?如果你只是没有重复,那么上面解释了它。如果您通过运行此程序有效地阻止 MSN,那么这显然有些不同。

答案 2 :(得分:1)

我认为MSN具有某种应用程序级别的数据包编号,完整性检查和欺骗检查。对于这种备受瞩目的目标而言,其他任何事情都是犯罪无能的。

假设MSN对其发送的数据包应用链式流加密...在这种情况下,接收重复数据包只会导致垃圾,因为加密算法的状态将不同(数据包的解密设置)序列中下一个数据包的解密状态)。因此,重复的数据包看起来像是MSN的坏数据包,它将被忽略。

因此,重放数据包可能会有效,但MSN会确保在应用程序级别忽略它们。除非您了解MSN应用程序级协议,否则您将无法以任何简单的方式复制邮件。

答案 3 :(得分:0)

您不能重复tcp数据包并期望socket接收它,每个数据包都有订单号。如果它是UDP它可能会工作,但你也不能依赖数据包来代表整个消息udp或tcp。

你的工作水平太低,使用分层服务提供商来获取接口和套接字,就像在TCP上实现协议一样,你可以重复数据包,很可能在应用程序端没有检查。