В моем приложении я использую Pcap.net
библиотеки DLL и изменения пакетов IP следующим образом:Изменение пакета IP, используя Pcap.Net без знать заранее, если пакет TCP, UDP
private Packet ChangePacketIp(Packet packet, string oldIpAddress, string newIpAddress)
{
try
{
EthernetLayer ethernet = (EthernetLayer)packet.Ethernet.ExtractLayer();
IpV4Layer ipV4Layer = (IpV4Layer)packet.Ethernet.IpV4.ExtractLayer();
DateTime packetTimestamp = packet.Timestamp;
if (packet.Ethernet.IpV4.Source.ToString() == oldIpAddress)
{
ipV4Layer.Source = new IpV4Address(newIpAddress);
ipV4Layer.HeaderChecksum = null;
}
else if (packet.Ethernet.IpV4.Destination.ToString() == oldIpAddress)
{
ipV4Layer.CurrentDestination = new IpV4Address(newIpAddress);
ipV4Layer.HeaderChecksum = null;
}
if (packet.Ethernet.IpV4.Protocol == IpV4Protocol.Tcp)
{
TcpLayer tcpLayer = (TcpLayer)packet.Ethernet.IpV4.Tcp.ExtractLayer();
tcpLayer.Checksum = null;
ILayer payload = packet.Ethernet.IpV4.Tcp.Payload.ExtractLayer();
return PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, tcpLayer, payload);
}
else if (packet.Ethernet.IpV4.Protocol == IpV4Protocol.Udp)
{
UdpLayer udpLayer = (UdpLayer)packet.Ethernet.IpV4.Udp.ExtractLayer();
udpLayer.Checksum = null;
ILayer payload = packet.Ethernet.IpV4.Udp.Payload.ExtractLayer();
return PacketBuilder.Build(packetTimestamp, ethernet, ipV4Layer, udpLayer, payload);
}
else
{
return null;
}
}
catch (Exception)
{
return null;
}
}
В случае, если у меня есть VLAN packet
packet.Ethernet.IpV4.Protocol
отличается от TCP
, хотя пакет является TCP, и в этом случае я возвращаю null, каким-либо образом, как достичь своей цели, не зная заранее, что мой пакетный протокол?
Что и означает Предпочитают целое? –
@MikeMaggy Я имел в виду: обрабатывать IP с помощью целого является более безопасным и быстрым способом. IP-адресация содержит 32 бита информации, поэтому вы можете выразить IP-адреса как целочисленные. Строки слишком гибкие, например: «127.0.0.1» отличается от «127.0.0.1». Даже пробелы могут привести к ошибкам. На низком уровне сравнение целых чисел происходит быстрее, чем сравнение строк. –
Хорошо, что хорошо, но как насчет моего вопроса об изменении пакета ip без предварительного уведомления, если пакет TCP, UDP и т. Д.? –