RetrieveBlob() public static method

A blob is a fully resolved name. Dns uses pointers to reduce memory consumption in packets, this can traverse all pointers and return a complete name. The blob starts a Start and Ends at End. This is used so that the parsing program knows where to continue reading data from.
public static RetrieveBlob ( MemBlock Data, int Start, int &End ) : MemBlock
Data MemBlock The entire packet to grab the blob from.
Start int The beginning of the blob.
End int Returned to the user and notes where the blob ends.
return MemBlock
Example #1
0
        /**
         * <summary>Creates a response given the entire packet.</summary>
         * <remarks>The entire packet must be given, because some name servers take
         * advantage of pointers to reduce their size.</remarks>
         * <param name="Data">The entire Dns packet.</param>
         * <param name="Start">The starting position of the Response.</param>
         */
        public Response(MemBlock Data, int Start)
        {
            int idx = 0;

            NameBlob = DnsPacket.RetrieveBlob(Data, Start, out idx);

            int type = (Data[idx++] << 8) + Data[idx++];

            Type = (DnsPacket.Types)type;

            CacheFlush = ((Data[idx] & 0x80) == 0x80) ? true : false;
            int rclass = ((Data[idx++] << 8) & 0x7F) + Data[idx++];

            Class = (DnsPacket.Classes)rclass;

            Ttl  = (Data[idx++] << 24);
            Ttl |= (Data[idx++] << 16);
            Ttl |= (Data[idx++] << 8);
            Ttl |= (Data[idx++]);

            RdLength  = (short)((Data[idx++] << 8) + Data[idx++]);
            RDataBlob = Data.Slice(idx, RdLength);

            if (Type == DnsPacket.Types.Ptr)
            {
                try {
                    Name = DnsPacket.PtrMemBlockToString(NameBlob);
                }
                catch {
                    Name = DnsPacket.HostnameMemBlockToString(NameBlob);
                }
                int End = 0;
                RDataBlob = DnsPacket.RetrieveBlob(Data, idx, out End);
                RData     = DnsPacket.HostnameMemBlockToString(RDataBlob);
            }
            else if (Type == DnsPacket.Types.A)
            {
                Name  = DnsPacket.HostnameMemBlockToString(NameBlob);
                RData = DnsPacket.IPMemBlockToString(RDataBlob);
            }
            _icpacket = _packet = Data.Slice(Start, idx + RdLength - Start);
        }
Example #2
0
        /**
         * <summary>Constructor when parsing a Dns Query</summary>
         * <param name="Data"> must pass in the entire packet from where the question
         * begins, after parsing, can check Data.Length to find where next
         * container begins.</param>
         */
        public Question(MemBlock Data, int Start)
        {
            int idx = 0;

            QNameBlob = DnsPacket.RetrieveBlob(Data, Start, out idx);
            int qtype = (Data[idx++] << 8) + Data[idx++];

            QType = (DnsPacket.Types)qtype;

            int qclass = (Data[idx++] << 8) + Data[idx];

            QClass = (DnsPacket.Classes)qclass;

            if (QType == DnsPacket.Types.A || QType == DnsPacket.Types.AAAA)
            {
                QName = DnsPacket.HostnameMemBlockToString(QNameBlob);
            }
            else if (QType == DnsPacket.Types.Ptr)
            {
                QName = DnsPacket.PtrMemBlockToString(QNameBlob);
            }

            _icpacket = _packet = Data.Slice(Start, idx + 1 - Start);
        }