在我的应用程序中,我使用Pcap.net
DLL并以这种方式更改数据包ip:
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,任何方式如何在不事先知道什么的情况下实现我的目的我的包协议?
答案 0 :(得分:0)
PCap.NET lib是从C lib重写的,据我检查,它的OO不是很好,所以你必须使用条件运算符来验证数据包。
以下是源代码:http://pcapdotnet.codeplex.com/SourceControl/latest#PcapDotNet/src/
提示:避免将IP比较为字符串。首选整数(IPv4),更安全,更快。
//示例:IPv4转换
int intAddress = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes(), 0);
string ipAddress = new IPAddress(BitConverter.GetBytes(intAddress)).ToString();
您可以创建一个抽象数据包信息的接口,以使类能够相互通信(适配器设计模式),但不久之后您必须检测每种类型的数据包。否则,您可以修改PCapLib以启用它。例如:
创建一个抽象方法,返回所需的所有数据包信息,每个类必须实现它(TCP,UDP,ICMP类),添加一些方法(例如,接收源/目标IP,源/目标端口等) )。主要思想是使用polimorphism。
修改PacketBuilder.Build以接受这些参数。
答案 1 :(得分:0)
您可以通过检查EthernetDatagram.EtherType字段来检查EthernetDatagram是否包含VLAN数据报。
如果是,您应该通过
进入IPv4层packet.Ethernet.VLanTaggedFrame.IpV4