Sitelet https://www.pelock.com/products/python-obfuscator

Python Obfuscator — Obfuscate & Virtualize Python Code

Obfuscate, virtualize & protect Python .py scripts with polymorphic string encryption, VM engine, finite-state automata transforms, self-integrity & anti-debugging checks — via GUI, CLI, online tool, or API.

Python script obfuscator, virtualizer & protector

Python Obfuscator protects proprietary .py scripts with renaming, polymorphic string and integer encryption, control-flow flattening, finite-state automata (FSA), a VM engine, self-defending integrity checks, a protection linker, and anti-debugging & anti-analysis probes.

Python is a cross-platform, dynamically typed scripting language widely used for automation, backend services, data processing and internal tooling. Because .py files ship as readable source, or are trivially decompiled from .pyc bytecode, proprietary logic and embedded secrets are exposed to anyone with file access unless the source is obfuscated.

Why Python scripts need obfuscation?

Scripts are typically distributed as plain .py files or simple packages. That convenience means anyone with file access can read the full logic, hunt for credentials or API keys in strings, and steal your algorithms unless you take extra steps to hide intent.

Obfuscation

Powerful obfuscation

Python Obfuscator uses state-of-the-art obfuscation strategies such as polymorphic string encryption, integers & floats encryption, mixed boolean-arithmetic rewriting, and decoy noise. The result conceals literals and structure while preserving tested runtime behaviour.

Processor

Code virtualization

Selected statements are lifted into a randomly generated VM engine with shuffled dispatch tables, decoy opcodes, and an obfuscated dispatcher loop. Analysts must interpret the virtual machine instead of reading plain Python.

Node

Finite-state automata (FSA)

Finite-state automata (FSA) obfuscation rewrites linear Python statement blocks into dual-state automata with opaque schedulers and shuffled dispatch handlers. Instead of reading code top to bottom, analysts must follow numeric states, transition tables, and decoy paths to reconstruct the original order.

Bug

Anti-debugging & anti-analysis

Anti-debugging protection inserts polymorphic probes that detect attached debuggers, tracers, virtual machines, sandboxes, and emulated interpreters. When a check fires, the obfuscated script exits silently instead of revealing protected logic under interactive analysis.

System monitor

Self-integrity checks

A bootstrap probe verifies on-disk script shape (a seeded body digest) and sets a tamper key when the file no longer matches the obfuscated build. String decryptors consume that key, so patched scripts return garbage instead of plaintext. This self-defending layer raises the cost of casual deobfuscation and file edits.

Brick link

Protection linker

The protection linker adds decoy functions and fake calls so a copied fragment still looks like real program code. Hidden traps fire only if someone edits the file or runs a piece of it on its own. When the script starts normally, those extras stay silent and the program runs as usual.

Before and after obfuscation

Look at this example and click the "After obfuscation" tab to see how the same script becomes harder to read at a glance:

def get_greeting(name):
    print(f"Hello World from {name}!")


get_greeting("Python Obfuscator")
_hn_jtskg = 0
_jw_ntq = 297 * 400 + 36
_x4e8bfda = abs(_jw_ntq - 8074)
_ev_koc_nn = max(_jw_ntq, _x4e8bfda) - min(_jw_ntq, _x4e8bfda)
_j_uo_xk_byh = 0


def _gn_jjz_mcn3v8p(slot, salt, guard):
    global _hn_jtskg, _j_uo_xk_byh
    if not _hn_jtskg:
        return ''
    [c.upper() for c in ('jfe', 'm0ao', 'r8ysw')]
    if (((slot * 31) + salt) & 65535) != guard:
        return ''
    tk = _j_uo_xk_byh
    _ie_m39_csp_doefp = {'ouj1': 455, 'vjz_o': 170, 'iqnv': 291}
    _ie_m39_csp_doefp['r5_lr_m'] = _ie_m39_csp_doefp['ouj1'] + _ie_m39_csp_doefp['vjz_o']
    _yw_xso = sum(_ie_m39_csp_doefp.values())
    if tk is None:
        tk = 0
    _v93a130f2e4 = 508
    if _v93a130f2e4 == 524:
        _g_yf7_ia14_go = 'h1_vph'
    elif _v93a130f2e4 == 561:
        _g_yf7_ia14_go = 'hawo_b'
    else:
        _g_yf7_ia14_go = _v93a130f2e4 * 2
    dk = _vb6a18ffee4 if '_vb6a18ffee4' in dir() else None
    try:
        _xg_ln5_kz_yeus_fo7 = 850 ** 0.5
    finally:
        pass
    if dk is None:
        dk = 0
    d = [46866, 46865]
    r = ''
    for s9q_o_spi_zzuf_ql_vy_v in range(len(d)):
        v = d[s9q_o_spi_zzuf_ql_vy_v]
        for _j_l9g_l7_pe_tqe_is in range(2, -1, -1):
            for _psbom_dh_x_ay in range(2, -1, -1):
                v = v + 230
        for _zh_h33vzxj_izegl9 in range(0, -1, -1):
            v = v + int(((236 + (-3 * s9q_o_spi_zzuf_ql_vy_v) + (3 * _zh_h33vzxj_izegl9)) % 256 + 256) % 256)
            v = v ^ 53766
        v = v - (salt + slot + tk + dk + 0)
        if 0 <= v <= 0xFFFF:
            r += chr(v)
        elif 0x10000 <= v <= 0x10FFFF:
            r += chr(v)
    return r
...

Would you still recognise the original intent if you only had the obfuscated text and no prior copy of the script?

How does Python Obfuscator work?

The engine parses Python source into an AST tree, then applies selectable transforms: identifier renaming, control-flow flattening, finite-state automata (FSA), VM virtualization, polymorphic string and numeric encryption, noise and decoy insertion, self-defending integrity probes, the protection linker, and anti-debugging & anti-analysis checks. Many techniques are specific to this product; some ideas are shared with our other protection tools.

Python Obfuscator Pipeline — obfuscation, virtualization and protection pipeline

When all passes finish, the engine emits a new .py file. Edge cases in the Python grammar and third-party libraries mean you should always test the output in your target runtime.

Command line version

Python Obfuscator ships with a command-line interface for Windows and Linux automation.

Python Obfuscator CLI for Windows and Linux automation

Use it to integrate obfuscation into build servers, CI jobs, or batch packaging.

Any questions?

If you would like to ask about Python Obfuscator, or something is not clear, mail me.