Skip to main content

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/bpf0 if it's open and listening, so make sure to use /dev/bpf1 in 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

rawsock-0.0.1.tar.gz (5.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rawsock-0.0.1-py3-none-any.whl (6.5 kB view details)

Uploaded Python 3

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

Hashes for rawsock-0.0.1.tar.gz
Algorithm Hash digest
SHA256 b92d5b075b16e5da5933226f8c6e9ae477dc4e940e728bb3688b0bb760369a7b
MD5 91e592b5e94f175e276094f9bcb3a1fe
BLAKE2b-256 5973a5a8cf9abb3f07418e6b98dfb89285dc9de9334272f3405b04abb7a81cb6

See more details on using hashes here.

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

Hashes for rawsock-0.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cc676702ba03c9c187f468dc82173d864c1283ec19fb17a7d9afa297d62530cf
MD5 e112468fb99a38cf2b7b79bda0bb15c9
BLAKE2b-256 472a9e1db56351f1e554a7f11819525919690024f75445a42396ac87e8b9b888

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page