C# 是否使用SharpPcap过滤Dns响应?

C# 是否使用SharpPcap过滤Dns响应?,c#,dns,udp,tcpdump,sharppcap,C#,Dns,Udp,Tcpdump,Sharppcap,我正试图用SharpPcap库从DNS响应中过滤掉域名。 目前,我有以下代码: public void Filter(String filename) { ICaptureDevice device = new CaptureFileReaderDevice(filename); device.Open(); device.OnPacketArrival += new PacketArrivalEventHandler(Device_OnPacketArrival);

我正试图用SharpPcap库从DNS响应中过滤掉域名。 目前,我有以下代码:

public void Filter(String filename)
{
    ICaptureDevice device = new CaptureFileReaderDevice(filename);
    device.Open();
    device.OnPacketArrival += new PacketArrivalEventHandler(Device_OnPacketArrival);
    device.Capture();
    device.Close();

}
private void Device_OnPacketArrival(object sender, CaptureEventArgs e)
{
    Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data);
    IPPacket ip = packet.Extract<IPPacket>();

    if (ip != null)
    {
         Console.WriteLine(ip.DestinationAddress.ToString());
         Console.WriteLine(ip.SourceAddress.ToString());
    }

    UdpPacket udp = packet.Extract<UdpPacket>();

    if(udp != null && udp.HasPayloadData)
    {
            // Read dns queries
    }
}
公共无效筛选器(字符串文件名)
{
ICaptureDevice=新的CaptureFileReaderDevice(文件名);
device.Open();
device.OnPacketArrival+=新的PacketArrivalEventHandler(device_OnPacketArrival);
device.Capture();
设备。关闭();
}
私有无效设备\u OnPacketArrival(对象发送方、CaptureEventArgs e)
{
Packet Packet=Packet.ParsePacket(e.Packet.LinkLayerType,e.Packet.Data);
IPPacket ip=packet.Extract();
如果(ip!=null)
{
Console.WriteLine(ip.DestinationAddress.ToString());
Console.WriteLine(ip.SourceAddress.ToString());
}
UdpPacket udp=packet.Extract();
if(udp!=null&&udp.HasPayloadData)
{
//读取dns查询
}
}
如果我在Wireshark中打开文件,我可以轻松地查询名称:

你知道如何从udp负载中读取查询名称吗


提前感谢

欢迎来到Stack Overflow!请读这本书,然后拿下这本书。(有人纠正我,如果我错了,但)我没有看到一个DNS解析器的。考虑到它是基于libpcap/Npcap的,您可以做一些类似于,改编为C#的事情。嗨,谢谢您的帮助。我试着从有效负载数据中读取正确的字节,就像它们在链接的线程中所做的一样。好消息是,名称总是从字节54开始,所以我知道udp.PayloadData[54]是名称的开始。问题是,我不知道长度。你知道该怎么做吗?你看过了吗?是的,我看过了,还知道怎么计算长度。我有以下代码:
if(udp!=null&&udp.HasPayloadData&&udp.DestinationPort==53){nameLen=udp.PayloadData.Length-16;name=newbyte[nameLen];Array.Copy(udp.PayloadData,12,name,0,nameLen);Console.WriteLine(Encoding.ASCII.GetString(name));}
。唯一的问题是,在查询之前和之后经常有不合适的特殊字符。除了圆点,还有特殊的字符欢迎使用堆栈溢出!请读这本书,然后拿下这本书。(有人纠正我,如果我错了,但)我没有看到一个DNS解析器的。考虑到它是基于libpcap/Npcap的,您可以做一些类似于,改编为C#的事情。嗨,谢谢您的帮助。我试着从有效负载数据中读取正确的字节,就像它们在链接的线程中所做的一样。好消息是,名称总是从字节54开始,所以我知道udp.PayloadData[54]是名称的开始。问题是,我不知道长度。你知道该怎么做吗?你看过了吗?是的,我看过了,还知道怎么计算长度。我有以下代码:
if(udp!=null&&udp.HasPayloadData&&udp.DestinationPort==53){nameLen=udp.PayloadData.Length-16;name=newbyte[nameLen];Array.Copy(udp.PayloadData,12,name,0,nameLen);Console.WriteLine(Encoding.ASCII.GetString(name));}
。唯一的问题是,在查询之前和之后经常有不合适的特殊字符。除了圆点,还有特殊的字符