我最近正在阅读一些信息安全和编程内容,我遇到了原始套接字。我对于创建原始套接字并正确捕获数据包的方式感到困惑。
方法I)用AF_INET创建套接字
sock=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_*)
##IPPROTO_* can be IPPROTO_IP/IPPROTO_TCP/IPPROTO_UDP
raw_data=sock.recvfrom(65535)
但是使用这种方法我能够捕获数据包但是当我试图解码它时,我无法理解。
方法II)
sock=socket.socket(socket.AF_PACKET,socket.SOCK_RAW,socket.htons(0x0800))
raw_data=socket.recvfrom(65535)
通过使用第二种方法,我能够捕获并解码它。
仅供参考我正在尝试解码来自以太网的数据包。
所以我的问题是为什么方法我失败了?还有另一种方法在python中创建原始套接字。
先谢谢了。
答案 0 :(得分:0)
如果要创建无协议的原始套接字,请使用:socket(AF_PACKET, SOCK_RAW)
;
示例:
#!/usr/bin/env python
from socket import socket, AF_PACKET, SOCK_RAW
s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth1", 0))
# We're putting together an ethernet frame here,
# but you could have anything you want instead
# Have a look at the 'struct' module for more
# flexible packing/unpacking of binary data
# and 'binascii' for 32 bit CRC
src_addr = "\x01\x02\x03\x04\x05\x06"
dst_addr = "\x01\x02\x03\x04\x05\x06"
payload = ("["*30)+"PAYLOAD"+("]"*30)
checksum = "\x1a\x2b\x3c\x4d"
ethertype = "\x08\x01"
s.send(dst_addr+src_addr+ethertype+payload+checksum)
的所有学分