PyWFP
PyWFP is a Python interface for working with Windows Filtering Platform (WFP), allowing creation of network traffic filters using a similar Windivert-style syntax.
Note: PyWFP requires administrator privileges to run. Running without admin rights will result in a
WFPErrorwith code0x00000005(Access Denied).
Installation
pip install pywfp
Usage
from pywfp import PyWFP
from pprint import pprint
def main():
# Create PyWFP instance
pywfp = PyWFP()
# Example filter string
filter_string = (
"outbound and tcp and remoteaddr == 192.168.1.3-192.168.1.4 " "and tcp.dstport == 8123 and action == block"
)
try:
# Use context manager to handle WFP engine session
with pywfp.session():
# Add the filter
filter_name = "PyWFP Block Filter"
pywfp.add_filter(filter_string, filter_name=filter_name, weight=1000)
# List existing filters
filters = pywfp.list_filters()
print(f"Found {len(filters)} WFP filters")
# Find our specific filter
if filter := pywfp.get_filter(filter_name):
print(f"Found filter: {filter}")
pprint(filter)
# Keep the filter active until interrupted
print("Press Ctrl+C to exit and remove the filter")
try:
while True:
input()
except KeyboardInterrupt:
print("Received Ctrl+C, cleaning up")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
main()
Supported Filters
PyWFP supports a variety of filter conditions that can be combined using logical AND operations. Here are the supported filter types:
Basic Filter Syntax
"outbound and tcp and remoteaddr == 192.168.1.3-192.168.1.4 and tcp.dstport == 8123 and action == allow"
Supported Conditions
| Field | Description | Example Values |
|---|---|---|
| inbound/outbound | Direction of traffic | inbound, outbound |
| tcp/udp/icmp | Protocol type | tcp, udp, icmp |
| remoteaddr | Remote IP address (supports ranges) | 192.168.1.1, 10.0.0.1-10.0.0.255 |
| localaddr | Local IP address (supports ranges) | 127.0.0.1, 192.168.1.1-192.168.1.255 |
| tcp.dstport | TCP destination port | 80, 443 |
| tcp.srcport | TCP source port | 5000, 8080 |
| udp.dstport | UDP destination port | 53, 123 |
| udp.srcport | UDP source port | 5000, 8080 |
| action | Filter action (allow/block) | allow, block |
IP Address Ranges
You can specify IP ranges using hyphen notation:
"remoteaddr == 192.168.1.1-192.168.1.255"
Multiple Conditions
Combine conditions using AND:
"outbound and tcp and remoteaddr == 192.168.1.1 and tcp.dstport == 80"
Filter Management
# You can set the weight of the filter to determine its priority. If weight is not specified, the highest priority will be given.
pywfp.add_filter("inbound and udp", filter_name="Block UDP", weight=500)
# List all filters
for filter in pywfp.list_filters():
print(filter["name"])
)
# Maybe more to be added here
Testing
Unit Tests
Run unit tests with:
pytest -m "not integration"
Integration Tests
Integration tests require:
- Windows OS
- Administrator privileges
- Local network access
To run integration tests locally:
# Open an administrator command prompt
pytest -m integration
Metadata
Release files for pywfp 0.1.42
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pywfp-0.1.42.tar.gz | 18.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pywfp-0.1.42-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.3 kB
Release files / pywfp-0.1.42.tar.gz
| Download URL | pywfp-0.1.42.tar.gz |
|---|---|
| Size | 18.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
46afcd562037bfdf035322f538fcb79143aacf02d7cb397acd67078b5fabca93
|
|
BLAKE2b-256 checksum How to use checksums |
bce4ae5f369e67c97bf7c586f8510fdae1b3a046eb787dbb66762f030eb11721
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 3, 2025.
Transparency logRelease files / pywfp-0.1.42-py3-none-any.whl
| Download URL | pywfp-0.1.42-py3-none-any.whl |
|---|---|
| Size | 16.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6c22722ea246b0bcb19c8ef42e1afa33045172555d856087a94b288cc09f336d
|
|
BLAKE2b-256 checksum How to use checksums |
19f42101a0ac3c47db64cf51f4904b7d9c980faa034dcac68f29700f0149a3a9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 3, 2025.
Transparency log