python-obfuscation-framework 1.8.0__tar.gz → 1.9.1__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.8.0/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.9.1}/PKG-INFO +30 -33
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/README.md +26 -29
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/main.py +9 -2
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/__init__.py +2 -0
- python_obfuscation_framework-1.9.1/pof/obfuscator/variables.py +116 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pyproject.toml +4 -4
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1/python_obfuscation_framework.egg-info}/PKG-INFO +30 -33
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/python_obfuscation_framework.egg-info/SOURCES.txt +1 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/LICENSE +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/MANIFEST.in +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/__main__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/cli.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/cli_v2.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/errors.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/argv.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/base.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/cpu/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/cpu/cpu_count.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/directory_exist.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/directory_list_exist.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/directory_list_missing.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/directory_missing.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/exec_method.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/executable_path.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/file_exist.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/file_list_exist.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/file_list_missing.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/file_missing.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/fs/tmp.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/hardware/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/hardware/ram_count.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/hooks/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/hooks/debugger.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/hooks/tracemalloc.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/human/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/human/p.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/human/prompt.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/integrity.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/multi.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/domain.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/hostname.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/uid.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/username.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/processes/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/processes/proc_count.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/expire.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/uptime.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/utc.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/utils.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/logger.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/boolean.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/builtins.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/cipher/deep_encryption.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/cipher/xor.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/constants.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/definitions.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/encoding/whitespace.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/esoteric/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/esoteric/call.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/esoteric/doc.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/esoteric/globals.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/esoteric/imports.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/extract_variables.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/junk/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/junk/add_comments.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/junk/add_newlines.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/names.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/names_rope.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/numbers.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/other/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/other/tokens.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/comments.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/exceptions.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/indents.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/loggings.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/loggings_old.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/newline.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/remove/print.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/restructure.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/stegano/docstrings.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/strings.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/download.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/image.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/lots/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/lots/cl1pnet.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/lots/pastebin.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/lots/pasters.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/stager/quine.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b3.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/encoding/whitespace.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/entropy.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/extract_names.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/format.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/advanced.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/base.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/basic.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/comments.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/comments.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/names.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/generator/unicode.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/se/homoglyphs.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/se/homoglyphs.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/utils/tokens.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/python_obfuscation_framework.egg-info/requires.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/setup.cfg +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_a85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_b16.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_b32.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_b32hex.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_b64.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_b85.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_binascii.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_boolean.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_call.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_comments.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_doc.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_docstrings.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_exceptions.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_names/code/out.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_names/code/source.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_names/test_names.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_number.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_print.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_snt.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_tokens.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/test_xor.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/obfuscator/utils.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/pyproject.toml +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/utils/se/test_homoglyphs.py +0 -0
- {python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/tests/utils/test_generator.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.1
|
|
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>
|
|
7
7
|
License-Expression: GPL-3.0-or-later
|
|
8
|
-
Project-URL: Homepage, https://github.com/deoktr/
|
|
9
|
-
Project-URL: Bug Reports, https://github.com/deoktr/
|
|
10
|
-
Project-URL: Source, https://github.com/deoktr/
|
|
8
|
+
Project-URL: Homepage, https://github.com/deoktr/Python-Obfuscation-Framework
|
|
9
|
+
Project-URL: Bug Reports, https://github.com/deoktr/Python-Obfuscation-Framework/issues
|
|
10
|
+
Project-URL: Source, https://github.com/deoktr/Python-Obfuscation-Framework/
|
|
11
11
|
Keywords: cybersecurity,obfuscation,obfuscator,stager,payload
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -43,13 +43,13 @@ Requires-Dist: twine; extra == "build"
|
|
|
43
43
|
Requires-Dist: check-manifest; extra == "build"
|
|
44
44
|
Dynamic: license-file
|
|
45
45
|
|
|
46
|
-
# pof
|
|
46
|
+
# Python Obfuscation Framework - pof
|
|
47
47
|
|
|
48
48
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
49
49
|
|
|
50
50
|
Test it at [pof.run](https://pof.run).
|
|
51
51
|
|
|
52
|
-
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
52
|
+
Python Obfuscation Framework (pof), a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
53
53
|
|
|
54
54
|
pof will allow you to:
|
|
55
55
|
|
|
@@ -313,51 +313,48 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
313
313
|
|
|
314
314
|
### Obfuscator
|
|
315
315
|
|
|
316
|
-
`
|
|
316
|
+
`VariablesObfuscator` the most basic obfuscator will rename variables.
|
|
317
317
|
|
|
318
318
|
Source in `examples/source.py`.
|
|
319
319
|
|
|
320
320
|
```python
|
|
321
|
-
import os
|
|
321
|
+
import os
|
|
322
322
|
|
|
323
|
-
def
|
|
323
|
+
def get_linux_release_info():
|
|
324
324
|
"""Get Linux release info from /etc/os-release."""
|
|
325
|
-
|
|
326
|
-
if not
|
|
325
|
+
uggNx = '/etc/os-release'
|
|
326
|
+
if not os.path.exists(uggNx):
|
|
327
327
|
print('OS release file not found. This might not be a Linux system.')
|
|
328
328
|
return None
|
|
329
|
-
|
|
329
|
+
LY3mN = {}
|
|
330
330
|
try:
|
|
331
|
-
with open(
|
|
332
|
-
for
|
|
333
|
-
if not
|
|
331
|
+
with open(uggNx, 'r') as kj0:
|
|
332
|
+
for Stv9o in kj0:
|
|
333
|
+
if not Stv9o or '=' not in Stv9o:
|
|
334
334
|
continue
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
335
|
+
l0j, QE5kCKYwMe = Stv9o.strip().split('=', 1)
|
|
336
|
+
QE5kCKYwMe = QE5kCKYwMe.strip('"\'\n')
|
|
337
|
+
LY3mN[l0j] = QE5kCKYwMe
|
|
338
338
|
print('\nLinux Release Information:')
|
|
339
|
-
print(f"Distribution: {
|
|
340
|
-
print(f"Version: {
|
|
341
|
-
print(f"Version ID: {
|
|
342
|
-
print(f"Pretty Name: {
|
|
343
|
-
return
|
|
344
|
-
except Exception as
|
|
345
|
-
print(f'Error reading release file: {
|
|
339
|
+
print(f"Distribution: {LY3mN.get('NAME', 'Unknown')}")
|
|
340
|
+
print(f"Version: {LY3mN.get('VERSION', 'Unknown')}")
|
|
341
|
+
print(f"Version ID: {LY3mN.get('VERSION_ID', 'Unknown')}")
|
|
342
|
+
print(f"Pretty Name: {LY3mN.get('PRETTY_NAME', 'Unknown')}")
|
|
343
|
+
return LY3mN
|
|
344
|
+
except Exception as e:
|
|
345
|
+
print(f'Error reading release file: {e}')
|
|
346
346
|
return None
|
|
347
347
|
if __name__ == '__main__':
|
|
348
|
-
if
|
|
349
|
-
|
|
348
|
+
if os.name == 'posix' and os.path.exists('/etc/os-release'):
|
|
349
|
+
E_R72 = get_linux_release_info()
|
|
350
350
|
else:
|
|
351
351
|
print('This script is designed for Linux systems.')
|
|
352
352
|
```
|
|
353
353
|
|
|
354
|
-
|
|
355
|
-
> Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`.
|
|
354
|
+
`DefinitionsObfuscator` obfuscate function names.
|
|
356
355
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
> [!NOTE]
|
|
360
|
-
> There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
356
|
+
> [!WARNING]
|
|
357
|
+
> `NamesObfuscator` obfuscator is renaming variables, classes, functions, and imports. Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`. There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
361
358
|
|
|
362
359
|
Other very basic obfuscation functions are done by specific obfuscators like:
|
|
363
360
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# pof
|
|
1
|
+
# Python Obfuscation Framework - pof
|
|
2
2
|
|
|
3
3
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
4
4
|
|
|
5
5
|
Test it at [pof.run](https://pof.run).
|
|
6
6
|
|
|
7
|
-
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
7
|
+
Python Obfuscation Framework (pof), a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
8
8
|
|
|
9
9
|
pof will allow you to:
|
|
10
10
|
|
|
@@ -268,51 +268,48 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
268
268
|
|
|
269
269
|
### Obfuscator
|
|
270
270
|
|
|
271
|
-
`
|
|
271
|
+
`VariablesObfuscator` the most basic obfuscator will rename variables.
|
|
272
272
|
|
|
273
273
|
Source in `examples/source.py`.
|
|
274
274
|
|
|
275
275
|
```python
|
|
276
|
-
import os
|
|
276
|
+
import os
|
|
277
277
|
|
|
278
|
-
def
|
|
278
|
+
def get_linux_release_info():
|
|
279
279
|
"""Get Linux release info from /etc/os-release."""
|
|
280
|
-
|
|
281
|
-
if not
|
|
280
|
+
uggNx = '/etc/os-release'
|
|
281
|
+
if not os.path.exists(uggNx):
|
|
282
282
|
print('OS release file not found. This might not be a Linux system.')
|
|
283
283
|
return None
|
|
284
|
-
|
|
284
|
+
LY3mN = {}
|
|
285
285
|
try:
|
|
286
|
-
with open(
|
|
287
|
-
for
|
|
288
|
-
if not
|
|
286
|
+
with open(uggNx, 'r') as kj0:
|
|
287
|
+
for Stv9o in kj0:
|
|
288
|
+
if not Stv9o or '=' not in Stv9o:
|
|
289
289
|
continue
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
290
|
+
l0j, QE5kCKYwMe = Stv9o.strip().split('=', 1)
|
|
291
|
+
QE5kCKYwMe = QE5kCKYwMe.strip('"\'\n')
|
|
292
|
+
LY3mN[l0j] = QE5kCKYwMe
|
|
293
293
|
print('\nLinux Release Information:')
|
|
294
|
-
print(f"Distribution: {
|
|
295
|
-
print(f"Version: {
|
|
296
|
-
print(f"Version ID: {
|
|
297
|
-
print(f"Pretty Name: {
|
|
298
|
-
return
|
|
299
|
-
except Exception as
|
|
300
|
-
print(f'Error reading release file: {
|
|
294
|
+
print(f"Distribution: {LY3mN.get('NAME', 'Unknown')}")
|
|
295
|
+
print(f"Version: {LY3mN.get('VERSION', 'Unknown')}")
|
|
296
|
+
print(f"Version ID: {LY3mN.get('VERSION_ID', 'Unknown')}")
|
|
297
|
+
print(f"Pretty Name: {LY3mN.get('PRETTY_NAME', 'Unknown')}")
|
|
298
|
+
return LY3mN
|
|
299
|
+
except Exception as e:
|
|
300
|
+
print(f'Error reading release file: {e}')
|
|
301
301
|
return None
|
|
302
302
|
if __name__ == '__main__':
|
|
303
|
-
if
|
|
304
|
-
|
|
303
|
+
if os.name == 'posix' and os.path.exists('/etc/os-release'):
|
|
304
|
+
E_R72 = get_linux_release_info()
|
|
305
305
|
else:
|
|
306
306
|
print('This script is designed for Linux systems.')
|
|
307
307
|
```
|
|
308
308
|
|
|
309
|
-
|
|
310
|
-
> Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`.
|
|
309
|
+
`DefinitionsObfuscator` obfuscate function names.
|
|
311
310
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
> [!NOTE]
|
|
315
|
-
> There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
311
|
+
> [!WARNING]
|
|
312
|
+
> `NamesObfuscator` obfuscator is renaming variables, classes, functions, and imports. Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`. There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
316
313
|
|
|
317
314
|
Other very basic obfuscation functions are done by specific obfuscators like:
|
|
318
315
|
|
|
@@ -56,6 +56,7 @@ from pof.obfuscator import (
|
|
|
56
56
|
NumberObfuscator,
|
|
57
57
|
PrintObfuscator,
|
|
58
58
|
StringsObfuscator,
|
|
59
|
+
VariablesObfuscator,
|
|
59
60
|
XORObfuscator,
|
|
60
61
|
)
|
|
61
62
|
from pof.stager import ImageStager, RC4Stager
|
|
@@ -178,6 +179,8 @@ class Obfuscator(BaseObfuscator):
|
|
|
178
179
|
# In this context, `baz` would be obfuscated, but it shouldn't because
|
|
179
180
|
# the function is part of the `foo` imported module
|
|
180
181
|
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
182
|
+
# TODO (deoktr): use alternative variable obfuscator using the AST
|
|
183
|
+
# tokens = VariablesObfuscator().obfuscate_tokens(tokens)
|
|
181
184
|
|
|
182
185
|
tokens = GlobalsObfuscator().obfuscate_tokens(tokens)
|
|
183
186
|
tokens = BuiltinsObfuscator().obfuscate_tokens(tokens)
|
|
@@ -238,7 +241,9 @@ class Obfuscator(BaseObfuscator):
|
|
|
238
241
|
tokens = self._get_tokens(source)
|
|
239
242
|
tokens = CommentsObfuscator().obfuscate_tokens(tokens)
|
|
240
243
|
generator = BasicGenerator.alphabet_generator()
|
|
241
|
-
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
244
|
+
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
245
|
+
tokens = VariablesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
246
|
+
tokens = DefinitionsObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
242
247
|
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
243
248
|
tokens = NewlineObfuscator().obfuscate_tokens(tokens)
|
|
244
249
|
return self._untokenize(tokens)
|
|
@@ -313,7 +318,9 @@ class Obfuscator(BaseObfuscator):
|
|
|
313
318
|
# # FIXME (deoktr): breaks if obf_builtins_rate=1 with NamesObfuscator
|
|
314
319
|
# obf_builtins_rate=0,
|
|
315
320
|
# ).obfuscate_tokens(tokens)
|
|
316
|
-
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
321
|
+
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
322
|
+
tokens = VariablesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
323
|
+
tokens = DefinitionsObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
317
324
|
tokens = ConstantsObfuscator(
|
|
318
325
|
generator=generator,
|
|
319
326
|
obf_number_rate=1,
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/obfuscator/__init__.py
RENAMED
|
@@ -57,6 +57,7 @@ from .stegano.ipv6encoding import IPv6Obfuscator
|
|
|
57
57
|
from .stegano.macencoding import MACObfuscator
|
|
58
58
|
from .stegano.uuidencoding import UUIDObfuscator
|
|
59
59
|
from .strings import StringsObfuscator
|
|
60
|
+
from .variables import VariablesObfuscator
|
|
60
61
|
|
|
61
62
|
__all__ = [
|
|
62
63
|
"ASCII85Obfuscator",
|
|
@@ -100,6 +101,7 @@ __all__ = [
|
|
|
100
101
|
"StringsObfuscator",
|
|
101
102
|
"TokensObfuscator",
|
|
102
103
|
"UUIDObfuscator",
|
|
104
|
+
"VariablesObfuscator",
|
|
103
105
|
"WhitespaceObfuscator",
|
|
104
106
|
"XORObfuscator",
|
|
105
107
|
"ZlibObfuscator",
|
|
@@ -0,0 +1,116 @@
|
|
|
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 ast
|
|
18
|
+
import io
|
|
19
|
+
from tokenize import generate_tokens, untokenize
|
|
20
|
+
|
|
21
|
+
from pof.logger import logger
|
|
22
|
+
from pof.utils.generator import BasicGenerator
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AstVarCollector(ast.NodeVisitor):
|
|
26
|
+
def __init__(self, reserved=None):
|
|
27
|
+
if reserved is None:
|
|
28
|
+
reserved = []
|
|
29
|
+
self.reserved = reserved
|
|
30
|
+
|
|
31
|
+
self.assigned = set()
|
|
32
|
+
self.globals = set()
|
|
33
|
+
self.args = set()
|
|
34
|
+
|
|
35
|
+
def is_valid(self, var) -> bool:
|
|
36
|
+
return var not in self.reserved
|
|
37
|
+
|
|
38
|
+
def visit_Global(self, node):
|
|
39
|
+
var = node.names
|
|
40
|
+
if not self.is_valid(var):
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
logger.debug("found globals variables to obfuscate: %s", var)
|
|
44
|
+
self.globals.update(var)
|
|
45
|
+
|
|
46
|
+
def visit_Name(self, node):
|
|
47
|
+
if not isinstance(node.ctx, ast.Store):
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
var = node.id
|
|
51
|
+
if not self.is_valid(var):
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
logger.debug("found variables names to obfuscate: %s", var)
|
|
55
|
+
self.assigned.add(var)
|
|
56
|
+
|
|
57
|
+
def visit_arg(self, node):
|
|
58
|
+
self.args.add(node.arg)
|
|
59
|
+
self.assigned.add(node.arg)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AstVarRenamer(ast.NodeTransformer):
|
|
63
|
+
def __init__(self, assigned, args, globals_, generator=None):
|
|
64
|
+
self.rename = set(assigned) - set(args) - set(globals_)
|
|
65
|
+
|
|
66
|
+
if generator is None:
|
|
67
|
+
generator = BasicGenerator.alphabet_generator()
|
|
68
|
+
self.generator = generator
|
|
69
|
+
|
|
70
|
+
self.new_names = {}
|
|
71
|
+
|
|
72
|
+
def generate_new_name(self):
|
|
73
|
+
return next(self.generator)
|
|
74
|
+
|
|
75
|
+
def get_new_name(self, name):
|
|
76
|
+
if name not in self.new_names:
|
|
77
|
+
new_name = self.generate_new_name()
|
|
78
|
+
self.new_names.update({name: new_name})
|
|
79
|
+
return self.new_names[name]
|
|
80
|
+
|
|
81
|
+
def visit_Name(self, node):
|
|
82
|
+
if node.id in self.rename:
|
|
83
|
+
node.id = self.get_new_name(node.id)
|
|
84
|
+
return node
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class VariablesObfuscator:
|
|
88
|
+
"""Obfuscate local variables names using the AST."""
|
|
89
|
+
|
|
90
|
+
def __init__(self, generator=None, reserved=None) -> None:
|
|
91
|
+
if generator is None:
|
|
92
|
+
generator = BasicGenerator.alphabet_generator()
|
|
93
|
+
self.generator = generator
|
|
94
|
+
|
|
95
|
+
if reserved is None:
|
|
96
|
+
reserved = []
|
|
97
|
+
self.reserved = reserved
|
|
98
|
+
|
|
99
|
+
def obfuscate_tokens(self, tokens):
|
|
100
|
+
source = untokenize(tokens)
|
|
101
|
+
tree = ast.parse(source)
|
|
102
|
+
|
|
103
|
+
vc = AstVarCollector(reserved=self.reserved)
|
|
104
|
+
vc.visit(tree)
|
|
105
|
+
|
|
106
|
+
tree = AstVarRenamer(
|
|
107
|
+
vc.assigned,
|
|
108
|
+
vc.args,
|
|
109
|
+
vc.globals,
|
|
110
|
+
generator=self.generator,
|
|
111
|
+
).visit(tree)
|
|
112
|
+
ast.fix_missing_locations(tree)
|
|
113
|
+
|
|
114
|
+
source = ast.unparse(tree)
|
|
115
|
+
io_obj = io.StringIO(source)
|
|
116
|
+
return list(generate_tokens(io_obj.readline))
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "python-obfuscation-framework"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.9.1"
|
|
8
8
|
description = "Python Obfuscation Framework"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.5"
|
|
@@ -53,9 +53,9 @@ build = [
|
|
|
53
53
|
]
|
|
54
54
|
|
|
55
55
|
[project.urls]
|
|
56
|
-
"Homepage" = "https://github.com/deoktr/
|
|
57
|
-
"Bug Reports" = "https://github.com/deoktr/
|
|
58
|
-
"Source" = "https://github.com/deoktr/
|
|
56
|
+
"Homepage" = "https://github.com/deoktr/Python-Obfuscation-Framework"
|
|
57
|
+
"Bug Reports" = "https://github.com/deoktr/Python-Obfuscation-Framework/issues"
|
|
58
|
+
"Source" = "https://github.com/deoktr/Python-Obfuscation-Framework/"
|
|
59
59
|
|
|
60
60
|
[project.scripts]
|
|
61
61
|
pof = "pof.cli:_cli"
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.9.1
|
|
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>
|
|
7
7
|
License-Expression: GPL-3.0-or-later
|
|
8
|
-
Project-URL: Homepage, https://github.com/deoktr/
|
|
9
|
-
Project-URL: Bug Reports, https://github.com/deoktr/
|
|
10
|
-
Project-URL: Source, https://github.com/deoktr/
|
|
8
|
+
Project-URL: Homepage, https://github.com/deoktr/Python-Obfuscation-Framework
|
|
9
|
+
Project-URL: Bug Reports, https://github.com/deoktr/Python-Obfuscation-Framework/issues
|
|
10
|
+
Project-URL: Source, https://github.com/deoktr/Python-Obfuscation-Framework/
|
|
11
11
|
Keywords: cybersecurity,obfuscation,obfuscator,stager,payload
|
|
12
12
|
Classifier: Development Status :: 4 - Beta
|
|
13
13
|
Classifier: Intended Audience :: Developers
|
|
@@ -43,13 +43,13 @@ Requires-Dist: twine; extra == "build"
|
|
|
43
43
|
Requires-Dist: check-manifest; extra == "build"
|
|
44
44
|
Dynamic: license-file
|
|
45
45
|
|
|
46
|
-
# pof
|
|
46
|
+
# Python Obfuscation Framework - pof
|
|
47
47
|
|
|
48
48
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
49
49
|
|
|
50
50
|
Test it at [pof.run](https://pof.run).
|
|
51
51
|
|
|
52
|
-
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
52
|
+
Python Obfuscation Framework (pof), a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
53
53
|
|
|
54
54
|
pof will allow you to:
|
|
55
55
|
|
|
@@ -313,51 +313,48 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
313
313
|
|
|
314
314
|
### Obfuscator
|
|
315
315
|
|
|
316
|
-
`
|
|
316
|
+
`VariablesObfuscator` the most basic obfuscator will rename variables.
|
|
317
317
|
|
|
318
318
|
Source in `examples/source.py`.
|
|
319
319
|
|
|
320
320
|
```python
|
|
321
|
-
import os
|
|
321
|
+
import os
|
|
322
322
|
|
|
323
|
-
def
|
|
323
|
+
def get_linux_release_info():
|
|
324
324
|
"""Get Linux release info from /etc/os-release."""
|
|
325
|
-
|
|
326
|
-
if not
|
|
325
|
+
uggNx = '/etc/os-release'
|
|
326
|
+
if not os.path.exists(uggNx):
|
|
327
327
|
print('OS release file not found. This might not be a Linux system.')
|
|
328
328
|
return None
|
|
329
|
-
|
|
329
|
+
LY3mN = {}
|
|
330
330
|
try:
|
|
331
|
-
with open(
|
|
332
|
-
for
|
|
333
|
-
if not
|
|
331
|
+
with open(uggNx, 'r') as kj0:
|
|
332
|
+
for Stv9o in kj0:
|
|
333
|
+
if not Stv9o or '=' not in Stv9o:
|
|
334
334
|
continue
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
335
|
+
l0j, QE5kCKYwMe = Stv9o.strip().split('=', 1)
|
|
336
|
+
QE5kCKYwMe = QE5kCKYwMe.strip('"\'\n')
|
|
337
|
+
LY3mN[l0j] = QE5kCKYwMe
|
|
338
338
|
print('\nLinux Release Information:')
|
|
339
|
-
print(f"Distribution: {
|
|
340
|
-
print(f"Version: {
|
|
341
|
-
print(f"Version ID: {
|
|
342
|
-
print(f"Pretty Name: {
|
|
343
|
-
return
|
|
344
|
-
except Exception as
|
|
345
|
-
print(f'Error reading release file: {
|
|
339
|
+
print(f"Distribution: {LY3mN.get('NAME', 'Unknown')}")
|
|
340
|
+
print(f"Version: {LY3mN.get('VERSION', 'Unknown')}")
|
|
341
|
+
print(f"Version ID: {LY3mN.get('VERSION_ID', 'Unknown')}")
|
|
342
|
+
print(f"Pretty Name: {LY3mN.get('PRETTY_NAME', 'Unknown')}")
|
|
343
|
+
return LY3mN
|
|
344
|
+
except Exception as e:
|
|
345
|
+
print(f'Error reading release file: {e}')
|
|
346
346
|
return None
|
|
347
347
|
if __name__ == '__main__':
|
|
348
|
-
if
|
|
349
|
-
|
|
348
|
+
if os.name == 'posix' and os.path.exists('/etc/os-release'):
|
|
349
|
+
E_R72 = get_linux_release_info()
|
|
350
350
|
else:
|
|
351
351
|
print('This script is designed for Linux systems.')
|
|
352
352
|
```
|
|
353
353
|
|
|
354
|
-
|
|
355
|
-
> Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`.
|
|
354
|
+
`DefinitionsObfuscator` obfuscate function names.
|
|
356
355
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
> [!NOTE]
|
|
360
|
-
> There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
356
|
+
> [!WARNING]
|
|
357
|
+
> `NamesObfuscator` obfuscator is renaming variables, classes, functions, and imports. Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`. There is an alternative implementation at `NamesRopeObfuscator` that uses `rope`, it's a work in progress and currently does not obfuscate variables declared inside functions.
|
|
361
358
|
|
|
362
359
|
Other very basic obfuscation functions are done by specific obfuscators like:
|
|
363
360
|
|
|
@@ -59,6 +59,7 @@ pof/obfuscator/names_rope.py
|
|
|
59
59
|
pof/obfuscator/numbers.py
|
|
60
60
|
pof/obfuscator/restructure.py
|
|
61
61
|
pof/obfuscator/strings.py
|
|
62
|
+
pof/obfuscator/variables.py
|
|
62
63
|
pof/obfuscator/cipher/__init__.py
|
|
63
64
|
pof/obfuscator/cipher/deep_encryption.py
|
|
64
65
|
pof/obfuscator/cipher/rc4.py
|
|
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.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/__init__.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/argv.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/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.8.0 → python_obfuscation_framework-1.9.1}/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.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/human/p.py
RENAMED
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/integrity.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/multi.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/__init__.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/domain.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/hostname.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/uid.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/os/username.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/expire.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/uptime.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/time/utc.py
RENAMED
|
File without changes
|
{python_obfuscation_framework-1.8.0 → python_obfuscation_framework-1.9.1}/pof/evasion/utils.py
RENAMED
|
File without changes
|
|
File without changes
|