PyVMProtect does not package, bundle, or merely obfuscate your code. We compile your logic into a custom, non-standard instruction set executed by a proprietary runtime environment.
From plaintext source to native binary in three deterministic stages.
Click to walk through each stage
Every string constant is replaced with encrypted ciphertext using a per-build key before anything else happens. Your API keys and endpoints are gone from this point forward. They only exist in memory for the exact moment they're needed.
Click 'New Build' to generate a new opcode mapping. The same Python instruction gets a different number every time.
A disassembler written for Build A produces garbage on Build B. Reversing this isn't hard. It's pointless.
| Instruction | Build A | Build B |
|---|---|---|
| LOAD_FAST | 0x4F | 0xA2 |
| STORE_FAST | 0x12 | 0x7E |
| CALL_FUNCTION | 0x8B | 0x31 |
| JUMP_ABSOLUTE | 0x3C | 0xC4 |
| LOAD_CONST | 0xD1 | 0x58 |
| RETURN_VALUE | 0x07 | 0xF9 |
We destroy linear execution. Reverse engineers see a labyrinth instead of an algorithm.
Protection that monitors the process memory while the code executes.
Checks for attached debuggers continuously
Hashes .text section, detects any patch
Validates CPU + disk serial at startup
Secrets exist in memory for <1ms
CRC32 checks on code pages every few ms
Detects foreign DLLs and remote threads
Measured on Python 3.13 / Windows x64. Each fixture is run 5 times; figures below are medians. Overhead = compiled time vs. plain CPython work time, both measured as subprocess wallclock minus the Python startup baseline.
| Fixture | .pyd size | CPython | Compiled | Overhead | Cold start |
|---|---|---|---|---|---|
| Mixed (business logic + JSON + ctypes) | 269 KB | 563 ms | 1,182 ms | +110% | 18 ms |
| Windows API (ctypes round-trips) | 268 KB | 442 ms | 1,215 ms | +175% | 14 ms |
| Strings (tokenize, dict, sort, hash) | 268 KB | 421 ms | 1,846 ms | +339% | 11 ms |
| Compute (mandelbrot, primes, matmul) : hot loops excluded | 268 KB | 406 ms | 404 ms | ~0% | 5 ms |
Overhead measured with AST mutation and bytecode mutation active, anti-debug probes disabled to avoid timing interference. C extensions (NumPy, Pandas, SciPy) are never virtualized and run at native speed. The "1.1–1.8×" figure applies to the Mixed fixture only; exclude compute-heavy loops via @vm_skip or the Cython hot-path to keep those at native speed.
| Feature | Status |
|---|---|
async / await |
Not supported |
Generators (yield) |
Not supported |
Context managers (with) |
Not supported |
| macOS / Linux targets | Not supported — on the roadmap |
| Free-threaded Python 3.13t (no-GIL) | Not supported — deferred |
Code-signed .pyd output |
Not supported — planned before GA |
| Hardware HWID lock | Coming Q3 2026 |
Upload a .py file and get back a protected .pyd in under 90 seconds. Free during beta. No credit card.