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