python-obfuscation-framework 1.9.3__tar.gz → 1.9.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {python_obfuscation_framework-1.9.3/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.9.4}/PKG-INFO +6 -4
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/README.md +5 -3
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/__init__.py +2 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/controlflow/control_flow_flatten.py +1 -1
- python_obfuscation_framework-1.9.4/pof/obfuscator/junk/dead_code.py +332 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pyproject.toml +1 -1
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4/python_obfuscation_framework.egg-info}/PKG-INFO +6 -4
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/SOURCES.txt +1 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/conftest.py +2 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/multiline_strings.py +0 -8
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/LICENSE +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/MANIFEST.in +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/__main__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/cli.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/cli_v2.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/errors.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/argv.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/base.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/cpu/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/cpu/cpu_count.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_exist.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_list_exist.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_list_missing.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_missing.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/exec_method.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/executable_path.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_exist.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_list_exist.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_list_missing.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_missing.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/tmp.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hardware/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hardware/ram_count.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/debugger.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/tracemalloc.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/p.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/prompt.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/integrity.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/multi.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/domain.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/hostname.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/uid.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/username.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/processes/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/processes/proc_count.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/expire.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/uptime.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/utc.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/utils.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/logger.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/main.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/boolean.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/builtins.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/deep_encryption.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/xor.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/constants.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/controlflow/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/definitions.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/whitespace.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/call.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/doc.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/globals.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/imports.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/extract_variables.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/add_comments.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/add_newlines.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/names.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/names_rope.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/numbers.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/other/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/other/tokens.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/comments.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/exceptions.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/indents.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/loggings.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/loggings_old.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/newline.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/print.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/restructure.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/docstrings.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/strings.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/variables.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/download.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/image.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/cl1pnet.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/pastebin.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/pasters.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/quine.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b3.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/whitespace.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/entropy.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/extract_names.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/format.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/advanced.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/base.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/basic.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/comments.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/comments.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/names.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/unicode.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/homoglyphs.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/homoglyphs.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/tokens.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/requires.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/setup.cfg +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/complex.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/moderate.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/simple.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/test_edge_cases.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/test_integration.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/utils.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/pyproject.toml +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/se/test_homoglyphs.py +0 -0
- {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/test_generator.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.4
|
|
4
4
|
Summary: Python Obfuscation Framework
|
|
5
5
|
Author-email: deoktr <35725720+deoktr@users.noreply.github.com>
|
|
6
6
|
Maintainer-email: deoktr <35725720+deoktr@users.noreply.github.com>
|
|
@@ -1268,9 +1268,12 @@ interesting strings in Python source code. To check rules against source files
|
|
|
1268
1268
|
and/or obfuscated files run:
|
|
1269
1269
|
|
|
1270
1270
|
```bash
|
|
1271
|
-
yara --no-warnings yara/python.yar
|
|
1271
|
+
yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
|
|
1272
1272
|
```
|
|
1273
1273
|
|
|
1274
|
+
> [!NOTE]
|
|
1275
|
+
> The rules are far from perfect, but they are a starting point.
|
|
1276
|
+
|
|
1274
1277
|
## Development
|
|
1275
1278
|
|
|
1276
1279
|
Project directory structure:
|
|
@@ -1363,8 +1366,7 @@ Other Python obfuscation projects:
|
|
|
1363
1366
|
|
|
1364
1367
|
## TODO
|
|
1365
1368
|
|
|
1366
|
-
- Add
|
|
1367
|
-
flattening.
|
|
1369
|
+
- Add dead code, opaque predicates.
|
|
1368
1370
|
- Fix `NamesObfuscator`.
|
|
1369
1371
|
- Add option to prepend a shebang, and add ability to customize it.
|
|
1370
1372
|
|
|
@@ -1223,9 +1223,12 @@ interesting strings in Python source code. To check rules against source files
|
|
|
1223
1223
|
and/or obfuscated files run:
|
|
1224
1224
|
|
|
1225
1225
|
```bash
|
|
1226
|
-
yara --no-warnings yara/python.yar
|
|
1226
|
+
yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
|
|
1227
1227
|
```
|
|
1228
1228
|
|
|
1229
|
+
> [!NOTE]
|
|
1230
|
+
> The rules are far from perfect, but they are a starting point.
|
|
1231
|
+
|
|
1229
1232
|
## Development
|
|
1230
1233
|
|
|
1231
1234
|
Project directory structure:
|
|
@@ -1318,8 +1321,7 @@ Other Python obfuscation projects:
|
|
|
1318
1321
|
|
|
1319
1322
|
## TODO
|
|
1320
1323
|
|
|
1321
|
-
- Add
|
|
1322
|
-
flattening.
|
|
1324
|
+
- Add dead code, opaque predicates.
|
|
1323
1325
|
- Fix `NamesObfuscator`.
|
|
1324
1326
|
- Add option to prepend a shebang, and add ability to customize it.
|
|
1325
1327
|
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/__init__.py
RENAMED
|
@@ -43,6 +43,7 @@ from .esoteric.imports import ImportsObfuscator
|
|
|
43
43
|
from .extract_variables import ExtractVariablesObfuscator
|
|
44
44
|
from .junk.add_comments import AddCommentsObfuscator
|
|
45
45
|
from .junk.add_newlines import AddNewlinesObfuscator
|
|
46
|
+
from .junk.dead_code import DeadCodeObfuscator
|
|
46
47
|
from .names import NamesObfuscator
|
|
47
48
|
from .names_rope import NamesRopeObfuscator
|
|
48
49
|
from .numbers import NumberObfuscator
|
|
@@ -78,6 +79,7 @@ __all__ = [
|
|
|
78
79
|
"CommentsObfuscator",
|
|
79
80
|
"ConstantsObfuscator",
|
|
80
81
|
"ControlFlowFlattenObfuscator",
|
|
82
|
+
"DeadCodeObfuscator",
|
|
81
83
|
"DeepEncryptionObfuscator",
|
|
82
84
|
"DefinitionsObfuscator",
|
|
83
85
|
"DocstringObfuscator",
|
|
@@ -67,7 +67,7 @@ class ControlFlowFlattenObfuscator:
|
|
|
67
67
|
|
|
68
68
|
dispatcher_cases: list[ast.If | None] = []
|
|
69
69
|
|
|
70
|
-
for idx, (state_num, stmt) in enumerate(zip(block_states, body)):
|
|
70
|
+
for idx, (state_num, stmt) in enumerate(zip(block_states, body, strict=True)):
|
|
71
71
|
next_state = block_states[idx + 1] if idx + 1 < num_blocks else exit_state
|
|
72
72
|
|
|
73
73
|
case_body: list[ast.stmt] = []
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
# POF, a free and open source Python obfuscation framework.
|
|
2
|
+
# Copyright (C) 2022 - 2026 Deoktr
|
|
3
|
+
#
|
|
4
|
+
# This program is free software: you can redistribute it and/or modify
|
|
5
|
+
# it under the terms of the GNU General Public License as published by
|
|
6
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
7
|
+
# (at your option) any later version.
|
|
8
|
+
#
|
|
9
|
+
# This program is distributed in the hope that it will be useful,
|
|
10
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
# GNU General Public License for more details.
|
|
13
|
+
#
|
|
14
|
+
# You should have received a copy of the GNU General Public License
|
|
15
|
+
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
|
|
17
|
+
import random
|
|
18
|
+
from collections.abc import Generator
|
|
19
|
+
from tokenize import (
|
|
20
|
+
COMMENT,
|
|
21
|
+
DEDENT,
|
|
22
|
+
INDENT,
|
|
23
|
+
NAME,
|
|
24
|
+
NEWLINE,
|
|
25
|
+
NL,
|
|
26
|
+
NUMBER,
|
|
27
|
+
OP,
|
|
28
|
+
STRING,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
from pof.utils.generator import BasicGenerator
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class DeadCodeObfuscator:
|
|
35
|
+
"""Insert dead (unreachable/unused) code blocks into the source."""
|
|
36
|
+
|
|
37
|
+
VALID_STATEMENT_TYPES = (
|
|
38
|
+
"function",
|
|
39
|
+
"if",
|
|
40
|
+
"for",
|
|
41
|
+
"while",
|
|
42
|
+
"assignment",
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def __init__( # noqa: PLR0913
|
|
46
|
+
self,
|
|
47
|
+
frequency: float = 0.3,
|
|
48
|
+
max_function_depth: int = 2,
|
|
49
|
+
max_branches: int = 3,
|
|
50
|
+
statement_types: list[str] | None = None,
|
|
51
|
+
generate_classes: bool = False, # noqa: FBT001, FBT002
|
|
52
|
+
generator: Generator[str] | None = None,
|
|
53
|
+
) -> None:
|
|
54
|
+
self.frequency: float = frequency
|
|
55
|
+
self.max_function_depth: int = max_function_depth
|
|
56
|
+
self.max_branches: int = max_branches
|
|
57
|
+
self.generate_classes: bool = generate_classes
|
|
58
|
+
|
|
59
|
+
if statement_types is not None:
|
|
60
|
+
self.statement_types: list[str] = [
|
|
61
|
+
s for s in statement_types if s in self.VALID_STATEMENT_TYPES
|
|
62
|
+
]
|
|
63
|
+
else:
|
|
64
|
+
self.statement_types = list(self.VALID_STATEMENT_TYPES)
|
|
65
|
+
|
|
66
|
+
if generator is None:
|
|
67
|
+
generator = BasicGenerator.function_generator()
|
|
68
|
+
self.generator: Generator[str] = generator
|
|
69
|
+
self._var_generator: Generator[str] = BasicGenerator.alphabet_generator()
|
|
70
|
+
|
|
71
|
+
def _next_name(self) -> str:
|
|
72
|
+
return next(self.generator)
|
|
73
|
+
|
|
74
|
+
def _next_var(self) -> str:
|
|
75
|
+
return next(self._var_generator)
|
|
76
|
+
|
|
77
|
+
@staticmethod
|
|
78
|
+
def _collect_existing_names(tokens) -> set[str]:
|
|
79
|
+
names: set[str] = set()
|
|
80
|
+
for toknum, tokval, *_ in tokens:
|
|
81
|
+
if toknum == NAME:
|
|
82
|
+
names.add(tokval)
|
|
83
|
+
return names
|
|
84
|
+
|
|
85
|
+
def _random_expr_tokens(self):
|
|
86
|
+
choice = random.randint(0, 3)
|
|
87
|
+
if choice == 0:
|
|
88
|
+
a, b = random.randint(1, 999), random.randint(1, 999)
|
|
89
|
+
op = random.choice(["+", "-", "*", "%"])
|
|
90
|
+
return [(NUMBER, str(a)), (OP, op), (NUMBER, str(b))]
|
|
91
|
+
if choice == 1:
|
|
92
|
+
words = ["data", "info", "temp", "cache", "buf", "msg", "tag"]
|
|
93
|
+
return [(STRING, repr(random.choice(words)))]
|
|
94
|
+
if choice == 2: # noqa: PLR2004
|
|
95
|
+
items = [random.randint(0, 100) for _ in range(random.randint(1, 4))]
|
|
96
|
+
tokens = [(OP, "[")]
|
|
97
|
+
for i, item in enumerate(items):
|
|
98
|
+
if i > 0:
|
|
99
|
+
tokens.append((OP, ","))
|
|
100
|
+
tokens.append((NUMBER, str(item)))
|
|
101
|
+
tokens.append((OP, "]"))
|
|
102
|
+
return tokens
|
|
103
|
+
return [(NUMBER, str(random.randint(0, 9999)))]
|
|
104
|
+
|
|
105
|
+
def _body_tokens(self, count: int = 0):
|
|
106
|
+
"""Generate body tokens for a block (assignments)."""
|
|
107
|
+
if count == 0:
|
|
108
|
+
count = random.randint(1, 3)
|
|
109
|
+
tokens = []
|
|
110
|
+
for _ in range(count):
|
|
111
|
+
var = self._next_var()
|
|
112
|
+
tokens.append((NAME, var))
|
|
113
|
+
tokens.append((OP, "="))
|
|
114
|
+
tokens.extend(self._random_expr_tokens())
|
|
115
|
+
tokens.append((NEWLINE, "\n"))
|
|
116
|
+
return tokens
|
|
117
|
+
|
|
118
|
+
def _generate_dead_function_tokens(self, indent_level: int, depth: int):
|
|
119
|
+
fname = self._next_name()
|
|
120
|
+
params = [self._next_var() for _ in range(random.randint(0, 3))]
|
|
121
|
+
inner_indent = " " * (indent_level + 1)
|
|
122
|
+
|
|
123
|
+
tokens = [
|
|
124
|
+
(NAME, "def"),
|
|
125
|
+
(NAME, fname),
|
|
126
|
+
(OP, "("),
|
|
127
|
+
]
|
|
128
|
+
for i, p in enumerate(params):
|
|
129
|
+
if i > 0:
|
|
130
|
+
tokens.append((OP, ","))
|
|
131
|
+
tokens.append((NAME, p))
|
|
132
|
+
tokens.extend(
|
|
133
|
+
[
|
|
134
|
+
(OP, ")"),
|
|
135
|
+
(OP, ":"),
|
|
136
|
+
(NEWLINE, "\n"),
|
|
137
|
+
(INDENT, inner_indent),
|
|
138
|
+
],
|
|
139
|
+
)
|
|
140
|
+
tokens.extend(self._body_tokens())
|
|
141
|
+
|
|
142
|
+
if depth < self.max_function_depth and random.random() < 0.3: # noqa: PLR2004
|
|
143
|
+
tokens.extend(
|
|
144
|
+
self._generate_dead_function_tokens(indent_level + 1, depth + 1),
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
tokens.append((DEDENT, ""))
|
|
148
|
+
return tokens
|
|
149
|
+
|
|
150
|
+
def _generate_dead_if_tokens(self, indent_level: int):
|
|
151
|
+
false_conds = [
|
|
152
|
+
[(NAME, "False")],
|
|
153
|
+
[(NUMBER, "0")],
|
|
154
|
+
[(STRING, '""')],
|
|
155
|
+
[(NAME, "None")],
|
|
156
|
+
]
|
|
157
|
+
inner_indent = " " * (indent_level + 1)
|
|
158
|
+
|
|
159
|
+
tokens = [(NAME, "if")]
|
|
160
|
+
tokens.extend(random.choice(false_conds))
|
|
161
|
+
tokens.extend(
|
|
162
|
+
[
|
|
163
|
+
(OP, ":"),
|
|
164
|
+
(NEWLINE, "\n"),
|
|
165
|
+
(INDENT, inner_indent),
|
|
166
|
+
],
|
|
167
|
+
)
|
|
168
|
+
tokens.extend(self._body_tokens())
|
|
169
|
+
tokens.append((DEDENT, ""))
|
|
170
|
+
|
|
171
|
+
num_elif = random.randint(0, max(0, self.max_branches - 1))
|
|
172
|
+
for _ in range(num_elif):
|
|
173
|
+
tokens.append((NAME, "elif"))
|
|
174
|
+
tokens.extend(random.choice(false_conds))
|
|
175
|
+
tokens.extend(
|
|
176
|
+
[
|
|
177
|
+
(OP, ":"),
|
|
178
|
+
(NEWLINE, "\n"),
|
|
179
|
+
(INDENT, inner_indent),
|
|
180
|
+
],
|
|
181
|
+
)
|
|
182
|
+
tokens.extend(self._body_tokens())
|
|
183
|
+
tokens.append((DEDENT, ""))
|
|
184
|
+
|
|
185
|
+
return tokens
|
|
186
|
+
|
|
187
|
+
def _generate_dead_for_tokens(self, indent_level: int):
|
|
188
|
+
var = self._next_var()
|
|
189
|
+
inner_indent = " " * (indent_level + 1)
|
|
190
|
+
|
|
191
|
+
empty_choices = [
|
|
192
|
+
[(OP, "["), (OP, "]")],
|
|
193
|
+
[(NAME, "range"), (OP, "("), (NUMBER, "0"), (OP, ")")],
|
|
194
|
+
]
|
|
195
|
+
|
|
196
|
+
tokens = [
|
|
197
|
+
(NAME, "for"),
|
|
198
|
+
(NAME, var),
|
|
199
|
+
(NAME, "in"),
|
|
200
|
+
]
|
|
201
|
+
tokens.extend(random.choice(empty_choices))
|
|
202
|
+
tokens.extend(
|
|
203
|
+
[
|
|
204
|
+
(OP, ":"),
|
|
205
|
+
(NEWLINE, "\n"),
|
|
206
|
+
(INDENT, inner_indent),
|
|
207
|
+
],
|
|
208
|
+
)
|
|
209
|
+
tokens.extend(self._body_tokens())
|
|
210
|
+
tokens.append((DEDENT, ""))
|
|
211
|
+
return tokens
|
|
212
|
+
|
|
213
|
+
def _generate_dead_while_tokens(self, indent_level: int):
|
|
214
|
+
inner_indent = " " * (indent_level + 1)
|
|
215
|
+
tokens = [
|
|
216
|
+
(NAME, "while"),
|
|
217
|
+
(NAME, "False"),
|
|
218
|
+
(OP, ":"),
|
|
219
|
+
(NEWLINE, "\n"),
|
|
220
|
+
(INDENT, inner_indent),
|
|
221
|
+
]
|
|
222
|
+
tokens.extend(self._body_tokens())
|
|
223
|
+
tokens.append((DEDENT, ""))
|
|
224
|
+
return tokens
|
|
225
|
+
|
|
226
|
+
def _generate_dead_class_tokens(self, indent_level: int):
|
|
227
|
+
cname = self._next_name().capitalize()
|
|
228
|
+
inner_indent = " " * (indent_level + 1)
|
|
229
|
+
tokens = [
|
|
230
|
+
(NAME, "class"),
|
|
231
|
+
(NAME, cname),
|
|
232
|
+
(OP, ":"),
|
|
233
|
+
(NEWLINE, "\n"),
|
|
234
|
+
(INDENT, inner_indent),
|
|
235
|
+
]
|
|
236
|
+
tokens.extend(self._generate_dead_function_tokens(indent_level + 1, 0))
|
|
237
|
+
tokens.append((DEDENT, ""))
|
|
238
|
+
return tokens
|
|
239
|
+
|
|
240
|
+
def _generate_dead_assignment_tokens(self):
|
|
241
|
+
var = self._next_var()
|
|
242
|
+
tokens = [
|
|
243
|
+
(NAME, var),
|
|
244
|
+
(OP, "="),
|
|
245
|
+
]
|
|
246
|
+
tokens.extend(self._random_expr_tokens())
|
|
247
|
+
tokens.append((NEWLINE, "\n"))
|
|
248
|
+
return tokens
|
|
249
|
+
|
|
250
|
+
def _generate_dead_code(self, indent_level: int):
|
|
251
|
+
"""Generate a dead code block and return its tokens."""
|
|
252
|
+
available = list(self.statement_types)
|
|
253
|
+
if self.generate_classes:
|
|
254
|
+
available.append("class")
|
|
255
|
+
|
|
256
|
+
if indent_level > 0:
|
|
257
|
+
weights = []
|
|
258
|
+
for t in available:
|
|
259
|
+
if t in ("function", "class"):
|
|
260
|
+
weights.append(1)
|
|
261
|
+
else:
|
|
262
|
+
weights.append(3)
|
|
263
|
+
else:
|
|
264
|
+
weights = [1] * len(available)
|
|
265
|
+
|
|
266
|
+
choice = random.choices(available, weights=weights, k=1)[0]
|
|
267
|
+
|
|
268
|
+
match choice:
|
|
269
|
+
case "function":
|
|
270
|
+
return self._generate_dead_function_tokens(indent_level, 0)
|
|
271
|
+
case "if":
|
|
272
|
+
return self._generate_dead_if_tokens(indent_level)
|
|
273
|
+
case "for":
|
|
274
|
+
return self._generate_dead_for_tokens(indent_level)
|
|
275
|
+
case "while":
|
|
276
|
+
return self._generate_dead_while_tokens(indent_level)
|
|
277
|
+
case "class":
|
|
278
|
+
return self._generate_dead_class_tokens(indent_level)
|
|
279
|
+
case _:
|
|
280
|
+
return self._generate_dead_assignment_tokens()
|
|
281
|
+
|
|
282
|
+
def obfuscate_tokens(self, tokens): # noqa: C901
|
|
283
|
+
existing: set[str] = self._collect_existing_names(tokens)
|
|
284
|
+
BasicGenerator.extend_reserved(list(existing))
|
|
285
|
+
|
|
286
|
+
result = []
|
|
287
|
+
indent_level: int = 0
|
|
288
|
+
paren_depth: int = 0
|
|
289
|
+
in_decorator: bool = False
|
|
290
|
+
|
|
291
|
+
for idx, (toknum, tokval, *_) in enumerate(tokens):
|
|
292
|
+
if toknum == INDENT:
|
|
293
|
+
indent_level += 1
|
|
294
|
+
elif toknum == DEDENT:
|
|
295
|
+
indent_level = max(0, indent_level - 1)
|
|
296
|
+
|
|
297
|
+
if toknum == OP and tokval in ("(", "[", "{"):
|
|
298
|
+
paren_depth += 1
|
|
299
|
+
elif toknum == OP and tokval in (")", "]", "}"):
|
|
300
|
+
paren_depth = max(0, paren_depth - 1)
|
|
301
|
+
|
|
302
|
+
if toknum == OP and tokval == "@":
|
|
303
|
+
in_decorator = True
|
|
304
|
+
if in_decorator and toknum == NEWLINE:
|
|
305
|
+
in_decorator = False
|
|
306
|
+
|
|
307
|
+
result.append((toknum, tokval))
|
|
308
|
+
|
|
309
|
+
# insert dead code after NEWLINE tokens
|
|
310
|
+
# do NOT insert if an INDENT is upcoming (possibly after NL/COMMENT
|
|
311
|
+
# tokens), that would break the block header (def/if/for/while/
|
|
312
|
+
# class/try) by placing code between the header's NEWLINE and the
|
|
313
|
+
# body's INDENT
|
|
314
|
+
if (
|
|
315
|
+
toknum == NEWLINE
|
|
316
|
+
and paren_depth == 0
|
|
317
|
+
and not in_decorator
|
|
318
|
+
and random.random() < self.frequency
|
|
319
|
+
):
|
|
320
|
+
has_upcoming_indent = False
|
|
321
|
+
for j in range(idx + 1, len(tokens)):
|
|
322
|
+
upcoming = tokens[j][0]
|
|
323
|
+
if upcoming in (NL, COMMENT):
|
|
324
|
+
continue
|
|
325
|
+
if upcoming == INDENT:
|
|
326
|
+
has_upcoming_indent = True
|
|
327
|
+
break
|
|
328
|
+
if not has_upcoming_indent:
|
|
329
|
+
dead_tokens = self._generate_dead_code(indent_level)
|
|
330
|
+
result.extend(dead_tokens)
|
|
331
|
+
|
|
332
|
+
return result
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.4
|
|
4
4
|
Summary: Python Obfuscation Framework
|
|
5
5
|
Author-email: deoktr <35725720+deoktr@users.noreply.github.com>
|
|
6
6
|
Maintainer-email: deoktr <35725720+deoktr@users.noreply.github.com>
|
|
@@ -1268,9 +1268,12 @@ interesting strings in Python source code. To check rules against source files
|
|
|
1268
1268
|
and/or obfuscated files run:
|
|
1269
1269
|
|
|
1270
1270
|
```bash
|
|
1271
|
-
yara --no-warnings yara/python.yar
|
|
1271
|
+
yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
|
|
1272
1272
|
```
|
|
1273
1273
|
|
|
1274
|
+
> [!NOTE]
|
|
1275
|
+
> The rules are far from perfect, but they are a starting point.
|
|
1276
|
+
|
|
1274
1277
|
## Development
|
|
1275
1278
|
|
|
1276
1279
|
Project directory structure:
|
|
@@ -1363,8 +1366,7 @@ Other Python obfuscation projects:
|
|
|
1363
1366
|
|
|
1364
1367
|
## TODO
|
|
1365
1368
|
|
|
1366
|
-
- Add
|
|
1367
|
-
flattening.
|
|
1369
|
+
- Add dead code, opaque predicates.
|
|
1368
1370
|
- Fix `NamesObfuscator`.
|
|
1369
1371
|
- Add option to prepend a shebang, and add ability to customize it.
|
|
1370
1372
|
|
|
@@ -90,6 +90,7 @@ pof/obfuscator/esoteric/imports.py
|
|
|
90
90
|
pof/obfuscator/junk/__init__.py
|
|
91
91
|
pof/obfuscator/junk/add_comments.py
|
|
92
92
|
pof/obfuscator/junk/add_newlines.py
|
|
93
|
+
pof/obfuscator/junk/dead_code.py
|
|
93
94
|
pof/obfuscator/other/__init__.py
|
|
94
95
|
pof/obfuscator/other/tokens.py
|
|
95
96
|
pof/obfuscator/remove/__init__.py
|
|
@@ -32,6 +32,7 @@ from pof.obfuscator import (
|
|
|
32
32
|
CommentsObfuscator,
|
|
33
33
|
ConstantsObfuscator,
|
|
34
34
|
ControlFlowFlattenObfuscator,
|
|
35
|
+
DeadCodeObfuscator,
|
|
35
36
|
DeepEncryptionObfuscator,
|
|
36
37
|
DefinitionsObfuscator,
|
|
37
38
|
DocstringObfuscator,
|
|
@@ -191,6 +192,7 @@ OBFUSCATOR_REGISTRY: list[ObfuscatorEntry] = [
|
|
|
191
192
|
# Junk / behavior-altering
|
|
192
193
|
ObfuscatorEntry(AddCommentsObfuscator, "AddCommentsObfuscator", "junk"),
|
|
193
194
|
ObfuscatorEntry(AddNewlinesObfuscator, "AddNewlinesObfuscator", "junk"),
|
|
195
|
+
ObfuscatorEntry(DeadCodeObfuscator, "DeadCodeObfuscator", "junk"),
|
|
194
196
|
# name/variable obfuscators
|
|
195
197
|
ObfuscatorEntry(ConstantsObfuscator, "ConstantsObfuscator", "other"),
|
|
196
198
|
ObfuscatorEntry(
|
|
@@ -1,30 +1,22 @@
|
|
|
1
1
|
# Language features: implicit string concatenation (multi-line and single-line)
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# Multi-line implicit concatenation (parenthesized)
|
|
5
2
|
a = ("hello"
|
|
6
3
|
"world")
|
|
7
4
|
print(a)
|
|
8
5
|
|
|
9
|
-
# In function call across lines
|
|
10
6
|
print(("foo"
|
|
11
7
|
"bar"))
|
|
12
8
|
|
|
13
|
-
# Three strings across lines
|
|
14
9
|
b = ("one"
|
|
15
10
|
"two"
|
|
16
11
|
"three")
|
|
17
12
|
print(b)
|
|
18
13
|
|
|
19
|
-
# Mixed quote styles
|
|
20
14
|
c = ('hello'
|
|
21
15
|
"world")
|
|
22
16
|
print(c)
|
|
23
17
|
|
|
24
|
-
# Single-line implicit concatenation
|
|
25
18
|
d = "hello" "world"
|
|
26
19
|
print(d)
|
|
27
20
|
|
|
28
|
-
# Three strings on one line
|
|
29
21
|
e = "a" "b" "c"
|
|
30
22
|
print(e)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/__init__.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/argv.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/tmp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/p.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/integrity.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/multi.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/__init__.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/domain.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/hostname.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/uid.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/username.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/expire.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/uptime.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/utc.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/utils.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/boolean.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/builtins.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|