2

我正在努力调整这段 Python 代码以适应我自己的使用(它来自 sendpkm DNS 欺骗工具,用于将原始 Pokémon DS 游戏的 DNS 请求重定向到自己的计算机。)

def dnsspoof():
  s=socket.socket(); s.connect(("bash.org",80));
  me="".join(chr(int(x)) for x in s.getsockname()[0].split("."))
  print "Please set your DS's DNS server to",s.getsockname()[0]
  dnsserv=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  dnsserv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  dnsserv.bind(("0.0.0.0",53))
  while True:
    r=dnsserv.recvfrom(512)
    s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(('4.2.2.2', 53))
s.send(r[0])
rr=s.recv(512)
if "gamestats2" in rr: rr=rr[:-4]+me
dnsserv.sendto(rr, r[1])

serv=None
log=None

有人会这么好心地引导我通过套接字并解释这是如何为 DNS 查询返回 IP 的吗?我只是在学习Python。

4

1 回答 1

3

端口 53 是标准的 DNS 端口。但是除了这个数字之外,这段代码对 DNS 没有任何了解。它所做的只是侦听端口 53,将任何请求转发到 4.2.2.2 的服务器,然后返回该服务器返回的任何内容。

换句话说,它是端口 53 上的哑字节代理,因为远程服务器是 DNS 服务器,所以它可以工作。

如果你想知道它是如何工作的:

dnsserv=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
dnsserv.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
dnsserv.bind(("0.0.0.0",53))

这是创建用于侦听端口的套接字的标准代码。您正在监听 UDP,因为这就是 INET/DGRAM 的意思。setsockopt 意味着如果您退出并重新启动服务器,它将能够再次获取相同的端口。绑定说要监听端口 53 上的所有 IPv4 地址。

循环读取最多 512 字节的数据包,连接到远程服务器并发送相同的数据包,读取服务器的响应,并将其发送回客户端。因为 recvfrom 返回一个 (data, address) 的元组,所以您将 r[0] 发送到服务器,并将响应发送到 r[1]。(这部分使用元组解包会更具可读性:data, address = recvfrom(...). 然后你可以使用名称而不是 r[0]。)

于 2013-10-19T23:43:23.260 回答