首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果数据包是TCP、UDP,则在事先不知道的情况下使用Pcap.Net更改数据包ip

如果数据包是TCP、UDP,则在事先不知道的情况下使用Pcap.Net更改数据包ip
EN

Stack Overflow用户
提问于 2014-11-20 03:08:38
回答 2查看 1.6K关注 0票数 0

在我的应用程序中,我使用Pcap.net DLL,并以这种方式更改数据包ip:

代码语言:javascript
复制
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,有什么方法可以在不事先知道我的数据包协议的情况下实现我的目的?

EN

回答 2

Stack Overflow用户

发布于 2014-11-20 04:29:43

PCap.NET库是从C重写的,据我所知,它不是很好的面向对象,所以你必须使用条件运算符来验证数据包。

以下是源代码:http://pcapdotnet.codeplex.com/SourceControl/latest#PcapDotNet/src/

提示:避免将IP作为字符串进行比较。首选整数(IPv4),更安全更快。

//示例: IPv4转换

代码语言:javascript
复制
int intAddress = BitConverter.ToInt32(IPAddress.Parse(address).GetAddressBytes(), 0);
string ipAddress = new IPAddress(BitConverter.GetBytes(intAddress)).ToString();

您可以创建一个接口来抽象包信息,以使类能够相互通信(适配器设计模式),但迟早您必须检测每种类型的包。否则,您可以修改PCapLib以启用它。例如:

  1. 创建一个抽象方法,返回您需要的所有数据包信息,每个类都必须实现它(TCP、UDP、ICMP类),添加一些方法(例如,接收源/目标IP、源/目标端口等)。其主要思想是使用多态。
  2. 修改PacketBuilder.Build以接受这些参数。
票数 0
EN

Stack Overflow用户

发布于 2014-11-22 19:16:45

您可以通过检查EthernetDatagram.EtherType字段来检查EthernetDatagram是否包含VLAN数据报。

如果是这样的话,您应该通过执行以下操作来访问IPv4层

代码语言:javascript
复制
packet.Ethernet.VLanTaggedFrame.IpV4
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27024961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档