A simple differential fuzzing framework
Project description
DFF Python Implementation
A Python implementation of the DFF (Differential Fuzzing Framework) that uses Unix domain sockets and System V shared memory for high-performance IPC.
Installation
pip install dff-py
Requirements
- Python 3.9 or higher
- Linux or macOS
Linux
sudo sysctl -w kernel.shmmax=104857600
sudo sysctl -w kernel.shmall=256000
macOS
sudo sysctl -w kern.sysv.shmmax=104857600
sudo sysctl -w kern.sysv.shmall=256000
Usage
Example Client
import sys
import hashlib
from pathlib import Path
from dff import Client
def process_sha(method: str, inputs: list[bytes]) -> bytes:
"""Process function for SHA256 hashing.
Args:
method: The fuzzing method (should be "sha")
inputs: List of byte arrays to hash
Returns:
SHA256 hash of the first input
Raises:
ValueError: If method is not "sha" or no inputs provided
"""
if method != "sha":
raise ValueError(f"Unknown method: {method}")
if not inputs:
raise ValueError("No inputs provided")
return hashlib.sha256(inputs[0]).digest()
def main() -> None:
"""Main entry point."""
client = Client("python", process_sha)
try:
client.connect()
client.run()
except KeyboardInterrupt:
print("\nShutdown requested")
except Exception as e:
print(f"Error: {e}", file=sys.stderr)
sys.exit(1)
finally:
client.close()
if __name__ == "__main__":
main()
Example Server
import sys
import random
from pathlib import Path
from dff import Server
def data_provider() -> list[bytes]:
"""Generate random data for fuzzing.
Returns:
List containing a single random byte array
"""
MIN_SIZE = 1 * 1024 * 1024 # 1 MB
MAX_SIZE = 4 * 1024 * 1024 # 4 MB
# Use a deterministic seed that increments
if not hasattr(data_provider, "seed_counter"):
data_provider.seed_counter = 1
seed = data_provider.seed_counter
data_provider.seed_counter += 1
# Generate random data with deterministic seed
random.seed(seed)
size = random.randint(MIN_SIZE, MAX_SIZE)
data = random.randbytes(size)
return [data]
def main() -> None:
"""Main entry point."""
server = Server("sha")
try:
server.run(data_provider)
except KeyboardInterrupt:
print("\nShutdown requested")
except Exception as e:
print(f"Server error: {e}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
dff_py-0.1.5.tar.gz
(8.9 kB
view details)
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 dff_py-0.1.5.tar.gz.
File metadata
- Download URL: dff_py-0.1.5.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76800d416e555541b4e11688d13cc8d95b3752407f2eb14e5f75b9235fa99ef9
|
|
| MD5 |
ae1612bcc73f44e3991e1e8037ec5d9f
|
|
| BLAKE2b-256 |
3d9866dd995184bb8fd67f9358823819961f9bcc3c4d801ecf7ef5a9f7251fb5
|
File details
Details for the file dff_py-0.1.5-py3-none-any.whl.
File metadata
- Download URL: dff_py-0.1.5-py3-none-any.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7d0dc51cd414180f0c98379381639c6181c9d35ec79687029af39d08b56248b4
|
|
| MD5 |
7ad9bc9d89d2c66b3e892258fda5ced4
|
|
| BLAKE2b-256 |
ca09ada85fba46923ed95a203e9854f0133cdde35226f02e3828fe5f09a3e367
|