1. 程式人生 > >用python進行DNS查詢--(報文解析篇)

用python進行DNS查詢--(報文解析篇)

#-*-coding:utf-8-*-
import socket
def ana_head(q,n):
    list1 = []
    print u'包長度%d'%len(q)
    print u'標識為:%x%x'%(ord(q[0]),ord(q[1]))
    print u'報文引數為:%x%x'%(ord(q[2]),ord(q[3]))
    print u'問題數:%x%x'%(ord(q[4]),ord(q[5]))
    print u'應答數:%x%x'%(ord(q[6]),ord(q[7]))
    print u'授權機構數:%x%x'%(ord(q[8
]),ord(q[9])) print u'附加資訊數:%x%x'%(ord(q[10]),ord(q[11])) for i in range(n+1): nu = 12+i list1.append('%d'%ord(q[nu])) str1 = ''.join(list1) print u'查詢資訊為:%s'%str1 print u'查詢型別為:%x%x'%(ord(q[n+13]),ord(q[n+14])) print u'查詢類為:%x%x'%(ord(q[n+15]),ord(q[n+16])) def
ana_fin(c,x):
times = ord(c[7]) g = x+16 for i in range(times): print '*******************************************************' print u'指標:%x%x'%(ord(c[g+1]),ord(c[g+2])) print u'第%d個資源的響應型別:%x%x'%(i+1,ord(c[g+3]),ord(c[g+4])) print u'第%d個資源的響應類:%x%x'%(i+1
,ord(c[g+5]),ord(c[g+6])) print u'第%d個資源的生存時間:%d%d%d%d秒'%(i+1,ord(c[g+7]),ord(c[g+8]),ord(c[g+9]),ord(c[g+10])) print u'第%d個資源的資料長度:%x%x'%(i+1,ord(c[g+11]),ord(c[g+12])) print u'返回的IP地址:%d.%d.%d.%d'%(ord(c[g+13]),ord(c[g+14]),ord(c[g+15]),ord(c[g+16])) g+=16 print '-----------------------------------------------------' class dns(): def _init_(self): pass def coding(self,second,first,root): len_root = '%s'%chr(len(root)) l_root = len(root) len_first = '%s'%chr(len(first)) l_first = len(first) if second: len_second ='%s'%chr(len(second)) l_second = len(second) self.num = l_root+l_first+l_second+3 q = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00%s%s%s%s%s%s\x00\x00\x01\x00\x01'%(len_second,second,len_first,first,len_root,root) return q else: q = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00%s%s%s%s\x00\x00\x01\x00\x01'%(len_first,first,len_root,root) self.num = l_root+l_first+2 return q def send(self,q): sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) sock.sendto(q,('8.8.8.8',53)) sock_recv = sock.recv(4096) return sock_recv def info(self,q): flag = '%x%x'%(ord(q[2]),ord(q[3])) if flag == '10': print '-----------------------------------------------------' print u'此為查詢報文' ana_head(q,self.num) else: print '-----------------------------------------------------' print u'此為返回報文' ana_head(q,self.num) ana_fin(q,self.num)