使用SharpPcap将带有欺骗性IP地址的数据包发送到同一台计算机

时间:2018-12-12 05:24:00

标签: c# windows loopback sharppcap

如何使用SharpPcap将具有欺骗IP地址(甚至IP和MAC)的数据包发送到同一台计算机?在同一个盒子上考虑两种软件,一种发送和一种接收。

当我发送到另一台计算机时,我可以 已经 使用SharpPcap欺骗IP和/或MAC。但这在同一台计算机上发送/接收无效。实际上,即使使用非欺骗性的值,我也一无所获。

我要在工作中设置仿真以进行测试,并且使用两台计算机不是一个好的选择。我需要使用伪造的IP地址,因为接收代码(我继承的代码)使用发送方来帮助解释数据。

从我在线阅读的内容来看,自我发送绕过了网络硬件。为了强行参与,我可以在Windows路由表中进行设置,可能使用默认的环回或自定义的发明(!)。我已经尝试过了,而且很难而且到目前为止还不可靠。而且我不知道这是否意味着NIC本身被跳过了。

尽管UdpClient允许轻松进行自我发送,但我看不到有任何欺骗手段,因此我不能使用它。

我还尝试过仅发送IP数据包,其理论是没有网络就意味着没有以太网,但是它也不起作用。也许我以某种方式愚蠢了。

那么,路由表是我唯一的答案吗?在我的情况下,NIC是否被完全绕过?简而言之,我该如何进行这项工作?

这是我的代码,它可以在两台计算机之间工作,但一次都失败。大多数事情都在构造函数中,但是尾随EnsureUsableMacAddress()方法可能是相关的。 .ReceivingPort之类的属性是计算机的真实属性。 StartCard()StopCard()仅包装SharpPcap基础知识(“卡” == NIC),并且已知它们可以工作。

    public SpoofPacket(string mac, string ip, string port, byte[] content) {
        ushort inPort = ushort.Parse(ReceivingPort);
        PhysicalAddress inMac = PhysicalAddress.Parse(ReceivingMac.ToUpper());
        IPAddress inIp = IPAddress.Parse(ReceivingIp);

        ushort outPort = ushort.Parse(port);
        PhysicalAddress outMac = PhysicalAddress.Parse(mac.ToUpper());
        IPAddress outIp = IPAddress.Parse(ip);

        EthernetPacket ethernetBlob
            = new EthernetPacket(outMac, inMac, EthernetPacketType.None);


        IpPacket ipBlob = new IPv4Packet(outIp, inIp);
        UdpPacket udpBlob = new UdpPacket(outPort, inPort);

        // Constructing whole packet outward.
        udpBlob.PayloadData = content;
        ipBlob.PayloadPacket = udpBlob;
        ethernetBlob.PayloadPacket = ipBlob;

        WholePacket = ethernetBlob;
    }

    public void Send() {
        StartCard();  // Wraps some SharpPcap stuff.

        // Actually sending.
        _card.SendPacket(WholePacket);

        StopCard();  // Wraps some SharpPcap stuff.
    }

    private static void EnsureUsableMacAddress() {
        PhysicalAddress mac = null;

        for (int at = 0; at < _card.Addresses.Count; at++) {
            mac = _card.Addresses[at].Addr.hardwareAddress;
            if ((mac?.GetAddressBytes().Length ?? 0) == 6) {
                break;
            }
        }

        ReceivingMac = mac.ToString();
    }

0 个答案:

没有答案