如何使用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();
}