python-obfuscation-framework 1.7.3__tar.gz → 1.7.5__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.7.3 → python_obfuscation_framework-1.7.5}/LICENSE +2 -2
- {python_obfuscation_framework-1.7.3/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.7.5}/PKG-INFO +181 -67
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/README.md +180 -66
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/__main__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/cli.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/cli_v2.py +4 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/errors.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/argv.py +29 -10
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/base.py +1 -1
- {python_obfuscation_framework-1.7.3/pof/evasion/fs → python_obfuscation_framework-1.7.5/pof/evasion/cpu}/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/cpu/cpu_count.py +1 -1
- {python_obfuscation_framework-1.7.3/pof/evasion/hardware → python_obfuscation_framework-1.7.5/pof/evasion/fs}/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_exist.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_list_exist.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_list_missing.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_missing.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/exec_method.py +5 -2
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/executable_path.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_exist.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_list_exist.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_list_missing.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_missing.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/tmp.py +5 -5
- {python_obfuscation_framework-1.7.3/pof/evasion/hooks → python_obfuscation_framework-1.7.5/pof/evasion/hardware}/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hardware/ram_count.py +1 -1
- {python_obfuscation_framework-1.7.3/pof/evasion/cpu → python_obfuscation_framework-1.7.5/pof/evasion/hooks}/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hooks/debugger.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hooks/tracemalloc.py +1 -1
- python_obfuscation_framework-1.7.5/pof/evasion/human/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/human/p.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/human/prompt.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/integrity.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/multi.py +1 -1
- python_obfuscation_framework-1.7.5/pof/evasion/os/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/domain.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/hostname.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/uid.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/username.py +1 -1
- python_obfuscation_framework-1.7.5/pof/evasion/processes/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/processes/proc_count.py +1 -1
- python_obfuscation_framework-1.7.5/pof/evasion/time/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/expire.py +3 -29
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/uptime.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/utc.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/utils.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/logger.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/main.py +2 -6
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/__init__.py +3 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/builtins.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/cipher/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/deep_encryption.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/rc4.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/shift.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/xor.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/compression/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/bz2.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/gzip.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/lzma.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/zlib.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/constants.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/definitions.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/encoding/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/a85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b16.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b32.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b32hex.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b64.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/binascii.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/snt.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/encoding/whitespace.py +39 -0
- python_obfuscation_framework-1.7.5/pof/obfuscator/esoteric/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/call.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/doc.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/globals.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/imports.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/extract_variables.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/junk/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/junk/add_comments.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/junk/add_newlines.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/names.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/names_rope.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/numbers.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/other/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/other/tokens.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/remove/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/comments.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/exceptions.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/indents.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/loggings.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/loggings_old.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/newline.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/print.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/restructure.py +1 -1
- python_obfuscation_framework-1.7.5/pof/obfuscator/stegano/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/docstrings.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/ipv6encoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/macencoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/uuidencoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/strings.py +22 -6
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/__init__.py +1 -1
- python_obfuscation_framework-1.7.5/pof/stager/cipher/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/cipher/rc4.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/download.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/image.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/cl1pnet.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/pastebin.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/pasters.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/quine.py +1 -1
- python_obfuscation_framework-1.7.5/pof/utils/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/rc4.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/shift.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/bz2.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/gzip.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/lzma.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/zlib.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/__init__.py +3 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/a85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b16.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b3.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b32.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b32hex.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b64.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/binascii.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/snt.py +1 -1
- python_obfuscation_framework-1.7.5/pof/utils/encoding/whitespace.py +117 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/entropy.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/extract_names.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/format.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/advanced.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/base.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/basic.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/comments.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/comments.txt +154 -154
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/unicode.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/homoglyphs.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/__init__.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/ipv6encoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/macencoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/uuidencoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/tokens.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pyproject.toml +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5/python_obfuscation_framework.egg-info}/PKG-INFO +181 -67
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/SOURCES.txt +2 -0
- python_obfuscation_framework-1.7.5/tests/__init__.py +15 -0
- python_obfuscation_framework-1.7.5/tests/obfuscator/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_a85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b16.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b32.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b32hex.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b64.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b85.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_binascii.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_call.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_comments.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_doc.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_docstrings.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_exceptions.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_ipv6encoding.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/test_names.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_number.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_print.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_snt.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_tokens.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_xor.py +1 -1
- python_obfuscation_framework-1.7.5/tests/utils/__init__.py +15 -0
- python_obfuscation_framework-1.7.5/tests/utils/se/__init__.py +15 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/utils/se/test_homoglyphs.py +1 -1
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/utils/test_generator.py +1 -1
- python_obfuscation_framework-1.7.3/pof/evasion/human/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/evasion/os/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/evasion/processes/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/evasion/time/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/cipher/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/compression/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/encoding/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/esoteric/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/junk/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/other/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/remove/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/obfuscator/stegano/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/stager/cipher/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/pof/utils/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/tests/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/tests/obfuscator/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/tests/utils/__init__.py +0 -15
- python_obfuscation_framework-1.7.3/tests/utils/se/__init__.py +0 -15
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/MANIFEST.in +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/names.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/homoglyphs.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/requires.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/setup.cfg +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/code/out.py +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/code/source.py +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/utils.py +0 -0
- {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/pyproject.toml +0 -0
|
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
|
|
|
632
632
|
the "copyright" line and a pointer to where the full notice is found.
|
|
633
633
|
|
|
634
634
|
POF, a free and open source Python obfuscation framework.
|
|
635
|
-
Copyright (C) 2022 -
|
|
635
|
+
Copyright (C) 2022 - 2026 Deoktr
|
|
636
636
|
|
|
637
637
|
This program is free software: you can redistribute it and/or modify
|
|
638
638
|
it under the terms of the GNU General Public License as published by
|
|
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
|
|
|
652
652
|
If the program does terminal interaction, make it output a short
|
|
653
653
|
notice like this when it starts in an interactive mode:
|
|
654
654
|
|
|
655
|
-
POF Copyright (C) 2022 -
|
|
655
|
+
POF Copyright (C) 2022 - 2026 Deoktr
|
|
656
656
|
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
|
657
657
|
This is free software, and you are welcome to redistribute it
|
|
658
658
|
under certain conditions; type `show c' for details.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.7.
|
|
3
|
+
Version: 1.7.5
|
|
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>
|
|
@@ -47,15 +47,17 @@ Dynamic: license-file
|
|
|
47
47
|
|
|
48
48
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
49
49
|
|
|
50
|
+
Test it at [pof.run](https://pof.run).
|
|
51
|
+
|
|
50
52
|
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
51
53
|
|
|
52
54
|
pof will allow you to:
|
|
53
55
|
|
|
54
|
-
- **
|
|
55
|
-
- **Slow down static analysis** of the payload or the stage.
|
|
56
|
+
- **Slow down static analysis** with layered obfuscation and novel techniques.
|
|
56
57
|
- **Evade sandbox** by checking host information like MAC addresses, CPU count, memory count, uptime, and much more.
|
|
57
58
|
- **Add guardrails** to ensure the payload only execute on the desired target host by verifying for username, hostname, domainame and much more.
|
|
58
59
|
- **Prevent dynamic analysis** by detecting debugging or tracing via malloc.
|
|
60
|
+
- **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
|
|
59
61
|
- **Enable automation** to produce numerous variant of the same payload.
|
|
60
62
|
|
|
61
63
|
The main benefit of POF is customizability, you can generate your payload however you want, choose the obfuscation you want and combine them.
|
|
@@ -173,12 +175,58 @@ globals()["".join([chr(ord(i) - 3) for i in "bbvqlwolxebb"[::-1]])].__dict__[
|
|
|
173
175
|
|
|
174
176
|
More examples and usage can be found in `examples/` or in the section bellow.
|
|
175
177
|
|
|
178
|
+
## Effectiveness
|
|
179
|
+
|
|
180
|
+
The tests are done using the default configuration of pof, no sandbox evasion
|
|
181
|
+
technique was used with obfuscation. Also note that I haven't tested the
|
|
182
|
+
malware to see if they still work, they should, but they may break with
|
|
183
|
+
obfuscation.
|
|
184
|
+
|
|
185
|
+
Obfuscating a [Lazarus malware](https://bazaar.abuse.ch/sample/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b/),
|
|
186
|
+
we go from
|
|
187
|
+
[18/63](https://www.virustotal.com/gui/file/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b)
|
|
188
|
+
to
|
|
189
|
+
[0/63](https://www.virustotal.com/gui/file/2f427bc784e2a865d8f000c21f366cb8459842f97c56465cbe963f221b3e115a)
|
|
190
|
+
on virus total:
|
|
191
|
+

|
|
192
|
+
|
|
193
|
+
Obfuscating [BTC-Clipper](https://github.com/NightfallGT/BTC-Clipper), we go
|
|
194
|
+
from
|
|
195
|
+
[13/64](https://www.virustotal.com/gui/file/9817d8de9bf7d2740b5b66e30ec1afdd98d7d119074a61cbba05514d4ebdc149)
|
|
196
|
+
to
|
|
197
|
+
[0/63](https://www.virustotal.com/gui/file/71631daa26fe6c2cf77d282a16f8b3fd31e4794b63709b956599563b95e64816)
|
|
198
|
+
on virus total:
|
|
199
|
+

|
|
200
|
+
|
|
201
|
+
Obfuscating a
|
|
202
|
+
[Braodo malware](https://bazaar.abuse.ch/sample/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f/),
|
|
203
|
+
we go from
|
|
204
|
+
[10/61](https://www.virustotal.com/gui/file/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f)
|
|
205
|
+
to
|
|
206
|
+
[0/63](https://www.virustotal.com/gui/file/8791188aaf7655093307e46fa68e3705ee7249cb81e05ea416ae96ad2fd2f0f2)
|
|
207
|
+
on virus total:
|
|
208
|
+

|
|
209
|
+
|
|
210
|
+
Obfuscating [Python-File-Stealer](https://github.com/KrizzhSriskantharajah-UK/Python-File-Stealer),
|
|
211
|
+
we go from
|
|
212
|
+
[4/63](https://www.virustotal.com/gui/file/2fc798f1df42adae3af2f7d2623edc74f6b8f08a7ae16ef3b67305c4ad668c82)
|
|
213
|
+
to
|
|
214
|
+
[0/63](https://www.virustotal.com/gui/file/8d529e6ee2806986ca376a427d683fdf6980d6332134e4759d790d604d6b5dcb)
|
|
215
|
+
on virus total:
|
|
216
|
+

|
|
217
|
+
|
|
176
218
|
## Install
|
|
177
219
|
|
|
178
220
|
There are multiple installation options, with PIP, a virtualenv, a container, or with Nix.
|
|
179
221
|
|
|
180
222
|
There is also the option to run the web server, see [server/README.md](./server/README.md).
|
|
181
223
|
|
|
224
|
+
And you can try it without installing anything:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
echo 'print("Hello, world!")' | curl -X POST -d @- https://pof.run
|
|
228
|
+
```
|
|
229
|
+
|
|
182
230
|
### 1. PIP
|
|
183
231
|
|
|
184
232
|
From [pypi](https://pypi.org/project/python-obfuscation-framework):
|
|
@@ -303,24 +351,37 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
303
351
|
Source in `examples/source.py`.
|
|
304
352
|
|
|
305
353
|
```python
|
|
306
|
-
import
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
354
|
+
import os as pT2Ic6
|
|
355
|
+
|
|
356
|
+
def SeIpTxc():
|
|
357
|
+
"""Get Linux release info from /etc/os-release."""
|
|
358
|
+
pDkFbLZO = '/etc/os-release'
|
|
359
|
+
if not pT2Ic6.path.exists(pDkFbLZO):
|
|
360
|
+
print('OS release file not found. This might not be a Linux system.')
|
|
361
|
+
return None
|
|
362
|
+
rDq = {}
|
|
363
|
+
try:
|
|
364
|
+
with open(pDkFbLZO, 'r') as bpBm:
|
|
365
|
+
for UOFvQ in bpBm:
|
|
366
|
+
if not UOFvQ or '=' not in UOFvQ:
|
|
367
|
+
continue
|
|
368
|
+
aSFP, UUka_V_7 = UOFvQ.ObwKdQ6LVz().g54Qp('=', 1)
|
|
369
|
+
UUka_V_7 = UUka_V_7.ObwKdQ6LVz('"\'\n')
|
|
370
|
+
rDq[aSFP] = UUka_V_7
|
|
371
|
+
print('\nLinux Release Information:')
|
|
372
|
+
print(f"Distribution: {rDq.IDiXt2('NAME', 'Unknown')}")
|
|
373
|
+
print(f"Version: {rDq.IDiXt2('VERSION', 'Unknown')}")
|
|
374
|
+
print(f"Version ID: {rDq.IDiXt2('VERSION_ID', 'Unknown')}")
|
|
375
|
+
print(f"Pretty Name: {rDq.IDiXt2('PRETTY_NAME', 'Unknown')}")
|
|
376
|
+
return rDq
|
|
377
|
+
except Exception as FXfc:
|
|
378
|
+
print(f'Error reading release file: {FXfc}')
|
|
379
|
+
return None
|
|
380
|
+
if __name__ == '__main__':
|
|
381
|
+
if pT2Ic6.name == 'posix' and pT2Ic6.path.exists('/etc/os-release'):
|
|
382
|
+
Sd65C = SeIpTxc()
|
|
383
|
+
else:
|
|
384
|
+
print('This script is designed for Linux systems.')
|
|
324
385
|
```
|
|
325
386
|
|
|
326
387
|
> [!WARNING]
|
|
@@ -352,6 +413,9 @@ print('Helnelemd'.replace('nelem','lo, worl'))
|
|
|
352
413
|
# One on n
|
|
353
414
|
print("".join([d if g%3==0 else""for g,d in enumerate('H9IesYlvJl5loU4,dK nDw51ovsrozl0UdoI!jL')]))
|
|
354
415
|
|
|
416
|
+
# Hex-encoded
|
|
417
|
+
print('\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64')
|
|
418
|
+
|
|
355
419
|
# Unicode
|
|
356
420
|
print('\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0077\u006f\u0072\u006c\u0064')
|
|
357
421
|
|
|
@@ -393,32 +457,58 @@ print((True+True+True+True+True+True+True+True+True+True+True+True+True+True+Tru
|
|
|
393
457
|
Move every variable at the top of the file with random names.
|
|
394
458
|
|
|
395
459
|
```python
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
460
|
+
N842V="\"'\n"
|
|
461
|
+
gvBXIX='NAME'
|
|
462
|
+
Lzxdy='VERSION'
|
|
463
|
+
NklI="__main__"
|
|
464
|
+
IoTpEBJ='VERSION_ID'
|
|
465
|
+
eQqDDpOL=1
|
|
466
|
+
IpEPxvQ="This script is designed for Linux systems."
|
|
467
|
+
ka6U_Q='PRETTY_NAME'
|
|
468
|
+
hCf5UQQT="="
|
|
469
|
+
GMUC6z="/etc/os-release"
|
|
470
|
+
eOa=Exception
|
|
471
|
+
CCCs=None
|
|
472
|
+
EUr2fN=open
|
|
473
|
+
wGDb="r"
|
|
474
|
+
hm8="OS release file not found. This might not be a Linux system."
|
|
475
|
+
QElu="posix"
|
|
476
|
+
fNdZY9=__name__
|
|
477
|
+
LvMs="\nLinux Release Information:"
|
|
478
|
+
uFCf7Vy='Unknown'
|
|
479
|
+
joyHA=print
|
|
480
|
+
import os
|
|
481
|
+
|
|
482
|
+
def get_linux_release_info():
|
|
483
|
+
"""Get Linux release info from /etc/os-release."""
|
|
484
|
+
release_file=GMUC6z
|
|
485
|
+
if not os.path.exists(release_file):
|
|
486
|
+
joyHA(hm8)
|
|
487
|
+
return CCCs
|
|
488
|
+
release_info={}
|
|
489
|
+
try:
|
|
490
|
+
with EUr2fN(release_file,wGDb)as f:
|
|
491
|
+
for line in f:
|
|
492
|
+
if not line or hCf5UQQT not in line:
|
|
493
|
+
continue
|
|
494
|
+
key,value=line.strip().split(hCf5UQQT,eQqDDpOL)
|
|
495
|
+
value=value.strip(N842V)
|
|
496
|
+
release_info[key]=value
|
|
497
|
+
joyHA(LvMs)
|
|
498
|
+
joyHA(f"Distribution: {release_info.get(gvBXIX,uFCf7Vy)}")
|
|
499
|
+
joyHA(f"Version: {release_info.get(Lzxdy,uFCf7Vy)}")
|
|
500
|
+
joyHA(f"Version ID: {release_info.get(IoTpEBJ,uFCf7Vy)}")
|
|
501
|
+
joyHA(f"Pretty Name: {release_info.get(ka6U_Q,uFCf7Vy)}")
|
|
502
|
+
return release_info
|
|
503
|
+
except eOa as e:
|
|
504
|
+
joyHA(f"Error reading release file: {e}")
|
|
505
|
+
return CCCs
|
|
506
|
+
|
|
507
|
+
if fNdZY9==NklI:
|
|
508
|
+
if os.name==QElu and os.path.exists(GMUC6z):
|
|
509
|
+
release_details=get_linux_release_info()
|
|
510
|
+
else:
|
|
511
|
+
joyHA(IpEPxvQ)
|
|
422
512
|
```
|
|
423
513
|
|
|
424
514
|
#### BuiltinsObfuscator
|
|
@@ -460,26 +550,37 @@ Replaces call of global functions with `globals()['func_name']()`.
|
|
|
460
550
|
Source in `examples/source.py`.
|
|
461
551
|
|
|
462
552
|
```python
|
|
463
|
-
import
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
553
|
+
import os
|
|
554
|
+
|
|
555
|
+
def get_linux_release_info():
|
|
556
|
+
release_file="/etc/os-release"
|
|
557
|
+
if not os.path.exists(release_file):
|
|
558
|
+
print("OS release file not found. This might not be a Linux system.")
|
|
559
|
+
return None
|
|
560
|
+
release_info={}
|
|
561
|
+
try:
|
|
562
|
+
with open(release_file,"r")as f:
|
|
563
|
+
for line in f:
|
|
564
|
+
if not line or"="not in line:
|
|
565
|
+
continue
|
|
566
|
+
key,value=line.strip().split("=",1)
|
|
567
|
+
value=value.strip("\"'\n")
|
|
568
|
+
release_info[key]=value
|
|
569
|
+
print("\nLinux Release Information:")
|
|
570
|
+
print(f"Distribution: {release_info.get('NAME','Unknown')}")
|
|
571
|
+
print(f"Version: {release_info.get('VERSION','Unknown')}")
|
|
572
|
+
print(f"Version ID: {release_info.get('VERSION_ID','Unknown')}")
|
|
573
|
+
print(f"Pretty Name: {release_info.get('PRETTY_NAME','Unknown')}")
|
|
574
|
+
return release_info
|
|
575
|
+
except Exception as e:
|
|
576
|
+
print(f"Error reading release file: {e}")
|
|
577
|
+
return None
|
|
578
|
+
|
|
579
|
+
if __name__=="__main__":
|
|
580
|
+
if os.name=="posix"and os.path.exists("/etc/os-release"):
|
|
581
|
+
release_details=globals()['get_linux_release_info']()
|
|
582
|
+
else:
|
|
583
|
+
print("This script is designed for Linux systems.")
|
|
483
584
|
```
|
|
484
585
|
|
|
485
586
|
#### ShiftObfuscator
|
|
@@ -513,6 +614,19 @@ def sntdecode(encoded):
|
|
|
513
614
|
exec(sntdecode('\t\t\t \t\t\t \t \t\t \t \t \t\t \t\t\t \t\t\t \t \t \t \t \t\t\t \t \t \t\t \t \t \t\t \t\t \t\t \t\t \t\t \t\t\t\t \t \t\t \t \t\t\t \t\t\t \t\t \t\t\t\t \t\t\t \t \t\t \t\t \t\t \t \t \t\t\t \t \t \t \t \t '))
|
|
514
615
|
```
|
|
515
616
|
|
|
617
|
+
#### WhitespaceObfuscator
|
|
618
|
+
|
|
619
|
+
Use whitespace and zero width whitespace `\u200B`.
|
|
620
|
+
|
|
621
|
+
```python
|
|
622
|
+
def wsdecode(encoded):
|
|
623
|
+
msg_bin=encoded.replace(" ","0").replace('\u200b',"1")
|
|
624
|
+
n=int(msg_bin,2)
|
|
625
|
+
return n.to_bytes((n.bit_length()+7)//8,"big")
|
|
626
|
+
|
|
627
|
+
exec(wsdecode(" "))
|
|
628
|
+
```
|
|
629
|
+
|
|
516
630
|
#### RC4Obfuscator
|
|
517
631
|
|
|
518
632
|
Warning: the RC4 obfuscator (and other cipher obfuscators) will combine both, the cipher text and the key in the same file, this is obviously not secure, and should never be used for security purposes. The idea behind this obfuscator is to fool humans, AV, EDR, network TAP etc. not to be secured and safe.
|
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
4
4
|
|
|
5
|
+
Test it at [pof.run](https://pof.run).
|
|
6
|
+
|
|
5
7
|
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
6
8
|
|
|
7
9
|
pof will allow you to:
|
|
8
10
|
|
|
9
|
-
- **
|
|
10
|
-
- **Slow down static analysis** of the payload or the stage.
|
|
11
|
+
- **Slow down static analysis** with layered obfuscation and novel techniques.
|
|
11
12
|
- **Evade sandbox** by checking host information like MAC addresses, CPU count, memory count, uptime, and much more.
|
|
12
13
|
- **Add guardrails** to ensure the payload only execute on the desired target host by verifying for username, hostname, domainame and much more.
|
|
13
14
|
- **Prevent dynamic analysis** by detecting debugging or tracing via malloc.
|
|
15
|
+
- **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
|
|
14
16
|
- **Enable automation** to produce numerous variant of the same payload.
|
|
15
17
|
|
|
16
18
|
The main benefit of POF is customizability, you can generate your payload however you want, choose the obfuscation you want and combine them.
|
|
@@ -128,12 +130,58 @@ globals()["".join([chr(ord(i) - 3) for i in "bbvqlwolxebb"[::-1]])].__dict__[
|
|
|
128
130
|
|
|
129
131
|
More examples and usage can be found in `examples/` or in the section bellow.
|
|
130
132
|
|
|
133
|
+
## Effectiveness
|
|
134
|
+
|
|
135
|
+
The tests are done using the default configuration of pof, no sandbox evasion
|
|
136
|
+
technique was used with obfuscation. Also note that I haven't tested the
|
|
137
|
+
malware to see if they still work, they should, but they may break with
|
|
138
|
+
obfuscation.
|
|
139
|
+
|
|
140
|
+
Obfuscating a [Lazarus malware](https://bazaar.abuse.ch/sample/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b/),
|
|
141
|
+
we go from
|
|
142
|
+
[18/63](https://www.virustotal.com/gui/file/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b)
|
|
143
|
+
to
|
|
144
|
+
[0/63](https://www.virustotal.com/gui/file/2f427bc784e2a865d8f000c21f366cb8459842f97c56465cbe963f221b3e115a)
|
|
145
|
+
on virus total:
|
|
146
|
+

|
|
147
|
+
|
|
148
|
+
Obfuscating [BTC-Clipper](https://github.com/NightfallGT/BTC-Clipper), we go
|
|
149
|
+
from
|
|
150
|
+
[13/64](https://www.virustotal.com/gui/file/9817d8de9bf7d2740b5b66e30ec1afdd98d7d119074a61cbba05514d4ebdc149)
|
|
151
|
+
to
|
|
152
|
+
[0/63](https://www.virustotal.com/gui/file/71631daa26fe6c2cf77d282a16f8b3fd31e4794b63709b956599563b95e64816)
|
|
153
|
+
on virus total:
|
|
154
|
+

|
|
155
|
+
|
|
156
|
+
Obfuscating a
|
|
157
|
+
[Braodo malware](https://bazaar.abuse.ch/sample/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f/),
|
|
158
|
+
we go from
|
|
159
|
+
[10/61](https://www.virustotal.com/gui/file/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f)
|
|
160
|
+
to
|
|
161
|
+
[0/63](https://www.virustotal.com/gui/file/8791188aaf7655093307e46fa68e3705ee7249cb81e05ea416ae96ad2fd2f0f2)
|
|
162
|
+
on virus total:
|
|
163
|
+

|
|
164
|
+
|
|
165
|
+
Obfuscating [Python-File-Stealer](https://github.com/KrizzhSriskantharajah-UK/Python-File-Stealer),
|
|
166
|
+
we go from
|
|
167
|
+
[4/63](https://www.virustotal.com/gui/file/2fc798f1df42adae3af2f7d2623edc74f6b8f08a7ae16ef3b67305c4ad668c82)
|
|
168
|
+
to
|
|
169
|
+
[0/63](https://www.virustotal.com/gui/file/8d529e6ee2806986ca376a427d683fdf6980d6332134e4759d790d604d6b5dcb)
|
|
170
|
+
on virus total:
|
|
171
|
+

|
|
172
|
+
|
|
131
173
|
## Install
|
|
132
174
|
|
|
133
175
|
There are multiple installation options, with PIP, a virtualenv, a container, or with Nix.
|
|
134
176
|
|
|
135
177
|
There is also the option to run the web server, see [server/README.md](./server/README.md).
|
|
136
178
|
|
|
179
|
+
And you can try it without installing anything:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
echo 'print("Hello, world!")' | curl -X POST -d @- https://pof.run
|
|
183
|
+
```
|
|
184
|
+
|
|
137
185
|
### 1. PIP
|
|
138
186
|
|
|
139
187
|
From [pypi](https://pypi.org/project/python-obfuscation-framework):
|
|
@@ -258,24 +306,37 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
258
306
|
Source in `examples/source.py`.
|
|
259
307
|
|
|
260
308
|
```python
|
|
261
|
-
import
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
309
|
+
import os as pT2Ic6
|
|
310
|
+
|
|
311
|
+
def SeIpTxc():
|
|
312
|
+
"""Get Linux release info from /etc/os-release."""
|
|
313
|
+
pDkFbLZO = '/etc/os-release'
|
|
314
|
+
if not pT2Ic6.path.exists(pDkFbLZO):
|
|
315
|
+
print('OS release file not found. This might not be a Linux system.')
|
|
316
|
+
return None
|
|
317
|
+
rDq = {}
|
|
318
|
+
try:
|
|
319
|
+
with open(pDkFbLZO, 'r') as bpBm:
|
|
320
|
+
for UOFvQ in bpBm:
|
|
321
|
+
if not UOFvQ or '=' not in UOFvQ:
|
|
322
|
+
continue
|
|
323
|
+
aSFP, UUka_V_7 = UOFvQ.ObwKdQ6LVz().g54Qp('=', 1)
|
|
324
|
+
UUka_V_7 = UUka_V_7.ObwKdQ6LVz('"\'\n')
|
|
325
|
+
rDq[aSFP] = UUka_V_7
|
|
326
|
+
print('\nLinux Release Information:')
|
|
327
|
+
print(f"Distribution: {rDq.IDiXt2('NAME', 'Unknown')}")
|
|
328
|
+
print(f"Version: {rDq.IDiXt2('VERSION', 'Unknown')}")
|
|
329
|
+
print(f"Version ID: {rDq.IDiXt2('VERSION_ID', 'Unknown')}")
|
|
330
|
+
print(f"Pretty Name: {rDq.IDiXt2('PRETTY_NAME', 'Unknown')}")
|
|
331
|
+
return rDq
|
|
332
|
+
except Exception as FXfc:
|
|
333
|
+
print(f'Error reading release file: {FXfc}')
|
|
334
|
+
return None
|
|
335
|
+
if __name__ == '__main__':
|
|
336
|
+
if pT2Ic6.name == 'posix' and pT2Ic6.path.exists('/etc/os-release'):
|
|
337
|
+
Sd65C = SeIpTxc()
|
|
338
|
+
else:
|
|
339
|
+
print('This script is designed for Linux systems.')
|
|
279
340
|
```
|
|
280
341
|
|
|
281
342
|
> [!WARNING]
|
|
@@ -307,6 +368,9 @@ print('Helnelemd'.replace('nelem','lo, worl'))
|
|
|
307
368
|
# One on n
|
|
308
369
|
print("".join([d if g%3==0 else""for g,d in enumerate('H9IesYlvJl5loU4,dK nDw51ovsrozl0UdoI!jL')]))
|
|
309
370
|
|
|
371
|
+
# Hex-encoded
|
|
372
|
+
print('\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64')
|
|
373
|
+
|
|
310
374
|
# Unicode
|
|
311
375
|
print('\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0077\u006f\u0072\u006c\u0064')
|
|
312
376
|
|
|
@@ -348,32 +412,58 @@ print((True+True+True+True+True+True+True+True+True+True+True+True+True+True+Tru
|
|
|
348
412
|
Move every variable at the top of the file with random names.
|
|
349
413
|
|
|
350
414
|
```python
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
415
|
+
N842V="\"'\n"
|
|
416
|
+
gvBXIX='NAME'
|
|
417
|
+
Lzxdy='VERSION'
|
|
418
|
+
NklI="__main__"
|
|
419
|
+
IoTpEBJ='VERSION_ID'
|
|
420
|
+
eQqDDpOL=1
|
|
421
|
+
IpEPxvQ="This script is designed for Linux systems."
|
|
422
|
+
ka6U_Q='PRETTY_NAME'
|
|
423
|
+
hCf5UQQT="="
|
|
424
|
+
GMUC6z="/etc/os-release"
|
|
425
|
+
eOa=Exception
|
|
426
|
+
CCCs=None
|
|
427
|
+
EUr2fN=open
|
|
428
|
+
wGDb="r"
|
|
429
|
+
hm8="OS release file not found. This might not be a Linux system."
|
|
430
|
+
QElu="posix"
|
|
431
|
+
fNdZY9=__name__
|
|
432
|
+
LvMs="\nLinux Release Information:"
|
|
433
|
+
uFCf7Vy='Unknown'
|
|
434
|
+
joyHA=print
|
|
435
|
+
import os
|
|
436
|
+
|
|
437
|
+
def get_linux_release_info():
|
|
438
|
+
"""Get Linux release info from /etc/os-release."""
|
|
439
|
+
release_file=GMUC6z
|
|
440
|
+
if not os.path.exists(release_file):
|
|
441
|
+
joyHA(hm8)
|
|
442
|
+
return CCCs
|
|
443
|
+
release_info={}
|
|
444
|
+
try:
|
|
445
|
+
with EUr2fN(release_file,wGDb)as f:
|
|
446
|
+
for line in f:
|
|
447
|
+
if not line or hCf5UQQT not in line:
|
|
448
|
+
continue
|
|
449
|
+
key,value=line.strip().split(hCf5UQQT,eQqDDpOL)
|
|
450
|
+
value=value.strip(N842V)
|
|
451
|
+
release_info[key]=value
|
|
452
|
+
joyHA(LvMs)
|
|
453
|
+
joyHA(f"Distribution: {release_info.get(gvBXIX,uFCf7Vy)}")
|
|
454
|
+
joyHA(f"Version: {release_info.get(Lzxdy,uFCf7Vy)}")
|
|
455
|
+
joyHA(f"Version ID: {release_info.get(IoTpEBJ,uFCf7Vy)}")
|
|
456
|
+
joyHA(f"Pretty Name: {release_info.get(ka6U_Q,uFCf7Vy)}")
|
|
457
|
+
return release_info
|
|
458
|
+
except eOa as e:
|
|
459
|
+
joyHA(f"Error reading release file: {e}")
|
|
460
|
+
return CCCs
|
|
461
|
+
|
|
462
|
+
if fNdZY9==NklI:
|
|
463
|
+
if os.name==QElu and os.path.exists(GMUC6z):
|
|
464
|
+
release_details=get_linux_release_info()
|
|
465
|
+
else:
|
|
466
|
+
joyHA(IpEPxvQ)
|
|
377
467
|
```
|
|
378
468
|
|
|
379
469
|
#### BuiltinsObfuscator
|
|
@@ -415,26 +505,37 @@ Replaces call of global functions with `globals()['func_name']()`.
|
|
|
415
505
|
Source in `examples/source.py`.
|
|
416
506
|
|
|
417
507
|
```python
|
|
418
|
-
import
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
508
|
+
import os
|
|
509
|
+
|
|
510
|
+
def get_linux_release_info():
|
|
511
|
+
release_file="/etc/os-release"
|
|
512
|
+
if not os.path.exists(release_file):
|
|
513
|
+
print("OS release file not found. This might not be a Linux system.")
|
|
514
|
+
return None
|
|
515
|
+
release_info={}
|
|
516
|
+
try:
|
|
517
|
+
with open(release_file,"r")as f:
|
|
518
|
+
for line in f:
|
|
519
|
+
if not line or"="not in line:
|
|
520
|
+
continue
|
|
521
|
+
key,value=line.strip().split("=",1)
|
|
522
|
+
value=value.strip("\"'\n")
|
|
523
|
+
release_info[key]=value
|
|
524
|
+
print("\nLinux Release Information:")
|
|
525
|
+
print(f"Distribution: {release_info.get('NAME','Unknown')}")
|
|
526
|
+
print(f"Version: {release_info.get('VERSION','Unknown')}")
|
|
527
|
+
print(f"Version ID: {release_info.get('VERSION_ID','Unknown')}")
|
|
528
|
+
print(f"Pretty Name: {release_info.get('PRETTY_NAME','Unknown')}")
|
|
529
|
+
return release_info
|
|
530
|
+
except Exception as e:
|
|
531
|
+
print(f"Error reading release file: {e}")
|
|
532
|
+
return None
|
|
533
|
+
|
|
534
|
+
if __name__=="__main__":
|
|
535
|
+
if os.name=="posix"and os.path.exists("/etc/os-release"):
|
|
536
|
+
release_details=globals()['get_linux_release_info']()
|
|
537
|
+
else:
|
|
538
|
+
print("This script is designed for Linux systems.")
|
|
438
539
|
```
|
|
439
540
|
|
|
440
541
|
#### ShiftObfuscator
|
|
@@ -468,6 +569,19 @@ def sntdecode(encoded):
|
|
|
468
569
|
exec(sntdecode('\t\t\t \t\t\t \t \t\t \t \t \t\t \t\t\t \t\t\t \t \t \t \t \t\t\t \t \t \t\t \t \t \t\t \t\t \t\t \t\t \t\t \t\t\t\t \t \t\t \t \t\t\t \t\t\t \t\t \t\t\t\t \t\t\t \t \t\t \t\t \t\t \t \t \t\t\t \t \t \t \t \t '))
|
|
469
570
|
```
|
|
470
571
|
|
|
572
|
+
#### WhitespaceObfuscator
|
|
573
|
+
|
|
574
|
+
Use whitespace and zero width whitespace `\u200B`.
|
|
575
|
+
|
|
576
|
+
```python
|
|
577
|
+
def wsdecode(encoded):
|
|
578
|
+
msg_bin=encoded.replace(" ","0").replace('\u200b',"1")
|
|
579
|
+
n=int(msg_bin,2)
|
|
580
|
+
return n.to_bytes((n.bit_length()+7)//8,"big")
|
|
581
|
+
|
|
582
|
+
exec(wsdecode(" "))
|
|
583
|
+
```
|
|
584
|
+
|
|
471
585
|
#### RC4Obfuscator
|
|
472
586
|
|
|
473
587
|
Warning: the RC4 obfuscator (and other cipher obfuscators) will combine both, the cipher text and the key in the same file, this is obviously not secure, and should never be used for security purposes. The idea behind this obfuscator is to fool humans, AV, EDR, network TAP etc. not to be secured and safe.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# POF, a free and open source Python obfuscation framework.
|
|
2
|
-
# Copyright (C) 2022 -
|
|
2
|
+
# Copyright (C) 2022 - 2026 Deoktr
|
|
3
3
|
#
|
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# POF, a free and open source Python obfuscation framework.
|
|
2
|
-
# Copyright (C) 2022 -
|
|
2
|
+
# Copyright (C) 2022 - 2026 Deoktr
|
|
3
3
|
#
|
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
|
5
5
|
# it under the terms of the GNU General Public License as published by
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# POF, a free and open source Python obfuscation framework.
|
|
2
|
-
# Copyright (C) 2022 -
|
|
2
|
+
# Copyright (C) 2022 - 2026 Deoktr
|
|
3
3
|
#
|
|
4
4
|
# This program is free software: you can redistribute it and/or modify
|
|
5
5
|
# it under the terms of the GNU General Public License as published by
|