Advanced Virtual Machine with Custom Instruction Set and Multi-Layer Security
Project description
CustomVM
Advanced Virtual Machine with Custom Instruction Set and Multi-Layer Security
Developer: MERO:TG@QP4RM
Overview
CustomVM is a production-grade Python library that implements a fully custom virtual machine with proprietary instruction set, binary format, and runtime decryption. The VM features stack-based execution, virtual registers, custom opcodes, and comprehensive anti-analysis protections.
Architecture
Core Components
Virtual Machine Engine
- Stack-based execution model
- 16 virtual registers
- 64KB virtual memory
- Custom instruction pointer
- Flag register (zero, carry, negative)
- Call stack for function management
Custom Instruction Set
- 60+ unique opcodes
- Context-aware instruction encoding
- Dynamic opcode mapping
- Dummy instructions for obfuscation
- Instruction folding capabilities
- Fake execution paths
Binary Format
- Custom file format (.cvm)
- Magic header: CVMX
- Version control
- Multiple sections (code, constants, data)
- Encrypted opcode streams
- Integrity checksums
Security Features
- Runtime-only decryption
- Dynamic key derivation
- Multi-layer obfuscation
- Anti-debug checks
- Anti-dump protection
- Timing noise injection
- Integrity validation
- Self-verification
Installation
cd CustomVM
pip install -e .
Quick Start
Building Bytecode
from customvm import VMBuilder
builder = VMBuilder()
builder.push_imm(10)
builder.push_imm(20)
builder.add()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('program.cvm')
Executing Bytecode
from customvm import BytecodeLoader, VirtualMachine
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('program.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
result = vm.execute()
CLI Tools
CustomVM includes 4 powerful command-line tools for easy bytecode management:
cvmbuild - Build CVM Bytecode
Convert Python scripts to encrypted CVM bytecode:
python -m customvm.cli_build script.py
python -m customvm.cli_build script.py output.cvm
cvmrun - Execute CVM Files
Run CVM bytecode directly:
python -m customvm.cli_run program.cvm
cvmstandalone - Create Executables
Build standalone executables (no Python required):
python -m customvm.cli_standalone program.cvm
python -m customvm.cli_standalone program.cvm myapp
Requires: pip install pyinstaller
cvmbatch - Batch Conversion
Convert multiple files at once:
python -m customvm.cli_batch ./scripts
python -m customvm.cli_batch ./scripts ./output
Complete Workflow Example
# 1. Create VM script
cat > myapp.py << 'EOF'
builder.push_imm(42)
builder.push_imm(1)
builder.syscall()
builder.halt()
EOF
# 2. Build to CVM
python -m customvm.cli_build myapp.py
# 3. Test execution
python -m customvm.cli_run myapp.cvm
# 4. Create standalone executable
python -m customvm.cli_standalone myapp.cvm
# 5. Run standalone (no Python needed!)
./dist/myapp.exe
Platform Support:
- ✅ Windows (creates .exe)
- ✅ Linux (creates binary)
- ✅ Android/Termux (ARM binaries)
- ✅ macOS (creates .app)
License
MIT License - See LICENSE file for details.
Support
For technical support and inquiries, contact: mero@ps.com
Developer: MERO:TG@QP4RM
GitHub: https://github.com/6x-u/CustomVM
VMBuilder
Arithmetic Operations
push_imm(value)- Push immediate valueadd()- Add top two stack valuessub()- Subtract top two stack valuesmul()- Multiply top two stack valuesdiv()- Divide top two stack valuesmod()- Modulo operation
Bitwise Operations
and_op()- Bitwise ANDor_op()- Bitwise ORxor_op()- Bitwise XORnot_op()- Bitwise NOTshl()- Shift leftshr()- Shift right
Stack Operations
dup()- Duplicate top valueswap()- Swap top two valuesrot()- Rotate top three values
Control Flow
jmp(label)- Unconditional jumpjz(label)- Jump if zerojnz(label)- Jump if not zerocall(label)- Function callret()- Return from functionhalt()- Stop execution
Memory Operations
load_mem()- Load from memorystore_mem()- Store to memorypush_reg(reg)- Push register valuepop_reg(reg)- Pop to register
Constants
add_const(value)- Add to constant poolload_const(index)- Load constant
Labels
add_label(name)- Define label
Build
build(filepath)- Compile to .cvm file
BytecodeLoader
load(filepath)- Load and decrypt .cvm file- Returns:
(code, opcode_set, crypto, const_pool, integrity_hash)
VirtualMachine
load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)- Load programexecute()- Run loaded program- Returns: Top stack value
Syscalls
syscall(1)- Print integersyscall(2)- Print charactersyscall(3)- Print top of stack
Examples
Example 1: Basic Arithmetic
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.push_imm(10)
builder.push_imm(20)
builder.add()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('arithmetic.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('arithmetic.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 2: Loop
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.push_imm(1)
builder.pop_reg(0)
builder.add_label('loop_start')
builder.push_reg(0)
builder.push_imm(1)
builder.syscall()
builder.push_reg(0)
builder.push_imm(1)
builder.add()
builder.pop_reg(0)
builder.push_reg(0)
builder.push_imm(11)
builder.cmp()
builder.jnz('loop_start')
builder.halt()
builder.build('loop.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('loop.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 3: Factorial (Recursion)
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.add_label('factorial')
builder.push_reg(0)
builder.push_imm(1)
builder.cmp()
builder.jle('base_case')
builder.push_reg(0)
builder.push_reg(0)
builder.push_imm(1)
builder.sub()
builder.pop_reg(0)
builder.call('factorial')
builder.mul()
builder.ret()
builder.add_label('base_case')
builder.push_imm(1)
builder.ret()
builder.push_imm(5)
builder.pop_reg(0)
builder.call('factorial')
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('factorial.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('factorial.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 4: Memory Operations
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.push_imm(100)
builder.push_imm(0)
builder.store_mem()
builder.push_imm(200)
builder.push_imm(4)
builder.store_mem()
builder.push_imm(0)
builder.load_mem()
builder.push_imm(4)
builder.load_mem()
builder.add()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('memory.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('memory.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 5: Hello World
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
for char in "Hello World":
builder.push_imm(ord(char))
builder.push_imm(2)
builder.syscall()
builder.halt()
builder.build('hello_world.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('hello_world.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 6: Bitwise Operations
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.push_imm(15)
builder.push_imm(7)
builder.and_op()
builder.push_imm(1)
builder.syscall()
builder.push_imm(12)
builder.push_imm(10)
builder.or_op()
builder.push_imm(1)
builder.syscall()
builder.push_imm(15)
builder.push_imm(10)
builder.xor_op()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('bitwise.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('bitwise.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 7: Stack Manipulation
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
builder.push_imm(10)
builder.push_imm(20)
builder.push_imm(30)
builder.dup()
builder.push_imm(1)
builder.syscall()
builder.swap()
builder.push_imm(1)
builder.syscall()
builder.rot()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('stack_ops.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('stack_ops.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Example 8: Constant Pool
from customvm import VMBuilder, BytecodeLoader, VirtualMachine
builder = VMBuilder()
idx1 = builder.add_const(100)
idx2 = builder.add_const(200)
idx3 = builder.add_const(300)
builder.load_const(idx1)
builder.load_const(idx2)
builder.add()
builder.load_const(idx3)
builder.add()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('constants.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load('constants.cvm')
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
vm.execute()
Security Architecture
Multi-Layer Encryption
Layer 1: Bit Rotation
- Rotates bits in each byte
- Applied to entire bytecode
Layer 2: Additive Cipher
- Key-based byte addition
- Uses dynamic seed
Layer 3: Position XOR
- XOR with position-based values
- Prevents pattern analysis
Layer 4: Block Encryption
- SHA-256 based key derivation
- Per-block encryption
- Evolving state
Anti-Analysis Features
Anti-Debug
- Timing checks every 100 instructions
- Execution timeout detection
- Abnormal delay detection
Anti-Dump
- Integrity checks every 500 instructions
- SHA-256 hash verification
- Code modification detection
Obfuscation
- Context-aware opcode encoding
- Dummy instructions
- Fake jumps and calls
- Timing noise injection
- Random execution delays
Runtime Protection
Dynamic Key Derivation
- No static keys in memory
- SHA-256 state evolution
- Block-indexed derivation
Integrity Validation
- Continuous hash verification
- Self-checking mechanisms
- Tamper detection
Binary Format Specification
File Structure
[Header]
Magic: 4 bytes (CVMX)
Version: 4 bytes
Timestamp: 8 bytes
Seed Size: 4 bytes
Seed Data: variable
Section Count: 2 bytes
[Sections]
Section Type: 1 byte
Section Size: 4 bytes
Section Data: variable (encrypted)
Section Types
0x01- Code Section (encrypted opcodes)0x02- Constant Pool (encrypted constants)0x03- Data Section (reserved)
Advanced Usage
Custom Instruction Sequences
builder = VMBuilder()
builder.push_imm(5)
builder.pop_reg(0)
builder.add_label('start')
builder.push_reg(0)
builder.dup()
builder.mul()
builder.push_imm(1)
builder.syscall()
builder.push_reg(0)
builder.push_imm(1)
builder.sub()
builder.pop_reg(0)
builder.push_reg(0)
builder.push_imm(0)
builder.cmp()
builder.jnz('start')
builder.halt()
builder.build('squares.cvm')
Memory Management
builder = VMBuilder()
builder.push_imm(1024)
builder.add_instruction(INST_ALLOC)
builder.pop_reg(1)
builder.push_reg(1)
builder.push_imm(100)
builder.push_imm(42)
builder.add_instruction(INST_FILL)
builder.push_imm(1024)
builder.add_instruction(INST_FREE)
builder.halt()
builder.build('memory_mgmt.cvm')
Performance
- Execution speed: ~100K instructions/second
- Memory overhead: Minimal (stack-based)
- File size: Compact binary format
- Startup time: Instant (runtime decryption)
Troubleshooting-point operations
- 32-bit integer arithmetic only
- Maximum 64KB memory per VM instance
- Single-threaded execution
- No external library calls
Technical Details
Opcode Encoding
Opcodes are encoded using context-aware mapping:
encoded_opcode = (base_opcode[instruction] + (context * 17 + instruction * 31)) & 0xFF
Key Derivation
Keys are derived using evolving SHA-256 state:
state = SHA256(state + iteration_bytes)
key = state[:required_length]
Integrity Hash
Combined SHA-256 and SHA-512:
h1 = SHA256(data)
h2 = SHA512(data)
integrity = h1 XOR h2[:32]
Troubleshooting
Issue: Execution fails immediately
- Verify file integrity
- Check .cvm file is not corrupted
- Ensure proper loader usage
Issue: Timing checks fail
- Reduce execution complexity
- Increase timeout threshold
- Check for debugger interference
Issue: Memory errors
- Verify memory addresses are in bounds
- Check allocation/deallocation balance
- Ensure proper memory initialization
Obfuscating Your Code with CustomVM
Why Use CustomVM for Obfuscation?
CustomVM provides maximum protection for your Python code by:
- Converting Python logic to custom bytecode
- Multi-layer encryption (4 layers)
- Context-aware instruction encoding
- Anti-debug and anti-dump protection
- No CPython bytecode exposure
Step-by-Step Obfuscation Guide
Step 1: Write Your Logic Using VMBuilder
Instead of writing Python code directly, use the VMBuilder API:
from customvm import VMBuilder
builder = VMBuilder()
builder.push_imm(100)
builder.pop_reg(0)
builder.add_label('calculate')
builder.push_reg(0)
builder.push_imm(2)
builder.mul()
builder.push_imm(50)
builder.add()
builder.push_imm(1)
builder.syscall()
builder.halt()
builder.build('protected_logic.cvm')
Step 2: Create Your Distribution Script
Create a Python script that loads and executes the .cvm file:
from customvm import BytecodeLoader, VirtualMachine
import os
def run_protected_code():
cvm_path = os.path.join(os.path.dirname(__file__), 'protected_logic.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load(cvm_path)
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
return vm.execute()
if __name__ == '__main__':
result = run_protected_code()
print(f"Result: {result}")
Step 3: Additional Obfuscation Layers
For maximum protection, combine with Python obfuscators:
Option 1: PyArmor
pip install pyarmor
pyarmor obfuscate your_script.py
Option 2: PyInstaller + Obfuscation
pip install pyinstaller
pyinstaller --onefile --noconsole your_script.py
Option 3: Nuitka Compilation
pip install nuitka
python -m nuitka --standalone --onefile your_script.py
Step 4: Distribute
Distribute both files:
your_script.py(or compiled.exe)protected_logic.cvm(encrypted bytecode)
Advanced Protection Techniques
Technique 1: Split Logic Across Multiple CVM Files
builder1 = VMBuilder()
builder1.push_imm(10)
builder1.halt()
builder1.build('part1.cvm')
builder2 = VMBuilder()
builder2.push_imm(20)
builder2.halt()
builder2.build('part2.cvm')
vm1 = VirtualMachine()
code1, ops1, crypto1, const1, hash1 = BytecodeLoader().load('part1.cvm')
vm1.load_bytecode(code1, ops1, crypto1, const1, hash1)
result1 = vm1.execute()
vm2 = VirtualMachine()
code2, ops2, crypto2, const2, hash2 = BytecodeLoader().load('part2.cvm')
vm2.load_bytecode(code2, ops2, crypto2, const2, hash2)
result2 = vm2.execute()
final_result = result1 + result2
Technique 2: Embed CVM Files in Python
import base64
from customvm import BytecodeLoader, VirtualMachine
EMBEDDED_CVM = base64.b64decode(b'Q1ZNWAE...')
def run_embedded():
import tempfile
import os
with tempfile.NamedTemporaryFile(delete=False, suffix='.cvm') as f:
f.write(EMBEDDED_CVM)
temp_path = f.name
try:
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load(temp_path)
vm = VirtualMachine()
vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
return vm.execute()
finally:
os.unlink(temp_path)
Technique 3: Dynamic CVM Generation
from customvm import VMBuilder
import hashlib
import time
def create_dynamic_protection(user_key):
seed = hashlib.sha256(f"{user_key}{time.time()}".encode()).hexdigest()
builder = VMBuilder()
builder.push_imm(int(seed[:8], 16) & 0xFFFFFFFF)
builder.push_imm(12345)
builder.xor_op()
builder.halt()
filename = f'dynamic_{seed[:8]}.cvm'
builder.build(filename)
return filename
Protection Levels Comparison
| Method | Protection Level | Reverse Engineering Cost |
|---|---|---|
| Plain Python | ⭐ | 1 hour |
| Python .pyc | ⭐⭐ | 2-4 hours |
| PyArmor | ⭐⭐⭐ | 20-40 hours |
| CustomVM | ⭐⭐⭐⭐ | 100-200 hours |
| CustomVM + PyArmor | ⭐⭐⭐⭐⭐ | 300+ hours |
| CustomVM + Nuitka | ⭐⭐⭐⭐⭐ | 400+ hours |
Best Practices
- Never distribute the builder code - Only distribute the loader and
.cvmfiles - Use unique seeds - Generate different
.cvmfiles for each distribution - Combine protections - Layer CustomVM with other obfuscators
- Validate integrity - The VM automatically checks for tampering
- Split critical logic - Distribute across multiple
.cvmfiles - Embed when possible - Embed
.cvmfiles in compiled executables
Example: Production-Ready Protected Application
from customvm import BytecodeLoader, VirtualMachine
import sys
import os
class ProtectedApp:
def __init__(self):
self.vm = VirtualMachine(memory_size=131072)
self._load_core()
def _load_core(self):
try:
cvm_path = self._get_cvm_path('core.cvm')
loader = BytecodeLoader()
code, opcode_set, crypto, const_pool, integrity_hash = loader.load(cvm_path)
self.vm.load_bytecode(code, opcode_set, crypto, const_pool, integrity_hash)
except Exception as e:
print("License validation failed")
sys.exit(1)
def _get_cvm_path(self, filename):
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
else:
base_path = os.path.dirname(__file__)
return os.path.join(base_path, filename)
def run(self):
return self.vm.execute()
if __name__ == '__main__':
app = ProtectedApp()
result = app.run()
Publishing to PyPI
Prerequisites
pip install build twine
Step 1: Prepare Your Package
The package is already configured with:
setup.py- Package metadatapyproject.toml- Build system configurationMANIFEST.in- Additional files to includeLICENSE- License information
Step 2: Build the Package
cd CustomVM
python -m build
This creates:
dist/customvm-1.0.0.tar.gz(source distribution)dist/customvm-1.0.0-py3-none-any.whl(wheel distribution)
Step 3: Test Installation Locally
pip install dist/customvm-1.0.0-py3-none-any.whl
Step 4: Upload to TestPyPI (Optional)
python -m twine upload --repository testpypi dist/*
Step 5: Upload to PyPI
python -m twine upload dist/*
You'll be prompted for your PyPI credentials.
Step 6: Install from PyPI
After publishing:
pip install customvm
PyPI Package Information
Package Name: customvm
Version: 1.0.0
Author: MERO:TG@QP4RM
Python Requires: >=3.7
License: Proprietary
Updating the Package
- Update version in
setup.py - Rebuild:
python -m build - Upload:
python -m twine upload dist/*
Package Structure on PyPI
customvm/
├── customvm/
│ ├── __init__.py
│ ├── vm.py
│ ├── opcodes.py
│ ├── crypto.py
│ ├── loader.py
│ └── builder.py
└── examples/
└── (8 example files)
Troubleshooting Obfuscation
Issue: CVM file won't load
Solution: Ensure the file wasn't corrupted during transfer. Use binary mode:
with open('file.cvm', 'rb') as f:
data = f.read()
Issue: Execution fails with integrity error
Solution: The .cvm file was modified. Regenerate from source.
Issue: Anti-debug triggers during normal execution
Solution: Increase timeout threshold or reduce execution complexity.
Issue: Performance is slow
Solution:
- Reduce security checks frequency
- Use instruction folding
- Optimize bytecode sequences
License
Proprietary - All Rights Reserved
Developer: MERO:TG@QP4RM
Support
For technical support and inquiries, contact: mero@ps.com
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
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 customvm-1.0.0.tar.gz.
File metadata
- Download URL: customvm-1.0.0.tar.gz
- Upload date:
- Size: 23.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c96fe3c2d8ab46c34b169a838262936222d2cd9d521dc1450066d238304b0fc
|
|
| MD5 |
7b45153687897bbbdcdaf3e2d1d798c5
|
|
| BLAKE2b-256 |
76ba329b433840a31333d83ff044ee23cb32f18038ae52cb8a84892754621a1d
|
File details
Details for the file customvm-1.0.0-py3-none-any.whl.
File metadata
- Download URL: customvm-1.0.0-py3-none-any.whl
- Upload date:
- Size: 18.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f57b7d3f7debd567bc89b735e7e20c725b3f6e0a892497e31663dc556601f8b4
|
|
| MD5 |
266043af8df23291e1776560b233c02c
|
|
| BLAKE2b-256 |
7ee23742db3209157eae859b1693628ca208aafae49433b9ef3ea441c9c0610a
|