【问题标题】:Need insight on this piece of Python需要深入了解这段 Python
【发布时间】:2013-10-19 23:26:17
【问题描述】:

我正在努力调整这段 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。

【问题讨论】:

    标签: python sockets dns recv


    【解决方案1】:

    端口 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]。)

    【讨论】:

    • 谢谢!这种解释极大地帮助了我理解代码。所以
    • 现在我需要弄清楚的是如何操纵此代码为特定地址发送特定 IP。我认为我必须对代码进行更多更改才能做到这一点,但感谢您帮助我编写与套接字相关的代码。
    • @AustinBurk:您的意思是您必须编写 DNS 代理而不是原始字节代理?您可能需要考虑使用预制的 DNS 服务器,而不是自己编写。
    • 如..?我希望它是便携的。
    • @AustinBurk:维基百科有一个comparison page 列出了几十个服务器。您可能更关心配置的简易性,而不是灵活性、容量、可靠性或安全性,因此您可能不想要“最好的”DNS 服务器(如果有的话——我怀疑要求一个会启动一个BIND 10、BIND 9、经典 BIND 和各种 djbdns 分叉的支持者之间的圣战……)。只需点击几个,看看它们是如何配置的,然后选择一个你理解的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多