我正在使用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);
}
}
答案 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上实现协议一样,你可以重复数据包,很可能在应用程序端没有检查。