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.
Files changed (180) hide show
  1. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/MANIFEST.in +1 -0
  2. {python_obfuscation_framework-1.6.2/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.7.2}/PKG-INFO +308 -81
  3. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/README.md +304 -78
  4. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/cli.py +25 -16
  5. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/cli_v2.py +92 -82
  6. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/p.py +2 -3
  7. python_obfuscation_framework-1.7.2/pof/logger.py +19 -0
  8. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/main.py +7 -9
  9. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/builtins.py +3 -2
  10. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/deep_encryption.py +4 -4
  11. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/constants.py +3 -4
  12. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/definitions.py +12 -16
  13. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/doc.py +5 -9
  14. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/extract_variables.py +2 -2
  15. python_obfuscation_framework-1.7.2/pof/obfuscator/junk/add_comments.py +58 -0
  16. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/names.py +9 -8
  17. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/names_rope.py +15 -11
  18. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/numbers.py +6 -6
  19. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/exceptions.py +3 -2
  20. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/strings.py +8 -8
  21. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/image.py +5 -4
  22. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/rc4.py +3 -2
  23. python_obfuscation_framework-1.7.2/pof/utils/format.py +33 -0
  24. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/__init__.py +8 -7
  25. python_obfuscation_framework-1.7.2/pof/utils/generator/comments.py +41 -0
  26. python_obfuscation_framework-1.7.2/pof/utils/generator/comments.txt +108598 -0
  27. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/unicode.py +2 -2
  28. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pyproject.toml +7 -6
  29. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2/python_obfuscation_framework.egg-info}/PKG-INFO +308 -81
  30. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/SOURCES.txt +4 -0
  31. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/requires.txt +3 -2
  32. python_obfuscation_framework-1.6.2/pof/obfuscator/junk/add_comments.py +0 -118
  33. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/LICENSE +0 -0
  34. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/__init__.py +0 -0
  35. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/__main__.py +0 -0
  36. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/errors.py +0 -0
  37. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/__init__.py +0 -0
  38. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/argv.py +0 -0
  39. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/base.py +0 -0
  40. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/cpu/__init__.py +0 -0
  41. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/cpu/cpu_count.py +0 -0
  42. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/__init__.py +0 -0
  43. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_exist.py +0 -0
  44. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_list_exist.py +0 -0
  45. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_list_missing.py +0 -0
  46. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/directory_missing.py +0 -0
  47. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/exec_method.py +0 -0
  48. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/executable_path.py +0 -0
  49. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_exist.py +0 -0
  50. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_list_exist.py +0 -0
  51. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_list_missing.py +0 -0
  52. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/file_missing.py +0 -0
  53. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/fs/tmp.py +0 -0
  54. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hardware/__init__.py +0 -0
  55. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hardware/ram_count.py +0 -0
  56. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/__init__.py +0 -0
  57. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/debugger.py +0 -0
  58. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/hooks/tracemalloc.py +0 -0
  59. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/__init__.py +0 -0
  60. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/human/prompt.py +0 -0
  61. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/integrity.py +0 -0
  62. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/multi.py +0 -0
  63. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/__init__.py +0 -0
  64. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/domain.py +0 -0
  65. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/hostname.py +0 -0
  66. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/uid.py +0 -0
  67. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/os/username.py +0 -0
  68. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/processes/__init__.py +0 -0
  69. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/processes/proc_count.py +0 -0
  70. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/__init__.py +0 -0
  71. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/expire.py +0 -0
  72. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/uptime.py +0 -0
  73. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/time/utc.py +0 -0
  74. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/evasion/utils.py +0 -0
  75. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/__init__.py +0 -0
  76. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/__init__.py +0 -0
  77. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/rc4.py +0 -0
  78. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/shift.py +0 -0
  79. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/cipher/xor.py +0 -0
  80. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/__init__.py +0 -0
  81. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/bz2.py +0 -0
  82. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/gzip.py +0 -0
  83. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/lzma.py +0 -0
  84. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/compression/zlib.py +0 -0
  85. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/__init__.py +0 -0
  86. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/a85.py +0 -0
  87. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b16.py +0 -0
  88. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b32.py +0 -0
  89. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b32hex.py +0 -0
  90. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b64.py +0 -0
  91. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/b85.py +0 -0
  92. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/binascii.py +0 -0
  93. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/encoding/snt.py +0 -0
  94. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/__init__.py +0 -0
  95. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/call.py +0 -0
  96. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/globals.py +0 -0
  97. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/esoteric/imports.py +0 -0
  98. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/junk/__init__.py +0 -0
  99. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/junk/add_newlines.py +0 -0
  100. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/other/__init__.py +0 -0
  101. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/other/tokens.py +0 -0
  102. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/__init__.py +0 -0
  103. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/comments.py +0 -0
  104. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/indents.py +0 -0
  105. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/loggings.py +0 -0
  106. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/loggings_old.py +0 -0
  107. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/newline.py +0 -0
  108. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/remove/print.py +0 -0
  109. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/restructure.py +0 -0
  110. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/__init__.py +0 -0
  111. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/docstrings.py +0 -0
  112. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/ipv6encoding.py +0 -0
  113. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/macencoding.py +0 -0
  114. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/obfuscator/stegano/uuidencoding.py +0 -0
  115. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/__init__.py +0 -0
  116. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/cipher/__init__.py +0 -0
  117. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/cipher/rc4.py +0 -0
  118. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/download.py +0 -0
  119. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/__init__.py +0 -0
  120. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/cl1pnet.py +0 -0
  121. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/pastebin.py +0 -0
  122. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/lots/pasters.py +0 -0
  123. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/stager/quine.py +0 -0
  124. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/__init__.py +0 -0
  125. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/__init__.py +0 -0
  126. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/cipher/shift.py +0 -0
  127. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/__init__.py +0 -0
  128. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/bz2.py +0 -0
  129. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/gzip.py +0 -0
  130. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/lzma.py +0 -0
  131. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/compression/zlib.py +0 -0
  132. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/__init__.py +0 -0
  133. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/a85.py +0 -0
  134. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b16.py +0 -0
  135. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b3.py +0 -0
  136. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b32.py +0 -0
  137. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b32hex.py +0 -0
  138. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b64.py +0 -0
  139. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/b85.py +0 -0
  140. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/binascii.py +0 -0
  141. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/encoding/snt.py +0 -0
  142. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/entropy.py +0 -0
  143. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/extract_names.py +0 -0
  144. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/advanced.py +0 -0
  145. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/base.py +0 -0
  146. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/basic.py +0 -0
  147. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/generator/names.txt +0 -0
  148. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/__init__.py +0 -0
  149. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/homoglyphs.py +0 -0
  150. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/se/homoglyphs.txt +0 -0
  151. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/__init__.py +0 -0
  152. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/ipv6encoding.py +0 -0
  153. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/macencoding.py +0 -0
  154. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/stegano/uuidencoding.py +0 -0
  155. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/pof/utils/tokens.py +0 -0
  156. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
  157. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
  158. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
  159. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/setup.cfg +0 -0
  160. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/__init__.py +0 -0
  161. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/__init__.py +0 -0
  162. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_a85.py +0 -0
  163. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b16.py +0 -0
  164. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b32.py +0 -0
  165. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b32hex.py +0 -0
  166. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b64.py +0 -0
  167. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_b85.py +0 -0
  168. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_comments.py +0 -0
  169. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_docstrings.py +0 -0
  170. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_exceptions.py +0 -0
  171. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/code/out.py +0 -0
  172. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/code/source.py +0 -0
  173. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_names/test_names.py +0 -0
  174. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_print.py +0 -0
  175. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/obfuscator/test_xor.py +0 -0
  176. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/pyproject.toml +0 -0
  177. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/__init__.py +0 -0
  178. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/se/__init__.py +0 -0
  179. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/se/test_homoglyphs.py +0 -0
  180. {python_obfuscation_framework-1.6.2 → python_obfuscation_framework-1.7.2}/tests/utils/test_generator.py +0 -0
@@ -1,5 +1,6 @@
1
1
  recursive-include pof *.py
2
2
  include pof/utils/generator/names.txt
3
+ include pof/utils/generator/comments.txt
3
4
  include pof/utils/se/homoglyphs.txt
4
5
 
5
6
  recursive-include tests *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-obfuscation-framework
3
- Version: 1.6.2
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.8.0; extra == "dev"
34
- Requires-Dist: black==24.10.0; extra == "dev"
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
  [![python-obfuscation-framework-pypi](https://img.shields.io/pypi/v/python-obfuscation-framework.svg)](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
- Combine and chain obfuscation methods on a single Python source file.
52
-
53
- Install:
52
+ pof will allow you to:
54
53
 
55
- ```bash
56
- pip install python-obfuscation-framework
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
- Source:
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
- ```python
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
- Run:
65
+ Example obfuscation:
66
66
 
67
- ```bash
68
- pof in.py -o out.py
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
- More examples and usage can be found in `examples/` or in the section bellow.
80
-
81
- ## Goals
79
+ <details>
80
+ <summary>Same output formatted:</summary>
82
81
 
83
- The goals of this project are to create a toolkit to obfuscate Python source code, mainly to create payload for offensive security.
84
-
85
- pof will allow you to:
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
- Python is not exactly the best language to create payloads with, especially for Windows if the interpreter is not already installed. This project was made for learning, and discovering new ways of bypassing security, it's a great way to test obfuscations techniques.
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
- This project could also give you ideas to implement in other languages, such as powershell where it would make sens to obfuscate the source code. Or in C, C#, C++, Go or Rust where it would make sens to stage payloads, compress them, encrypt them and obfuscate strings.
172
+ </details>
100
173
 
101
- You could also use most of the stagers to stage payload that are not built in Python.
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 4 installation options, with PIP, a virtualenv, a Docker container, or with Nix.
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 in the corresponding directory or bellow.
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
- #### DefinitionsObfuscator
391
+ #### ConstantsObfuscator
269
392
 
270
- Source:
393
+ Move every variable at the top of the file with random names.
271
394
 
272
395
  ```python
273
- def say_hello(t):
274
- print(t)
275
- say_hello("Hello, world")
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
- Obfuscated:
405
+ def get_random_letter():
406
+ """This is a docstring."""
407
+ return random.choice(string.ascii_lowercase)
279
408
 
280
- ```python
281
- def sczCWV(t):
282
- print(t)
283
- sczCWV('Hello, world')
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, 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.
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 dep
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
- pip install -e .[build]
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
- - Add option to prepend a shebang, and add ability to customize it
928
- - Fix multi line strings
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