import socket import sqlite3 nameserver="bkz.kdt.moe" def setbit(number, index): number |= (1< 4 bytes packet+="".join(map(lambda x: chr(int(x)), ip.split('.'))) # 4bytes of IP if (qtype=="NS"): domain = self.getDomain() namesrv = ns.getNS(domain[:-1]) if (domain=="0.0.0.0"): packet+=self.data[:2] + "\x81\x83" # We need return original query's ID + NXDOMAIN else: packet+=self.data[:2] + "\x85\x80" # We need return original query's ID + requested domain's IP packet+=self.data[4:6] + self.data[4:6] + '\x00\x00\x00\x01' # Count of queries, answers, ns servers, additional records packet+=self.data[12:] # Original Domain Name Request packet+='\xc0\x0c' # Pointer to domain name block start packet+='\x00\x02\x00\x01\x00\x00\x00\x3c\x00'+chr(len(namesrv)) # Response type, ttl and resource data length -> 4 bytes packet+="".join(map(lambda x:chr(len(x))+x, namesrv.split(".")))+'\x00' # 4bytes of IP print ' Answer: '+domain+' -> '+ip print "["+" ".join("{:02x}".format(ord(c)) for c in packet)+"]" return packet udps = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udps.bind(('',53)) ns=NameStoarge('dns.sqlite') try: while 1: qData, clAddr = udps.recvfrom(1024) print "New request from ",clAddr[0] dnsq=DNSQuery(qData) udps.sendto(dnsq.answer(dnsq.getQueryType()), clAddr) except KeyboardInterrupt: udps.close()