簡體   English   中英

使用python嗅探網絡數據包

[英]sniffing network packets using python

#!/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'的長度是2個字符(或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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM