gpt4 book ai didi

python - Windows 上 Python 3.6 中的原始套接字数据包嗅探器

转载 作者:可可西里 更新时间:2023-11-01 11:24:48 29 4
gpt4 key购买 nike

我正在尝试嗅探数据包,但我得到了奇怪的输出,我不明白原因..
这就是我的代码帮助我
(我在 Windows 8.1 上使用 Python 3.6)

代码:

import socket
import struct
import binascii
import textwrap

def main():
# Get host
host = socket.gethostbyname(socket.gethostname())
print('IP: {}'.format(host))

# Create a raw socket and bind it
conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
conn.bind((host, 0))

# Include IP headers
conn.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
# Enable promiscuous mode
conn.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

while True:
# Recive data
raw_data, addr = conn.recvfrom(65536)

# Unpack data
dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)

print('\nEthernet Frame:')
print("Destination MAC: {}".format(dest_mac))
print("Source MAC: {}".format(src_mac))
print("Protocol: {}".format(eth_proto))

# Unpack ethernet frame
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('!6s6s2s', data[:14])
return get_mac_addr(dest_mac), get_mac_addr(src_mac), get_protocol(proto), data[14:]

# Return formatted MAC address AA:BB:CC:DD:EE:FF
def get_mac_addr(bytes_addr):
bytes_str = map('{:02x}'.format, bytes_addr)
mac_address = ':'.join(bytes_str).upper()
return mac_address

# Return formatted protocol ABCD
def get_protocol(bytes_proto):
bytes_str = map('{:02x}'.format, bytes_proto)
protocol = ''.join(bytes_str).upper()
return protocol

main()

从这段代码我得到这个输出:

IP: 192.168.1.12

以太网帧:
目标 MAC:45:00:00:43:00:00
源MAC:40:00:2C:11:48:D3
协议(protocol):4266

以太网帧:
目标 MAC:45:00:00:42:11:E7
源MAC:00:00:80:11:00:00
协议(protocol):C0A8

以太网帧:
目标 MAC:45:00:00:33:04:D6
源MAC:00:00:80:11:00:00
协议(protocol):C0A8

.
.
.

根据 EtherType list此协议(protocol)不存在并使用 Wireshark 分析我的流量我确定我的 LAN 中不存在此 MAC

所以我肯定做错了什么,但我不明白是什么
提前致谢

最佳答案

好的,感谢selbi 我明白了问题,非常感谢
但是要在 Windows 中使用 Python 捕获以太网 header ,您必须使用:

1。 PyPCap

2。打包

  • 要安装 dpkt,只需以管理员身份打开 cmd 并输入:

    py -2 -m pip install dpkt

此处引用 Python Docs

3。 Python 2.7

但是你需要安装Python 3.4>才能获取pip

最后是代码:

#!/usr/bin/env python

import getopt, sys
import dpkt, pcap
import socket
import struct
import binascii
import textwrap

def main():
# Get host
host = socket.gethostbyname(socket.gethostname())
print('IP: {}'.format(host))

name = None
pc = pcap.pcap(name)
decode = { pcap.DLT_LOOP:dpkt.loopback.Loopback,
pcap.DLT_NULL:dpkt.loopback.Loopback,
pcap.DLT_EN10MB:dpkt.ethernet.Ethernet }[pc.datalink()]
try:
print 'listening on %s: %s' % (pc.name, pc.filter)
for ts, pkt in pc:
pkt = str(decode(pkt))
dest_mac, src_mac, eth_proto, data = ethernet_frame(pkt)

print '\nEthernet Frame:'
print "Destination MAC: {}".format(dest_mac)
print "Source: {}".format(src_mac)
print "Protocol: {}".format(eth_proto)
except KeyboardInterrupt:
nrecv, ndrop, nifdrop = pc.stats()
print '\n%d packets received by filter' % nrecv
print '%d packets dropped by kernel' % ndrop

# Unpack ethernet frame
def ethernet_frame(data):
dest_mac, src_mac, proto = struct.unpack('!6s6s2s', data[:14])
return binascii.hexlify(dest_mac), binascii.hexlify(src_mac), binascii.hexlify(proto), data[14:]

if __name__ == '__main__':
main()

输出:

以太网帧:
目标 MAC:5404a6f2740c <- 我的 NIC MAC
来源:6459f81dc690
协议(protocol):0800 <- 正确的协议(protocol)

以太网帧:
目的MAC:6459f81dc690
来源:5404a6f2740c
协议(protocol):0800

以太网帧:
目的MAC:5404a6f2740c
来源:6459f81dc690
协议(protocol):0800

希望你喜欢再次感谢selbie

(对不起,由于我的声誉,我不能添加更多链接)

关于python - Windows 上 Python 3.6 中的原始套接字数据包嗅探器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41565505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com