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.9.tar.gz
(9.6 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
dff_py-0.1.9-py3-none-any.whl
(10.2 kB
view details)
File details
Details for the file dff_py-0.1.9.tar.gz.
File metadata
- Download URL: dff_py-0.1.9.tar.gz
- Upload date:
- Size: 9.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e871633f82cdd633896b908546e49bf4e46c097fb073af2206684b3e857aa93
|
|
| MD5 |
7337db514bd0fe9a17f73e2e98b15bdf
|
|
| BLAKE2b-256 |
72180fb32f636bfe6292373efdbe84f1766fa5b29b42ad2c90fd453ef975489b
|
File details
Details for the file dff_py-0.1.9-py3-none-any.whl.
File metadata
- Download URL: dff_py-0.1.9-py3-none-any.whl
- Upload date:
- Size: 10.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
faf65160707aa2bf5b92c967a92199c64dd9f794245e65eb225f9ea94be31a4f
|
|
| MD5 |
50b6a5a4d4aea6bebabbfbcfa84e8f1d
|
|
| BLAKE2b-256 |
4bc0e860354c8d116cde92c282e048643641450fedfe6bd5c41f0c2a408a624a
|