如何将[Raw].加载字符串转换为DNS层?(使用python和scapy)

如何将[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的地址和

我有一个学校项目,其中我需要创建一个DNS服务器。 (我只能使用scapy,没有其他libs。我有python 2.7 32位,我使用有线以太网电缆)。 如果我的数据库中有请求的域名,我只会将其发送回我的客户。 如果没有,我需要询问8.8.8.8(或其他服务器),然后将响应发送到客户端,然后将响应存储在缓存中。发送答案效果很好,但存储信息是个问题。 8.8.8.8的应答包通过以下方式发送给我:
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)