Ticket #130: tcp-dns-layer.patch

File tcp-dns-layer.patch, 1.9 kB (added by Dinko Korunic <dinko.korunic@gmail.com>, 4 months ago)

TCP DNS layer patch

  • a/scapy/layers/dns.py

    old new  
    88from scapy.packet import * 
    99from scapy.fields import * 
    1010from scapy.ansmachine import * 
    11 from scapy.layers.inet import UDP 
     11from scapy.layers.inet import UDP,TCP 
    1212 
    1313class DNSStrField(StrField): 
    1414    def i2m(self, pkt, x): 
     
    188188 
    189189class DNS(Packet): 
    190190    name = "DNS" 
    191     fields_desc = [ ShortField("id",0), 
     191    fields_desc = [ ConditionalField(ShortField("length", None), lambda pkt:isinstance(pkt.underlayer, TCP)), 
     192                    ShortField("id",0), 
    192193                    BitField("qr",0, 1), 
    193194                    BitEnumField("opcode", 0, 4, {0:"QUERY",1:"IQUERY",2:"STATUS"}), 
    194195                    BitField("aa", 0, 1), 
     
    205206                    DNSRRField("an", "ancount"), 
    206207                    DNSRRField("ns", "nscount"), 
    207208                    DNSRRField("ar", "arcount",0) ] 
     209    def post_build(self, p, pay): 
     210        if isinstance(self.underlayer, TCP) and self.length is None: 
     211            l = len(p) - 2 
     212            p = struct.pack("!H", l) + p[2:] 
     213        return p + pay 
     214 
    208215    def answers(self, other): 
    209216        return (isinstance(other, DNS) 
    210217                and self.id == other.id 
     
    224231                name = ' "%s"' % self.qd.qname 
    225232        return 'DNS %s%s ' % (type, name) 
    226233 
     234 
    227235dnstypes = { 0:"ANY", 255:"ALL", 
    228236             1:"A", 2:"NS", 3:"MD", 4:"MD", 5:"CNAME", 6:"SOA", 7: "MB", 8:"MG", 
    229237             9:"MR",10:"NULL",11:"WKS",12:"PTR",13:"HINFO",14:"MINFO",15:"MX",16:"TXT", 
     
    255263 
    256264bind_layers( UDP,           DNS,           dport=53) 
    257265bind_layers( UDP,           DNS,           sport=53) 
     266bind_layers( TCP,           DNS,           dport=53) 
     267bind_layers( TCP,           DNS,           sport=53) 
    258268 
    259269 
    260270@conf.commands.register