a low level python implementation of a raw socket interface for sending Ethernet frames using Berkeley Packet Filters (BPF) on BSD based systems.
Project description
RawSocket
Overview
This repository contains a low level python implementation of a raw socket interface for sending Ethernet frames using Berkeley Packet Filters (BPF) on BSD based systems.
Prerequisites
Ensure you are running a Unix-based system (e.g., macOS, freeBSD, openBSD etc) that supports BPF devices (/dev/bpf*).
Installation
No additional dependencies are required. This module relies on Python's built-in os, struct, and fcntl modules.
Usage
Example Code
from rawsocket import RawSocket
# Create a RawSocket instance for network interface 'en0'
sock = RawSocket(b"en0")
# Construct an Ethernet frame with a broadcast destination MAC
frame = RawSocket.frame(
b'\xff\xff\xff\xff\xff\xff', # Destination MAC (broadcast)
b'\x6e\x87\x88\x4d\x99\x5f', # Source MAC
ethertype=b"\x88\xB5",
payload=b"test" # Custom payload
)
# Send the frame
success = sock.send(frame)
# to send an ARP request:
success = sock.send_arp(
source_mac="76:c9:1d:f1:27:04",
source_ip="192.168.178.85",
target_ip="192.168.178.22"
)
To receive incoming packets while sending:
sock = RawSocket("en0")
with sock.listener(5): # listen for 5 seconds
success = sock.send_arp(
source_mac="76:c9:1d:f1:27:04",
source_ip="192.168.178.85",
target_ip="192.168.178.22"
)
print(sock.captured_packets)
Apply custom filters to capture specific packets:
# the following code listens for ARP packets with the specified
# dest mac address and checks if the target ip is available in payload
# which means the device has responded with its mac address if its
# connected to the network
with sock.listener(6, filter_ = {"ethertype": b"\x08\x06", "destination_mac": "76:c9:1d:f1:27:04", "payload": [b"\xc0\xa8\xb2\x16",]}):
success = sock.send_arp(
source_mac="76:c9:1d:f1:27:04",
source_ip="192.168.178.85",
target_ip="192.168.178.22"
)
print(sock.captured_packets)
Methods
send(frame: bytes) -> int
Sends an Ethernet frame via the bound BPF device. Returns 1 on success, 0 on failure.
frame(dest_mac: bytes, source_mac: bytes, ethertype: bytes = b'\x88\xB5', payload: str | bytes) -> bytes
Constructs an Ethernet frame with the specified parameters.
send_arp(...)
A public method to send an ARP request.
Notes
- This code has been tested on macOS with python 3.13.
- The code assumes that at least one
/dev/bpf*device is available and not busy. - Packets may require root privileges to send. (on macOS you must run the script as root)
- Wireshark usually occupies the first found BPF device
/dev/bpf0if it's open and listening, so make sure to use/dev/bpf1in the script. - The system’s network interface must be in promiscuous mode to receive raw packets.
License
This code is licensed under the MIT License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rawsock-0.0.1.tar.gz.
File metadata
- Download URL: rawsock-0.0.1.tar.gz
- Upload date:
- Size: 5.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b92d5b075b16e5da5933226f8c6e9ae477dc4e940e728bb3688b0bb760369a7b
|
|
| MD5 |
91e592b5e94f175e276094f9bcb3a1fe
|
|
| BLAKE2b-256 |
5973a5a8cf9abb3f07418e6b98dfb89285dc9de9334272f3405b04abb7a81cb6
|
File details
Details for the file rawsock-0.0.1-py3-none-any.whl.
File metadata
- Download URL: rawsock-0.0.1-py3-none-any.whl
- Upload date:
- Size: 6.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cc676702ba03c9c187f468dc82173d864c1283ec19fb17a7d9afa297d62530cf
|
|
| MD5 |
e112468fb99a38cf2b7b79bda0bb15c9
|
|
| BLAKE2b-256 |
472a9e1db56351f1e554a7f11819525919690024f75445a42396ac87e8b9b888
|