如何将[Raw].加载字符串转换为DNS层?(使用python和scapy)
我有一个学校项目,其中我需要创建一个DNS服务器。 (我只能使用scapy,没有其他libs。我有python 2.7 32位,我使用有线以太网电缆)。 如果我的数据库中有请求的域名,我只会将其发送回我的客户。 如果没有,我需要询问8.8.8.8(或其他服务器),然后将响应发送到客户端,然后将响应存储在缓存中。发送答案效果很好,但存储信息是个问题。 8.8.8.8的应答包通过以下方式发送给我:如何将[Raw].加载字符串转换为DNS层?(使用python和scapy),python,dns,Python,Dns,我有一个学校项目,其中我需要创建一个DNS服务器。 (我只能使用scapy,没有其他libs。我有python 2.7 32位,我使用有线以太网电缆)。 如果我的数据库中有请求的域名,我只会将其发送回我的客户。 如果没有,我需要询问8.8.8.8(或其他服务器),然后将响应发送到客户端,然后将响应存储在缓存中。发送答案效果很好,但存储信息是个问题。 8.8.8.8的应答包通过以下方式发送给我:Ether()/IP()/UDP()/Raw()。为了将答案发送到客户端,我只需更改IP和UDP的地址和
Ether()/IP()/UDP()/Raw()
。为了将答案发送到客户端,我只需更改IP和UDP的地址和端口,然后只需发送它们上面的原始层,就可以了。但是,应答包的[Raw].负载是以我不理解的方式编码的(而且.decode('utf-8'/16/32)
不起作用)。
例如:
###[ Raw ]###
load = '\x007\x81\x80\x00\x01\x00\x02\x00\x00\x00\x00\x03www\x03aeo
\x03com\x00\x00\x01\x00\x01\xc0\x0c\x00\x01\x00\x01\x00\x00/\xab\x00\x04\xa5\xa0
\x0f\x14\xc0\x0c\x00\x01\x00\x01\x00\x00/\xab\x00\x04\xa5\xa0\r\x14'
我发现它可能是它的(str(answerpacket[DNS])版本,但当我尝试将它转换回[DNS](使用(DNS(answerpkt[Raw].load)
)时,它给了我以下错误:
File "C:\Python27\lib\site-packages\scapy\base_classes.py", line 198, in __cal
l__
i.__init__(*args, **kargs)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 80, in __init__
self.dissect(_pkt)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 575, in dissect
s = self.do_dissect(s)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 549, in do_dissect
s,fval = f.getfield(self, s)
File "C:\Python27\lib\site-packages\scapy\layers\dns.py", line 145, in getfiel
d
rr,p = self.decodeRR(name, s, p)
File "C:\Python27\lib\site-packages\scapy\layers\dns.py", line 123, in decodeR
R
rr = DNSRR("\x00"+ret+s[p:p+rdlen])
File "C:\Python27\lib\site-packages\scapy\base_classes.py", line 198, in __cal
l__
i.__init__(*args, **kargs)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 80, in __init__
self.dissect(_pkt)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 575, in dissect
s = self.do_dissect(s)
File "C:\Python27\lib\site-packages\scapy\packet.py", line 549, in do_dissect
s,fval = f.getfield(self, s)
File "C:\Python27\lib\site-packages\scapy\fields.py", line 509, in getfield
return s[l:], self.m2i(pkt,s[:l])
File "C:\Python27\lib\site-packages\scapy\layers\dns.py", line 177, in m2i
s = inet_ntop(family, s)
File "C:\Python27\lib\site-packages\scapy\pton_ntop.py", line 66, in inet_ntop
return inet_ntoa(addr)
NameError: global name 'inet_ntoa' is not defined
所以我的问题是-如何将“\x0x0”字符串转换为可以从中获取信息的DNS层?这看起来像是在Windows机器()上触发的scapy中的一个错误。不幸的是,该错误修复似乎不在最新版本的scapy中 该帖子中的建议是直接编辑scapy源代码。在您的情况下,编辑
C:\Python27\lib\site packages\scapy\pton\u ntop.py
,并将第66行更改为:
return inet_ntoa(addr)
致:
return socket.inet_ntoa(addr)