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) |
|---|
-
a/scapy/layers/dns.py
old new 8 8 from scapy.packet import * 9 9 from scapy.fields import * 10 10 from scapy.ansmachine import * 11 from scapy.layers.inet import UDP 11 from scapy.layers.inet import UDP,TCP 12 12 13 13 class DNSStrField(StrField): 14 14 def i2m(self, pkt, x): … … 188 188 189 189 class DNS(Packet): 190 190 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), 192 193 BitField("qr",0, 1), 193 194 BitEnumField("opcode", 0, 4, {0:"QUERY",1:"IQUERY",2:"STATUS"}), 194 195 BitField("aa", 0, 1), … … 205 206 DNSRRField("an", "ancount"), 206 207 DNSRRField("ns", "nscount"), 207 208 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 208 215 def answers(self, other): 209 216 return (isinstance(other, DNS) 210 217 and self.id == other.id … … 224 231 name = ' "%s"' % self.qd.qname 225 232 return 'DNS %s%s ' % (type, name) 226 233 234 227 235 dnstypes = { 0:"ANY", 255:"ALL", 228 236 1:"A", 2:"NS", 3:"MD", 4:"MD", 5:"CNAME", 6:"SOA", 7: "MB", 8:"MG", 229 237 9:"MR",10:"NULL",11:"WKS",12:"PTR",13:"HINFO",14:"MINFO",15:"MX",16:"TXT", … … 255 263 256 264 bind_layers( UDP, DNS, dport=53) 257 265 bind_layers( UDP, DNS, sport=53) 266 bind_layers( TCP, DNS, dport=53) 267 bind_layers( TCP, DNS, sport=53) 258 268 259 269 260 270 @conf.commands.register