0

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

目前,出于测试目的,我的想法是等待 mymsn@msn.com 收到任何 msg,然后再次发送数据包本身,即让任何消息在我的 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

4 回答 4

6

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

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

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

CodeProject 方法:Connect_To_MSN_Messenger

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

于 2009-08-19T12:31:23.317 回答
3

这是我的怀疑...

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

网络驱动程序(或 MSN)然后会发现重复并丢弃它 - 毕竟,它已经看到了该数据,因此它不需要冗余副本。所以再次显式发送相同的数据包基本上没有任何目的。

您还必须考虑在数据中看到一个数据包。不能保证该数据包包含一个命令,即“这里有一条消息”。例如,它可能以下一条消息的第一位结束。仅将额外数据插入流中不仅很难,而且您还需要了解协议才能正确执行。


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

于 2009-08-18T22:56:50.753 回答
1

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

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

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

于 2009-08-24T06:16:50.897 回答
0

您不能重复一个 tcp 数据包并期望套接字接收它,每个数据包上都有订单号。如果是 UDP,它可能会起作用,但您也不能依赖数据包来表示整个消息,无论是 udp 还是 tcp。

您的工作级别太低,使用分层服务提供程序在接口和套接字之间获取,这就像在 TCP 上实现一个协议,在那里您可以重复数据包,并且很可能不会在应用程序端进行检查。

于 2009-08-24T13:05:05.800 回答