2013-10-19 66 views
2

我正致力於將這一小段Python代碼調整爲我自己的用途(它來自sendpkm DNS欺騙工具,用於將原始神奇寶貝DS遊戲的DNS請求重定向到自己的計算機)需要了解這塊Python

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。

回答

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返回一個元組(數據,地址),所以你將r [0]發送到服務器,並將響應發送到r [1]。 (這個部分用tuple解包可讀性更好:data, address = recvfrom(...)。然後你可以用名字代替r [0]。)

+0

謝謝!這個解釋幫助我極大地理解了代碼。 所以 –

+0

現在我需要弄清楚的是如何操作這段代碼來發送特定地址的特定IP。我想我必須對代碼做更多的更改才能做到這一點,但感謝您幫助我處理與套接字相關的代碼。 –

+0

@AustinBurk:你的意思是你必須寫一個DNS代理而不是原始字節代理?您可能需要考慮使用預製的DNS服務器,而不是自己寫。 – abarnert