python-obfuscation-framework 1.6.2__tar.gz → 1.7.2__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.6.2 → python_obfuscation_framework-1.7.2}/MANIFEST.in +1 -0
- {python_obfuscation_framework-1.6.2/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.7.2}/PKG-INFO +308 -81
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/README.md +304 -78
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/cli.py +25 -16
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/cli_v2.py +92 -82
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/p.py +2 -3
- python_obfuscation_framework-1.7.2/pof/logger.py +19 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/main.py +7 -9
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/builtins.py +3 -2
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/deep_encryption.py +4 -4
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/constants.py +3 -4
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/definitions.py +12 -16
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/doc.py +5 -9
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/extract_variables.py +2 -2
- python_obfuscation_framework-1.7.2/pof/obfuscator/junk/add_comments.py +58 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/names.py +9 -8
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/names_rope.py +15 -11
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/numbers.py +6 -6
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/exceptions.py +3 -2
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/strings.py +8 -8
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/image.py +5 -4
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/rc4.py +3 -2
- python_obfuscation_framework-1.7.2/pof/utils/format.py +33 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/__init__.py +8 -7
- python_obfuscation_framework-1.7.2/pof/utils/generator/comments.py +41 -0
- python_obfuscation_framework-1.7.2/pof/utils/generator/comments.txt +108598 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/unicode.py +2 -2
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pyproject.toml +7 -6
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2/python_obfuscation_framework.egg-info}/PKG-INFO +308 -81
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/SOURCES.txt +4 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/requires.txt +3 -2
- python_obfuscation_framework-1.6.2/pof/obfuscator/junk/add_comments.py +0 -118
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/LICENSE +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/__main__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/errors.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/argv.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/base.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/cpu/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/cpu/cpu_count.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_exist.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_list_exist.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_list_missing.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_missing.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/exec_method.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/executable_path.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_exist.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_list_exist.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_list_missing.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_missing.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/tmp.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hardware/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hardware/ram_count.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/debugger.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/tracemalloc.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/prompt.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/integrity.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/multi.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/domain.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/hostname.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/uid.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/username.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/processes/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/processes/proc_count.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/expire.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/uptime.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/utc.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/utils.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/xor.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/call.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/globals.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/imports.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/junk/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/junk/add_newlines.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/other/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/other/tokens.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/comments.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/indents.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/loggings.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/loggings_old.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/newline.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/print.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/restructure.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/docstrings.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/cipher/rc4.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/download.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/cl1pnet.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/pastebin.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/pasters.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/quine.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/shift.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/bz2.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/gzip.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/lzma.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/zlib.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/a85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b16.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b3.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b32.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b32hex.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b64.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/binascii.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/snt.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/entropy.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/extract_names.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/advanced.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/base.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/basic.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/names.txt +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/homoglyphs.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/homoglyphs.txt +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/ipv6encoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/macencoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/uuidencoding.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/tokens.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/setup.cfg +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_a85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b16.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b32.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b32hex.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b64.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b85.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_comments.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_docstrings.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_exceptions.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/code/out.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/code/source.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/test_names.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_print.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_xor.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/pyproject.toml +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/se/__init__.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/se/test_homoglyphs.py +0 -0
- {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/test_generator.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-obfuscation-framework
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.2
|
|
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>
|
|
@@ -29,9 +29,10 @@ Description-Content-Type: text/markdown
|
|
|
29
29
|
License-File: LICENSE
|
|
30
30
|
Requires-Dist: rope>=1.0.0
|
|
31
31
|
Requires-Dist: Pillow>=10.0.0
|
|
32
|
+
Requires-Dist: black>=25.0.0
|
|
32
33
|
Provides-Extra: dev
|
|
33
|
-
Requires-Dist: ruff==0.
|
|
34
|
-
Requires-Dist: black==
|
|
34
|
+
Requires-Dist: ruff==0.14.4; extra == "dev"
|
|
35
|
+
Requires-Dist: black==25.9.0; extra == "dev"
|
|
35
36
|
Requires-Dist: pyinstrument; extra == "dev"
|
|
36
37
|
Provides-Extra: test
|
|
37
38
|
Requires-Dist: pytest; extra == "test"
|
|
@@ -46,26 +47,25 @@ Dynamic: license-file
|
|
|
46
47
|
|
|
47
48
|
[](https://pypi.org/project/python-obfuscation-framework)
|
|
48
49
|
|
|
49
|
-
Python Obfuscation Framework.
|
|
50
|
+
Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
|
|
50
51
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
Install:
|
|
52
|
+
pof will allow you to:
|
|
54
53
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
- **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
|
|
55
|
+
- **Slow down static analysis** of the payload or the stage.
|
|
56
|
+
- **Evade sandbox** by checking host information like MAC addresses, CPU count, memory count, uptime, and much more.
|
|
57
|
+
- **Add guardrails** to ensure the payload only execute on the desired target host by verifying for username, hostname, domainame and much more.
|
|
58
|
+
- **Prevent dynamic analysis** by detecting debugging or tracing via malloc.
|
|
59
|
+
- **Enable automation** to produce numerous variant of the same payload.
|
|
58
60
|
|
|
59
|
-
|
|
61
|
+
The main benefit of POF is customizability, you can generate your payload however you want, choose the obfuscation you want and combine them.
|
|
60
62
|
|
|
61
|
-
|
|
62
|
-
print('Hello, world')
|
|
63
|
-
```
|
|
63
|
+
Most obfuscation work very well when combined. For example obfuscating an int from `42` to `int("42")` allows the string obfuscator to obfuscate it, turning it into `int("".join([chr(ord(i)-3)for i in'75']))`. And we now have multiple int and strings that we can once again obfuscate.
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
Example obfuscation:
|
|
66
66
|
|
|
67
|
-
```
|
|
68
|
-
|
|
67
|
+
```python
|
|
68
|
+
print("Hello, world")
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
Output:
|
|
@@ -76,33 +76,108 @@ from base64 import b85decode as _5269
|
|
|
76
76
|
globals()["".join([chr(ord(i)-3)for i in'bbvqlwolxebb'[::-1]])].__dict__[_5269('').decode().join([chr(ord(i)-3)for i in"".join([chr(ord(i)-3)for i in'mruhgry'])])]()[_5269(''[::-1]).decode().join([globals()[''[::-1].join([chr(ord(i)-3)for i in expected_data('YmJleGxvd2xxdmJi').decode()])].__dict__["".join([chr(ord(i)-3)for i in"".join([chr(ord(i)-3)for i in'inx'])])](__builtins__.__dict__.__getitem__("".join([chr(ord(i)-3)for i in'']).join([chr(ord(i)-3)for i in expected_data('cnVn').decode()]))(i)-(__name__.__len__().__class__(__builtins__.__dict__.__getitem__(_5269('X>N1').decode())("".join([chr(ord(i)-3)for i in'3\u007b5']),0)+__builtins__.__getattribute__('egapraeytamrofel'[::-1].replace('egapraeytamrof'[::-1],expected_data('bg==').decode()))(expected_data("".join([chr(ord(i)-3)for i in']j@@'])).decode()))))for i in"".join([chr(ord(i)-3)for i in'eeh{olsy7bdgguvtyee']).replace(_5269('X>fKlUtwfqa&r').decode(),_5269('Z+C0').decode())])].__dict__[''[::-1].join([chr(ord(i)-3)for i in''[::-1]]).join([globals()[expected_data('XordinalidWlsdGlucordinalf'.replace('ordinal','19')).decode()].__dict__[expected_data('yh2Y'[::-1]).decode()](globals()[_5269(expected_data('VXRlTiVYPjQ/OVpnWEU+').decode()).decode()].__dict__[_5269('fold_countV'.replace('fold_count','Z*p')).decode()](i)-__builtins__.__getattribute__(expected_data("".join([chr(ord(i)-3)for i in'dZ83'])).decode())('quaencode_7or8bits'.replace('encode_7or8bit','ntile').replace("".join([chr(ord(i)-3)for i in'txdqwlohv']),"".join([chr(ord(i)-3)for i in'6']))))for i in expected_data('').decode().join([chr(ord(i)-3)for i in'ztoxv'[::-1]])])](expected_data(_5269('Q%6>FVKQQ0ad38HZFp+').decode().replace('pq_b2a'[::-1],'\u0062\u00478\u0073\u0049\u0048\u0064')).decode())
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
## Goals
|
|
79
|
+
<details>
|
|
80
|
+
<summary>Same output formatted:</summary>
|
|
82
81
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
- create **payloads**: store the code inside images, have multiple stages, use LOTL techniques
|
|
88
|
-
- create **stager**: easily create multi stages payloads
|
|
89
|
-
- do **evasion**: AV, EDR, DPI, sandbox and other analysis techniques
|
|
90
|
-
- slow **analysis**: slow down human analysis of the payload
|
|
91
|
-
- enable **automation**: automate the whole process, to produce numerous variant of the payload
|
|
92
|
-
- be **cross-platform**: works on Linux, Windows, and macOS
|
|
93
|
-
- have **fun**: because it's always fun to see what's possible to do with Python
|
|
94
|
-
|
|
95
|
-
This project also tries to combine all other Python obfuscation tools available, because most of them only provide a single method, and it's pretty basic. So you should be able to do everything that those other tools do, but without having to use multiple.
|
|
82
|
+
```python
|
|
83
|
+
from base64 import b64decode as expected_data
|
|
84
|
+
from base64 import b85decode as _5269
|
|
96
85
|
|
|
97
|
-
|
|
86
|
+
globals()["".join([chr(ord(i) - 3) for i in "bbvqlwolxebb"[::-1]])].__dict__[
|
|
87
|
+
_5269("")
|
|
88
|
+
.decode()
|
|
89
|
+
.join([chr(ord(i) - 3) for i in "".join([chr(ord(i) - 3) for i in "mruhgry"])])
|
|
90
|
+
]()[
|
|
91
|
+
_5269(""[::-1])
|
|
92
|
+
.decode()
|
|
93
|
+
.join(
|
|
94
|
+
[
|
|
95
|
+
globals()[
|
|
96
|
+
""[::-1].join(
|
|
97
|
+
[
|
|
98
|
+
chr(ord(i) - 3)
|
|
99
|
+
for i in expected_data("YmJleGxvd2xxdmJi").decode()
|
|
100
|
+
]
|
|
101
|
+
)
|
|
102
|
+
].__dict__[
|
|
103
|
+
"".join(
|
|
104
|
+
[chr(ord(i) - 3) for i in "".join([chr(ord(i) - 3) for i in "inx"])]
|
|
105
|
+
)
|
|
106
|
+
](
|
|
107
|
+
__builtins__.__dict__.__getitem__(
|
|
108
|
+
"".join([chr(ord(i) - 3) for i in ""]).join(
|
|
109
|
+
[chr(ord(i) - 3) for i in expected_data("cnVn").decode()]
|
|
110
|
+
)
|
|
111
|
+
)(i)
|
|
112
|
+
- (
|
|
113
|
+
__name__.__len__().__class__(
|
|
114
|
+
__builtins__.__dict__.__getitem__(_5269("X>N1").decode())(
|
|
115
|
+
"".join([chr(ord(i) - 3) for i in "3\u007b5"]), 0
|
|
116
|
+
)
|
|
117
|
+
+ __builtins__.__getattribute__(
|
|
118
|
+
"egapraeytamrofel"[::-1].replace(
|
|
119
|
+
"egapraeytamrof"[::-1], expected_data("bg==").decode()
|
|
120
|
+
)
|
|
121
|
+
)(
|
|
122
|
+
expected_data(
|
|
123
|
+
"".join([chr(ord(i) - 3) for i in "]j@@"])
|
|
124
|
+
).decode()
|
|
125
|
+
)
|
|
126
|
+
)
|
|
127
|
+
)
|
|
128
|
+
)
|
|
129
|
+
for i in "".join([chr(ord(i) - 3) for i in "eeh{olsy7bdgguvtyee"]).replace(
|
|
130
|
+
_5269("X>fKlUtwfqa&r").decode(), _5269("Z+C0").decode()
|
|
131
|
+
)
|
|
132
|
+
]
|
|
133
|
+
)
|
|
134
|
+
].__dict__[
|
|
135
|
+
""[::-1]
|
|
136
|
+
.join([chr(ord(i) - 3) for i in ""[::-1]])
|
|
137
|
+
.join(
|
|
138
|
+
[
|
|
139
|
+
globals()[
|
|
140
|
+
expected_data(
|
|
141
|
+
"XordinalidWlsdGlucordinalf".replace("ordinal", "19")
|
|
142
|
+
).decode()
|
|
143
|
+
].__dict__[expected_data("yh2Y"[::-1]).decode()](
|
|
144
|
+
globals()[
|
|
145
|
+
_5269(expected_data("VXRlTiVYPjQ/OVpnWEU+").decode()).decode()
|
|
146
|
+
].__dict__[_5269("fold_countV".replace("fold_count", "Z*p")).decode()](
|
|
147
|
+
i
|
|
148
|
+
)
|
|
149
|
+
- __builtins__.__getattribute__(
|
|
150
|
+
expected_data("".join([chr(ord(i) - 3) for i in "dZ83"])).decode()
|
|
151
|
+
)(
|
|
152
|
+
"quaencode_7or8bits".replace("encode_7or8bit", "ntile").replace(
|
|
153
|
+
"".join([chr(ord(i) - 3) for i in "txdqwlohv"]),
|
|
154
|
+
"".join([chr(ord(i) - 3) for i in "6"]),
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
for i in expected_data("")
|
|
159
|
+
.decode()
|
|
160
|
+
.join([chr(ord(i) - 3) for i in "ztoxv"[::-1]])
|
|
161
|
+
]
|
|
162
|
+
)
|
|
163
|
+
](
|
|
164
|
+
expected_data(
|
|
165
|
+
_5269("Q%6>FVKQQ0ad38HZFp+")
|
|
166
|
+
.decode()
|
|
167
|
+
.replace("pq_b2a"[::-1], "\u0062\u00478\u0073\u0049\u0048\u0064")
|
|
168
|
+
).decode()
|
|
169
|
+
)
|
|
170
|
+
```
|
|
98
171
|
|
|
99
|
-
|
|
172
|
+
</details>
|
|
100
173
|
|
|
101
|
-
|
|
174
|
+
More examples and usage can be found in `examples/` or in the section bellow.
|
|
102
175
|
|
|
103
176
|
## Install
|
|
104
177
|
|
|
105
|
-
There are
|
|
178
|
+
There are multiple installation options, with PIP, a virtualenv, a container, or with Nix.
|
|
179
|
+
|
|
180
|
+
There is also the option to run the web server, see [server/README.md](./server/README.md).
|
|
106
181
|
|
|
107
182
|
### 1. PIP
|
|
108
183
|
|
|
@@ -139,6 +214,12 @@ Run inside Docker from a local file `in.py`:
|
|
|
139
214
|
docker run --rm -v $(pwd):/tmp ghcr.io/deoktr/pof:latest /tmp/in.py -o /tmp/out.py
|
|
140
215
|
```
|
|
141
216
|
|
|
217
|
+
Or pipe input and output:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
cat in.py | docker run --rm -i ghcr.io/deoktr/pof:latest > out.py
|
|
221
|
+
```
|
|
222
|
+
|
|
142
223
|
### 4. Docker Source
|
|
143
224
|
|
|
144
225
|
```bash
|
|
@@ -195,7 +276,7 @@ pof in.py -f obfuscator -k BuiltinsObfuscator |\
|
|
|
195
276
|
pof -f stager -k PasteRsStager > out.py
|
|
196
277
|
```
|
|
197
278
|
|
|
198
|
-
You can also use the Python API directly, you can find examples
|
|
279
|
+
You can also use the Python API directly, you can find examples or see API usage bellow.
|
|
199
280
|
|
|
200
281
|
## Examples
|
|
201
282
|
|
|
@@ -217,6 +298,48 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
|
|
|
217
298
|
|
|
218
299
|
### Obfuscator
|
|
219
300
|
|
|
301
|
+
`NamesObfuscator` the most basic obfuscator is changing variables, classes, function names, and imports.
|
|
302
|
+
|
|
303
|
+
Source in `examples/source.py`.
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
import random as dZoHe5KQ5T
|
|
307
|
+
import string as BOu1uhdV
|
|
308
|
+
|
|
309
|
+
def hrEnWnn_d():
|
|
310
|
+
"""This is a docstring."""
|
|
311
|
+
return dZoHe5KQ5T.choice(BOu1uhdV.ascii_lowercase)
|
|
312
|
+
|
|
313
|
+
def a_D(wYKTr7D5Ex):
|
|
314
|
+
JfQdd = hrEnWnn_d()
|
|
315
|
+
for kEw73z in range(wYKTr7D5Ex - 1):
|
|
316
|
+
JfQdd += hrEnWnn_d()
|
|
317
|
+
return JfQdd
|
|
318
|
+
|
|
319
|
+
def VLBQn3():
|
|
320
|
+
mxO = a_D(8)
|
|
321
|
+
tBceS = 'My pet is name: ' + mxO
|
|
322
|
+
print(tBceS)
|
|
323
|
+
VLBQn3()
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
> [!WARNING]
|
|
327
|
+
> Right now this obfuscator can fail under very specific circumstances, see `pof/obfuscator/names.py`.
|
|
328
|
+
|
|
329
|
+
An alternative is `DefinitionsObfuscator`, that will only obfuscate function declarations.
|
|
330
|
+
|
|
331
|
+
> [!NOTE]
|
|
332
|
+
> 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.
|
|
333
|
+
|
|
334
|
+
Other very basic obfuscation functions are done by specific obfuscators like:
|
|
335
|
+
|
|
336
|
+
- Removing comments with `CommentsObfuscator`.
|
|
337
|
+
- Replacing exception messages with `ExceptionObfuscator`.
|
|
338
|
+
- Reducing indentation to a single space with `IndentsObfuscator`.
|
|
339
|
+
- Replace log messages with `LoggingObfuscator` or remove them with `LoggingRemoveObfuscator`.
|
|
340
|
+
- Remove empty lines with `NewlineObfuscator`.
|
|
341
|
+
- Remove print statements with `PrintObfuscator`.
|
|
342
|
+
|
|
220
343
|
#### StringsObfuscator
|
|
221
344
|
|
|
222
345
|
```python
|
|
@@ -265,22 +388,37 @@ print(len('bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'))
|
|
|
265
388
|
print((True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True+True))
|
|
266
389
|
```
|
|
267
390
|
|
|
268
|
-
####
|
|
391
|
+
#### ConstantsObfuscator
|
|
269
392
|
|
|
270
|
-
|
|
393
|
+
Move every variable at the top of the file with random names.
|
|
271
394
|
|
|
272
395
|
```python
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
396
|
+
gfdd_j=print
|
|
397
|
+
uVu8Mq=8
|
|
398
|
+
GqTsw9ZK="My pet is name: "
|
|
399
|
+
u4F5X=range
|
|
400
|
+
rSO2F=1
|
|
401
|
+
# source file that will be obfuscated
|
|
402
|
+
import random
|
|
403
|
+
import string
|
|
277
404
|
|
|
278
|
-
|
|
405
|
+
def get_random_letter():
|
|
406
|
+
"""This is a docstring."""
|
|
407
|
+
return random.choice(string.ascii_lowercase)
|
|
279
408
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
409
|
+
def get_random_name(name_len):
|
|
410
|
+
# this is a comment
|
|
411
|
+
name=get_random_letter()
|
|
412
|
+
for _ in u4F5X(name_len-rSO2F):
|
|
413
|
+
name+=get_random_letter()
|
|
414
|
+
return name
|
|
415
|
+
|
|
416
|
+
def present_my_pet():
|
|
417
|
+
pet_name=get_random_name(uVu8Mq)
|
|
418
|
+
message=GqTsw9ZK+pet_name
|
|
419
|
+
gfdd_j(message)
|
|
420
|
+
|
|
421
|
+
present_my_pet()
|
|
284
422
|
```
|
|
285
423
|
|
|
286
424
|
#### BuiltinsObfuscator
|
|
@@ -297,16 +435,6 @@ globals()['__builtins__'].__dict__['print']('Hello, world')
|
|
|
297
435
|
__builtins__.__dict__.__getitem__('print')('Hello, world')
|
|
298
436
|
```
|
|
299
437
|
|
|
300
|
-
#### ConstantsObfuscator
|
|
301
|
-
|
|
302
|
-
Move every variable at the top of the file.
|
|
303
|
-
|
|
304
|
-
```python
|
|
305
|
-
vVlJ='Hello, world'
|
|
306
|
-
t4Bo=print
|
|
307
|
-
t4Bo(vVlJ)
|
|
308
|
-
```
|
|
309
|
-
|
|
310
438
|
#### ExtractVariablesObfuscator
|
|
311
439
|
|
|
312
440
|
Extract variables in the same context level, meaning if inside a function will add the variable at the beginning of it.
|
|
@@ -325,6 +453,35 @@ print(var)
|
|
|
325
453
|
print.__call__('Hello, world')
|
|
326
454
|
```
|
|
327
455
|
|
|
456
|
+
#### GlobalsObfuscator
|
|
457
|
+
|
|
458
|
+
Replaces call of global functions with `globals()['func_name']()`.
|
|
459
|
+
|
|
460
|
+
Source in `examples/source.py`.
|
|
461
|
+
|
|
462
|
+
```python
|
|
463
|
+
import random
|
|
464
|
+
import string
|
|
465
|
+
|
|
466
|
+
def get_random_letter():
|
|
467
|
+
"""This is a docstring."""
|
|
468
|
+
return random.choice(string.ascii_lowercase)
|
|
469
|
+
|
|
470
|
+
def get_random_name(name_len):
|
|
471
|
+
# this is a comment
|
|
472
|
+
name=globals()['get_random_letter']()
|
|
473
|
+
for _ in range(name_len-1):
|
|
474
|
+
name+=globals()['get_random_letter']()
|
|
475
|
+
return name
|
|
476
|
+
|
|
477
|
+
def present_my_pet():
|
|
478
|
+
pet_name=globals()['get_random_name'](8)
|
|
479
|
+
message="My pet is name: "+pet_name
|
|
480
|
+
print(message)
|
|
481
|
+
|
|
482
|
+
globals()['present_my_pet']()
|
|
483
|
+
```
|
|
484
|
+
|
|
328
485
|
#### ShiftObfuscator
|
|
329
486
|
|
|
330
487
|
```python
|
|
@@ -504,6 +661,25 @@ Source: `print('h')`
|
|
|
504
661
|
print(oct.__doc__[8])
|
|
505
662
|
```
|
|
506
663
|
|
|
664
|
+
#### AddCommentsObfuscator
|
|
665
|
+
|
|
666
|
+
```python
|
|
667
|
+
# This is a random comment
|
|
668
|
+
print("Hello, world!")
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
The list of comments available is inside a file, all the comments have been extracted from Python standard library.
|
|
672
|
+
|
|
673
|
+
#### AddNewlinesObfuscator
|
|
674
|
+
|
|
675
|
+
Add random new lines everywhere it's possible.
|
|
676
|
+
|
|
677
|
+
```python
|
|
678
|
+
|
|
679
|
+
print("Hello, world!")
|
|
680
|
+
|
|
681
|
+
```
|
|
682
|
+
|
|
507
683
|
### Stager
|
|
508
684
|
|
|
509
685
|
#### DownloadStager
|
|
@@ -640,6 +816,22 @@ The `out2.py` and `out3.py` files are identical, they both contain the source co
|
|
|
640
816
|
> [!NOTE]
|
|
641
817
|
> By default pof uses a custom `Untokenizer` that removes useless spaces (`NoSpaceUntokenizer` defined in `./pof/utils/tokens.py`), so first generation (in the example `out.py`) will not have spaces present in the subsquent outputs.
|
|
642
818
|
|
|
819
|
+
### Format
|
|
820
|
+
|
|
821
|
+
You can choose to automatically format the output code using black.
|
|
822
|
+
|
|
823
|
+
From the CLI add the `--format` flag.
|
|
824
|
+
|
|
825
|
+
From lib:
|
|
826
|
+
|
|
827
|
+
```py
|
|
828
|
+
from pof.utils.format import black_format
|
|
829
|
+
|
|
830
|
+
obf = ExampleObfuscator().obfuscate(...)
|
|
831
|
+
out = black_format(obf)
|
|
832
|
+
print(out)
|
|
833
|
+
```
|
|
834
|
+
|
|
643
835
|
### Generators
|
|
644
836
|
|
|
645
837
|
Generators are used to generate new names, they can be used to classes, variables, functions, constants or any other.
|
|
@@ -689,7 +881,6 @@ Yes they are valid Python variable name.
|
|
|
689
881
|
Usage:
|
|
690
882
|
|
|
691
883
|
```python
|
|
692
|
-
|
|
693
884
|
from pof.utils.generator import UnicodeGenerator
|
|
694
885
|
|
|
695
886
|
gen = UnicodeGenerator().katakana_generator()
|
|
@@ -697,6 +888,21 @@ for _ in range(4):
|
|
|
697
888
|
print(next(gen))
|
|
698
889
|
```
|
|
699
890
|
|
|
891
|
+
You can also combine generators to pick randomly but with weights associated:
|
|
892
|
+
|
|
893
|
+
```python
|
|
894
|
+
from pof.utils.generator import *
|
|
895
|
+
|
|
896
|
+
gen_dict = {
|
|
897
|
+
86: AdvancedGenerator.realistic_generator(),
|
|
898
|
+
10: BasicGenerator.alphabet_generator(),
|
|
899
|
+
4: BasicGenerator.number_name_generator(length=random.randint(2, 5)),
|
|
900
|
+
}
|
|
901
|
+
gen = AdvancedGenerator.multi_generator(gen_dict)
|
|
902
|
+
for _ in range(4):
|
|
903
|
+
print(next(gen))
|
|
904
|
+
```
|
|
905
|
+
|
|
700
906
|
### Homoglyphs
|
|
701
907
|
|
|
702
908
|
[Homoglyphs](https://en.wikipedia.org/wiki/Homoglyph) are glyphs that have the same shape and appear identical. There is a generator to help create them.
|
|
@@ -838,7 +1044,7 @@ class ExampleObfuscator(BaseObfuscator):
|
|
|
838
1044
|
print(ExampleObfuscator().obfuscate(open("source.py", "r").read()))
|
|
839
1045
|
```
|
|
840
1046
|
|
|
841
|
-
In this example we can see that first we remove comments, logging, print statements, and change the content of exceptions
|
|
1047
|
+
In this example we can see that first we remove comments, logging, print statements, and change the content of exceptions. And then we start to obfuscate constants, names, globals, builtins, strings. Then strings and numbers multiple times, and we finally convert the tokens back to code.
|
|
842
1048
|
|
|
843
1049
|
By chaining multiple obfuscations techniques we can create very complex and custom output.
|
|
844
1050
|
|
|
@@ -856,19 +1062,19 @@ yara --no-warnings yara/python.yar file.py
|
|
|
856
1062
|
|
|
857
1063
|
## Development
|
|
858
1064
|
|
|
859
|
-
Project:
|
|
1065
|
+
Project directory structure:
|
|
860
1066
|
|
|
861
|
-
- `pof`: contains all the pof source code
|
|
862
|
-
- `pof/obfuscator`: contains obfuscators
|
|
863
|
-
- `pof/stager`: contains satgers
|
|
864
|
-
- `pof/evasion`: contains evasions
|
|
865
|
-
- `pof/utils`: all shared code between stager, obfuscator and evasion
|
|
866
|
-
- `wip`: work in progress code that will eventually make its way inside the main code base
|
|
867
|
-
- `tests`: unit tests for pof
|
|
868
|
-
- `scripts`: some useful scripts to develop or use pof
|
|
869
|
-
- `yara`: some yara rules to detect pof obfuscated code
|
|
1067
|
+
- `pof`: contains all the pof source code.
|
|
1068
|
+
- `pof/obfuscator`: contains obfuscators.
|
|
1069
|
+
- `pof/stager`: contains satgers.
|
|
1070
|
+
- `pof/evasion`: contains evasions.
|
|
1071
|
+
- `pof/utils`: all shared code between stager, obfuscator and evasion.
|
|
1072
|
+
- `wip`: work in progress code that will eventually make its way inside the main code base.
|
|
1073
|
+
- `tests`: unit tests for pof.
|
|
1074
|
+
- `scripts`: some useful scripts to develop or use pof.
|
|
1075
|
+
- `yara`: some yara rules to detect pof obfuscated code.
|
|
870
1076
|
|
|
871
|
-
Setup:
|
|
1077
|
+
Setup dev environment:
|
|
872
1078
|
|
|
873
1079
|
```bash
|
|
874
1080
|
python3 -m venv venv
|
|
@@ -876,13 +1082,13 @@ python3 -m venv venv
|
|
|
876
1082
|
# activate it (or equivalent for your shell)
|
|
877
1083
|
source ./venv/bin/activate
|
|
878
1084
|
|
|
879
|
-
# install
|
|
1085
|
+
# install dependencies
|
|
880
1086
|
pip install -e .
|
|
881
|
-
pip install -e .[dev]
|
|
882
|
-
pip install -e .[test]
|
|
1087
|
+
pip install -e ".[dev]"
|
|
1088
|
+
pip install -e ".[test]"
|
|
883
1089
|
```
|
|
884
1090
|
|
|
885
|
-
Run pof:
|
|
1091
|
+
Run pof CLI:
|
|
886
1092
|
|
|
887
1093
|
```bash
|
|
888
1094
|
./pof.py --help
|
|
@@ -897,7 +1103,6 @@ pytest
|
|
|
897
1103
|
Format:
|
|
898
1104
|
|
|
899
1105
|
```bash
|
|
900
|
-
black .
|
|
901
1106
|
ruff format .
|
|
902
1107
|
```
|
|
903
1108
|
|
|
@@ -910,7 +1115,8 @@ ruff check .
|
|
|
910
1115
|
Test build package:
|
|
911
1116
|
|
|
912
1117
|
```bash
|
|
913
|
-
|
|
1118
|
+
# install dependencies
|
|
1119
|
+
pip install -e ".[build]"
|
|
914
1120
|
|
|
915
1121
|
check-manifest --ignore "tests/**"
|
|
916
1122
|
python3 -m build
|
|
@@ -921,11 +1127,32 @@ python3 -m twine check dist/*
|
|
|
921
1127
|
|
|
922
1128
|
No effort is made to support Python 2, most obfuscator, stagers, and evasion should work out of the box, but they are not tested.
|
|
923
1129
|
|
|
1130
|
+
## Alternatives
|
|
1131
|
+
|
|
1132
|
+
Other Python obfuscation projects:
|
|
1133
|
+
|
|
1134
|
+
- [0x-Apollyon/Papyrus](https://github.com/0x-Apollyon/Papyrus)
|
|
1135
|
+
- [Hnfull/Intensio-Obfuscator](https://github.com/Hnfull/Intensio-Obfuscator)
|
|
1136
|
+
- [lepotekil/MsfMania](https://github.com/lepotekil/MsfMania)
|
|
1137
|
+
- [billythegoat356/Hyperion](https://github.com/billythegoat356/Hyperion)
|
|
1138
|
+
- [spyboy-productions/ObfuXtreme](https://github.com/spyboy-productions/ObfuXtreme)
|
|
1139
|
+
- [chris-rands/emojify](https://github.com/chris-rands/emojify)
|
|
1140
|
+
- [0sir1ss/Anubis](https://github.com/0sir1ss/Anubis)
|
|
1141
|
+
- [0sir1ss/Carbon](https://github.com/0sir1ss/Carbon)
|
|
1142
|
+
- [billythegoat356/Apollyon](https://github.com/billythegoat356/Apollyon)
|
|
1143
|
+
- [billythegoat356/Berserker](https://github.com/billythegoat356/Berserker)
|
|
1144
|
+
- [brandonasuncion/Python-Code-Obfuscator](https://github.com/brandonasuncion/Python-Code-Obfuscator)
|
|
1145
|
+
- [CSM-BlueRed/Impostor](https://github.com/CSM-BlueRed/Impostor)
|
|
1146
|
+
- [ImInTheICU/ExtraLayer](https://github.com/ImInTheICU/ExtraLayer)
|
|
1147
|
+
- [root4031/pyobfuscate](https://github.com/root4031/pyobfuscate)
|
|
1148
|
+
- [therealOri/PolyLock](https://github.com/therealOri/PolyLock)
|
|
1149
|
+
- [FlorianREGAZ/PyObfuscator](https://github.com/FlorianREGAZ/PyObfuscator)
|
|
1150
|
+
|
|
924
1151
|
## TODO
|
|
925
1152
|
|
|
926
|
-
- Fix `NamesObfuscator
|
|
927
|
-
-
|
|
928
|
-
-
|
|
1153
|
+
- Fix `NamesObfuscator`.
|
|
1154
|
+
- Fix multi line strings.
|
|
1155
|
+
- Add option to prepend a shebang, and add ability to customize it.
|
|
929
1156
|
|
|
930
1157
|
## License
|
|
931
1158
|
|