Отправка пакета с поддельным IP-адресом на тот же компьютер с помощью SharpPcap
Как я могу отправить пакет с поддельным IP-адресом (или даже IP и MAC) на тот же компьютер, используя SharpPcap? Подумайте, две части программного обеспечения, одна отправка и одно получение, на одной коробке.
Я уже могу подделать IP и / или MAC с помощью SharpPcap, когда отправляю на другую машину. Но это не работает отправка / получение на том же компьютере. На самом деле я ничего не получаю даже с не подделанными значениями.
Я настраиваю эмуляцию для тестирования здесь на работе, и использование двух машин не является хорошим вариантом. Мне нужны поддельные IP-адреса, потому что принимающий код (который я унаследовал) использует отправителя для интерпретации данных.
Из того, что я читал в Интернете, самопознанная отправка обходит сетевое оборудование. Чтобы принудительно включить его, я могу настроить что-то в таблице маршрутизации Windows, возможно, с использованием обратной связи по умолчанию или пользовательской (!). Я пробовал это, и это трудно и пока ненадежно. И я не знаю, означает ли это, что сам NIC пропущен.
Хотя UdpClient позволяет легко отправлять самостоятельно, я не вижу способа подделать его, поэтому я не могу использовать его вместо этого.
Я также попытался просто отправить пакет IP, исходя из теории, что ни одна сеть не означает отсутствие Ethernet, но это тоже не сработало. Может быть, я как-то глупый.
Итак, является ли таблица маршрутизации моим единственным ответом? В моем случае полностью обойдена сетевая карта? Короче, как мне заставить это работать?
Вот мой код, который работает между двумя машинами и не работает на всех. Большинство вещей в конструкторе, но завершающий 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();
}