我创建了一个简单的基于RAW套接字的数据包嗅探器。但是当我运行它时,它很少捕获数据包。首先我创建了这个以1秒的时间间隔捕获数据包,但看不到捕获的数据包,我评论了该行。我连接到互联网,很多http流量都在这里和那里,但我无法捕获一个。在我创建套接字的代码中是否存在问题?请有人给我一个解决方案。我是python编程的新手,无法理解如何解决这个问题。
import socket, binascii, struct
import time
sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x800))
print "Waiting.."
pkt = sock.recv(2048)
print "received"
def processEth(data):
#some code to process source mac and dest. mac
return [smac, dmac]
def processIP(data):
sip = str(binascii.hexlify(data[1]))
dip = str(binascii.hexlify(data[2]))
return [sip, dip]
def processTCP(data):
sport = str(data[0])
dport = str(data[1])
return [sport, dport]
while len(pkt) > 0 :
if(len(pkt)) > 54:
pkt = sock.recv(2048)
ethHeader = pkt[0][0:14]
ipHeader = pkt[0][14:34]
tcpHeader = pkt[0][34:54]
ethH = struct.unpack("!6s6s2s",ethHeader)
ethdata = processEth(ethH)
ipH = struct.unpack("!12s4s4s",ipHeader)
ipdata = processIP(ipH)
tcpH = struct.unpack("!HH16", tcpHeader)
tcpdata = processTCP(tcpH)
print "S.mac "+ethdata[0]+" D.mac "+ethdata[1]+" from: "+ipdata[0]+":"+tcpdata[0]+" to: "+ipdata[1]+":"+tcpdata[1]
#time.sleep(1);
else:
continue
答案 0 :(得分:3)
如果您显示了所有代码,那么您将遇到无限循环。 每当一个paket进入的长度不超过54个字节时,你最终会一直读取相同的数据包。
此外,socket.recv()返回一个字符串/字节序列;您访问数据的方法是错误的。 pkt [0]返回长度为1的字符串; pkt [0] [x:y]不会返回有用的东西。
我不熟悉使用套接字,但是通过一些更改,我得到的输出可能看起来与您的预期类似(我认为在processEth()中缺少某些东西......)。
[...]
while len(pkt) > 0:
print "Waiting.."
pkt = sock.recv(2048)
print "received"
if(len(pkt)) > 54:
ethHeader = pkt[0:14]
ipHeader = pkt[14:34]
tcpHeader = pkt[34:38]
ethH = struct.unpack("!6s6s2s",ethHeader)
ethdata = processEth(ethH)
ipH = struct.unpack("!12s4s4s",ipHeader)
ipdata = processIP(ipH)
tcpH = struct.unpack("!HH16", tcpHeader)
tcpdata = processTCP(tcpH)
print "S.mac "+ethdata[0]+" D.mac "+ethdata[1]+" from: "+ipdata[0]+":"+tcpdata[0]+" to: "+ipdata[1]+":"+tcpdata[1]
#time.sleep(1);
else:
continue