#!/usr/bin/env python
import struct
import sys,os
import socket
import binascii
rawSocket=socket.socket(socket.PF_PACKET,socket.SOCK_RAW,socket.htons(0x0800))
#ifconfig eth0 promisc up
receivedPacket=rawSocket.recv(2048)
#Ethernet Header...
ethernetHeader=receivedPacket[0:14]
ethrheader=struct.unpack("!6s6s2s",ethernetHeader)
destinationIP= binascii.hexlify(ethrheader[0])
sourceIP= binascii.hexlify(ethrheader[1])
protocol= binascii.hexlify(ethrheader[2])
print "Destination: " + destinationIP
print "Source: " + sourceIP
print "Protocol: "+ protocol
#IP Header...
ipHeader=receivedPacket[14:34]
ipHdr=struct.unpack("!12s4s4s",ipHeader)
destinationIP=socket.inet_ntoa(ipHdr[2])
sourceIP=socket.inet_ntoa(ipHdr[1])
print "Source IP: " +sourceIP
print "Destination IP: "+destinationIP
#TCP Header...
tcpHeader=receivedPacket[34:54]
tcpHdr=struct.unpack("!2s2s16s",tcpHeader)
sourcePort=socket.inet_ntoa(tcpHdr[0])
destinationPort=socket.inet_ntoa(tcpHdr[1])
print "Source Port: " + sourcePort
print "Destination Port: " + destinationPort
我正在尝试捕获数据包,并且有端口和IP地址MAC添加的标头,但是我收到此错误。查找端口地址时出错在 TCP 标头部分中有一个错误
Traceback (most recent call last):
File "sniff.py", line 33, in <module>
sourcePort=socket.inet_ntoa(tcpHdr[0])
socket.error: packed IP wrong length for inet_ntoa
看看这里的输出:
x = struct.pack('!2s2s16s', '12', '34', '5678901234567890')
tcpHdr=struct.unpack("!2s2s16s", x)
print tcpHdr
print tcpHdr[0]
--output:--
('12', '34', '5678901234567890')
12
现在阅读以下内容:
插座。inet_ntoa(packed_ip)
转换 32 位打包的 IPv4 地址(一个字符串,其中有四个字符 长度) ... ... 如果传递给此函数的字符串长度不正好为 4 个字节,则会引发 socket.error。
https://docs.python.org/2.7/library/socket.html#socket.inet_ntoa
但是你已经写过:
sourcePort=socket.inet_ntoa(tcpHdr[0])
。而tcpHdr[0]等于'12'。 问题是"12"不是 4 个字符(或 32 位)长,而是"12"是两个字符(或 16 位)长。
现在,看看如果你这样做会发生什么:
import struct
import socket
x = struct.pack('!4s4s12s', '1234', '5678', '901234567890')
tcpHdr=struct.unpack("!4s4s12s", x)
print tcpHdr
print tcpHdr[0]
print socket.inet_ntoa(tcpHdr[0]) #===> NO ERROR
--output:--
('1234', '5678', '901234567890')
1234
49.50.51.52