python-obfuscation-framework 1.7.3__tar.gz → 1.7.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/LICENSE +2 -2
  2. {python_obfuscation_framework-1.7.3/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.7.5}/PKG-INFO +181 -67
  3. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/README.md +180 -66
  4. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/__init__.py +1 -1
  5. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/__main__.py +1 -1
  6. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/cli.py +1 -1
  7. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/cli_v2.py +4 -1
  8. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/errors.py +1 -1
  9. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/__init__.py +1 -1
  10. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/argv.py +29 -10
  11. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/base.py +1 -1
  12. {python_obfuscation_framework-1.7.3/pof/evasion/fs → python_obfuscation_framework-1.7.5/pof/evasion/cpu}/__init__.py +1 -1
  13. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/cpu/cpu_count.py +1 -1
  14. {python_obfuscation_framework-1.7.3/pof/evasion/hardware → python_obfuscation_framework-1.7.5/pof/evasion/fs}/__init__.py +1 -1
  15. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_exist.py +1 -1
  16. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_list_exist.py +1 -1
  17. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_list_missing.py +1 -1
  18. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/directory_missing.py +1 -1
  19. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/exec_method.py +5 -2
  20. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/executable_path.py +1 -1
  21. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_exist.py +1 -1
  22. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_list_exist.py +1 -1
  23. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_list_missing.py +1 -1
  24. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/file_missing.py +1 -1
  25. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/fs/tmp.py +5 -5
  26. {python_obfuscation_framework-1.7.3/pof/evasion/hooks → python_obfuscation_framework-1.7.5/pof/evasion/hardware}/__init__.py +1 -1
  27. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hardware/ram_count.py +1 -1
  28. {python_obfuscation_framework-1.7.3/pof/evasion/cpu → python_obfuscation_framework-1.7.5/pof/evasion/hooks}/__init__.py +1 -1
  29. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hooks/debugger.py +1 -1
  30. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/hooks/tracemalloc.py +1 -1
  31. python_obfuscation_framework-1.7.5/pof/evasion/human/__init__.py +15 -0
  32. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/human/p.py +1 -1
  33. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/human/prompt.py +1 -1
  34. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/integrity.py +1 -1
  35. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/multi.py +1 -1
  36. python_obfuscation_framework-1.7.5/pof/evasion/os/__init__.py +15 -0
  37. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/domain.py +1 -1
  38. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/hostname.py +1 -1
  39. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/uid.py +1 -1
  40. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/os/username.py +1 -1
  41. python_obfuscation_framework-1.7.5/pof/evasion/processes/__init__.py +15 -0
  42. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/processes/proc_count.py +1 -1
  43. python_obfuscation_framework-1.7.5/pof/evasion/time/__init__.py +15 -0
  44. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/expire.py +3 -29
  45. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/uptime.py +1 -1
  46. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/time/utc.py +1 -1
  47. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/evasion/utils.py +1 -1
  48. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/logger.py +1 -1
  49. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/main.py +2 -6
  50. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/__init__.py +3 -1
  51. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/builtins.py +1 -1
  52. python_obfuscation_framework-1.7.5/pof/obfuscator/cipher/__init__.py +15 -0
  53. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/deep_encryption.py +1 -1
  54. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/rc4.py +1 -1
  55. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/shift.py +1 -1
  56. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/cipher/xor.py +1 -1
  57. python_obfuscation_framework-1.7.5/pof/obfuscator/compression/__init__.py +15 -0
  58. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/bz2.py +1 -1
  59. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/gzip.py +1 -1
  60. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/lzma.py +1 -1
  61. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/compression/zlib.py +1 -1
  62. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/constants.py +1 -1
  63. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/definitions.py +1 -1
  64. python_obfuscation_framework-1.7.5/pof/obfuscator/encoding/__init__.py +15 -0
  65. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/a85.py +1 -1
  66. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b16.py +1 -1
  67. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b32.py +1 -1
  68. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b32hex.py +1 -1
  69. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b64.py +1 -1
  70. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/b85.py +1 -1
  71. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/binascii.py +1 -1
  72. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/encoding/snt.py +1 -1
  73. python_obfuscation_framework-1.7.5/pof/obfuscator/encoding/whitespace.py +39 -0
  74. python_obfuscation_framework-1.7.5/pof/obfuscator/esoteric/__init__.py +15 -0
  75. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/call.py +1 -1
  76. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/doc.py +1 -1
  77. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/globals.py +1 -1
  78. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/esoteric/imports.py +1 -1
  79. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/extract_variables.py +1 -1
  80. python_obfuscation_framework-1.7.5/pof/obfuscator/junk/__init__.py +15 -0
  81. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/junk/add_comments.py +1 -1
  82. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/junk/add_newlines.py +1 -1
  83. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/names.py +1 -1
  84. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/names_rope.py +1 -1
  85. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/numbers.py +1 -1
  86. python_obfuscation_framework-1.7.5/pof/obfuscator/other/__init__.py +15 -0
  87. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/other/tokens.py +1 -1
  88. python_obfuscation_framework-1.7.5/pof/obfuscator/remove/__init__.py +15 -0
  89. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/comments.py +1 -1
  90. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/exceptions.py +1 -1
  91. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/indents.py +1 -1
  92. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/loggings.py +1 -1
  93. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/loggings_old.py +1 -1
  94. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/newline.py +1 -1
  95. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/remove/print.py +1 -1
  96. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/restructure.py +1 -1
  97. python_obfuscation_framework-1.7.5/pof/obfuscator/stegano/__init__.py +15 -0
  98. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/docstrings.py +1 -1
  99. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/ipv6encoding.py +1 -1
  100. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/macencoding.py +1 -1
  101. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/stegano/uuidencoding.py +1 -1
  102. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/obfuscator/strings.py +22 -6
  103. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/__init__.py +1 -1
  104. python_obfuscation_framework-1.7.5/pof/stager/cipher/__init__.py +15 -0
  105. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/cipher/rc4.py +1 -1
  106. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/download.py +1 -1
  107. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/image.py +1 -1
  108. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/__init__.py +1 -1
  109. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/cl1pnet.py +1 -1
  110. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/pastebin.py +1 -1
  111. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/lots/pasters.py +1 -1
  112. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/stager/quine.py +1 -1
  113. python_obfuscation_framework-1.7.5/pof/utils/__init__.py +15 -0
  114. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/__init__.py +1 -1
  115. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/rc4.py +1 -1
  116. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/cipher/shift.py +1 -1
  117. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/__init__.py +1 -1
  118. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/bz2.py +1 -1
  119. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/gzip.py +1 -1
  120. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/lzma.py +1 -1
  121. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/compression/zlib.py +1 -1
  122. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/__init__.py +3 -1
  123. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/a85.py +1 -1
  124. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b16.py +1 -1
  125. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b3.py +1 -1
  126. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b32.py +1 -1
  127. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b32hex.py +1 -1
  128. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b64.py +1 -1
  129. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/b85.py +1 -1
  130. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/binascii.py +1 -1
  131. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/encoding/snt.py +1 -1
  132. python_obfuscation_framework-1.7.5/pof/utils/encoding/whitespace.py +117 -0
  133. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/entropy.py +1 -1
  134. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/extract_names.py +1 -1
  135. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/format.py +1 -1
  136. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/__init__.py +1 -1
  137. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/advanced.py +1 -1
  138. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/base.py +1 -1
  139. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/basic.py +1 -1
  140. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/comments.py +1 -1
  141. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/comments.txt +154 -154
  142. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/unicode.py +1 -1
  143. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/__init__.py +1 -1
  144. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/homoglyphs.py +1 -1
  145. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/__init__.py +1 -1
  146. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/ipv6encoding.py +1 -1
  147. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/macencoding.py +1 -1
  148. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/stegano/uuidencoding.py +1 -1
  149. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/tokens.py +1 -1
  150. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pyproject.toml +1 -1
  151. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5/python_obfuscation_framework.egg-info}/PKG-INFO +181 -67
  152. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/SOURCES.txt +2 -0
  153. python_obfuscation_framework-1.7.5/tests/__init__.py +15 -0
  154. python_obfuscation_framework-1.7.5/tests/obfuscator/__init__.py +15 -0
  155. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_a85.py +1 -1
  156. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b16.py +1 -1
  157. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b32.py +1 -1
  158. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b32hex.py +1 -1
  159. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b64.py +1 -1
  160. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_b85.py +1 -1
  161. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_binascii.py +1 -1
  162. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_call.py +1 -1
  163. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_comments.py +1 -1
  164. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_doc.py +1 -1
  165. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_docstrings.py +1 -1
  166. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_exceptions.py +1 -1
  167. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_ipv6encoding.py +1 -1
  168. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/test_names.py +1 -1
  169. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_number.py +1 -1
  170. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_print.py +1 -1
  171. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_snt.py +1 -1
  172. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_tokens.py +1 -1
  173. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_xor.py +1 -1
  174. python_obfuscation_framework-1.7.5/tests/utils/__init__.py +15 -0
  175. python_obfuscation_framework-1.7.5/tests/utils/se/__init__.py +15 -0
  176. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/utils/se/test_homoglyphs.py +1 -1
  177. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/utils/test_generator.py +1 -1
  178. python_obfuscation_framework-1.7.3/pof/evasion/human/__init__.py +0 -15
  179. python_obfuscation_framework-1.7.3/pof/evasion/os/__init__.py +0 -15
  180. python_obfuscation_framework-1.7.3/pof/evasion/processes/__init__.py +0 -15
  181. python_obfuscation_framework-1.7.3/pof/evasion/time/__init__.py +0 -15
  182. python_obfuscation_framework-1.7.3/pof/obfuscator/cipher/__init__.py +0 -15
  183. python_obfuscation_framework-1.7.3/pof/obfuscator/compression/__init__.py +0 -15
  184. python_obfuscation_framework-1.7.3/pof/obfuscator/encoding/__init__.py +0 -15
  185. python_obfuscation_framework-1.7.3/pof/obfuscator/esoteric/__init__.py +0 -15
  186. python_obfuscation_framework-1.7.3/pof/obfuscator/junk/__init__.py +0 -15
  187. python_obfuscation_framework-1.7.3/pof/obfuscator/other/__init__.py +0 -15
  188. python_obfuscation_framework-1.7.3/pof/obfuscator/remove/__init__.py +0 -15
  189. python_obfuscation_framework-1.7.3/pof/obfuscator/stegano/__init__.py +0 -15
  190. python_obfuscation_framework-1.7.3/pof/stager/cipher/__init__.py +0 -15
  191. python_obfuscation_framework-1.7.3/pof/utils/__init__.py +0 -15
  192. python_obfuscation_framework-1.7.3/tests/__init__.py +0 -15
  193. python_obfuscation_framework-1.7.3/tests/obfuscator/__init__.py +0 -15
  194. python_obfuscation_framework-1.7.3/tests/utils/__init__.py +0 -15
  195. python_obfuscation_framework-1.7.3/tests/utils/se/__init__.py +0 -15
  196. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/MANIFEST.in +0 -0
  197. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/generator/names.txt +0 -0
  198. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/pof/utils/se/homoglyphs.txt +0 -0
  199. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
  200. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
  201. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/requires.txt +0 -0
  202. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
  203. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/setup.cfg +0 -0
  204. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/code/out.py +0 -0
  205. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/test_names/code/source.py +0 -0
  206. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/obfuscator/utils.py +0 -0
  207. {python_obfuscation_framework-1.7.3 → python_obfuscation_framework-1.7.5}/tests/pyproject.toml +0 -0
@@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
632
632
  the "copyright" line and a pointer to where the full notice is found.
633
633
 
634
634
  POF, a free and open source Python obfuscation framework.
635
- Copyright (C) 2022 - 2025 POF Team
635
+ Copyright (C) 2022 - 2026 Deoktr
636
636
 
637
637
  This program is free software: you can redistribute it and/or modify
638
638
  it under the terms of the GNU General Public License as published by
@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
652
652
  If the program does terminal interaction, make it output a short
653
653
  notice like this when it starts in an interactive mode:
654
654
 
655
- POF Copyright (C) 2022 - 2025 POF Team
655
+ POF Copyright (C) 2022 - 2026 Deoktr
656
656
  This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
657
  This is free software, and you are welcome to redistribute it
658
658
  under certain conditions; type `show c' for details.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-obfuscation-framework
3
- Version: 1.7.3
3
+ Version: 1.7.5
4
4
  Summary: Python Obfuscation Framework
5
5
  Author-email: deoktr <35725720+deoktr@users.noreply.github.com>
6
6
  Maintainer-email: deoktr <35725720+deoktr@users.noreply.github.com>
@@ -47,15 +47,17 @@ Dynamic: license-file
47
47
 
48
48
  [![python-obfuscation-framework-pypi](https://img.shields.io/pypi/v/python-obfuscation-framework.svg)](https://pypi.org/project/python-obfuscation-framework)
49
49
 
50
+ Test it at [pof.run](https://pof.run).
51
+
50
52
  Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
51
53
 
52
54
  pof will allow you to:
53
55
 
54
- - **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
+ - **Slow down static analysis** with layered obfuscation and novel techniques.
56
57
  - **Evade sandbox** by checking host information like MAC addresses, CPU count, memory count, uptime, and much more.
57
58
  - **Add guardrails** to ensure the payload only execute on the desired target host by verifying for username, hostname, domainame and much more.
58
59
  - **Prevent dynamic analysis** by detecting debugging or tracing via malloc.
60
+ - **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
59
61
  - **Enable automation** to produce numerous variant of the same payload.
60
62
 
61
63
  The main benefit of POF is customizability, you can generate your payload however you want, choose the obfuscation you want and combine them.
@@ -173,12 +175,58 @@ globals()["".join([chr(ord(i) - 3) for i in "bbvqlwolxebb"[::-1]])].__dict__[
173
175
 
174
176
  More examples and usage can be found in `examples/` or in the section bellow.
175
177
 
178
+ ## Effectiveness
179
+
180
+ The tests are done using the default configuration of pof, no sandbox evasion
181
+ technique was used with obfuscation. Also note that I haven't tested the
182
+ malware to see if they still work, they should, but they may break with
183
+ obfuscation.
184
+
185
+ Obfuscating a [Lazarus malware](https://bazaar.abuse.ch/sample/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b/),
186
+ we go from
187
+ [18/63](https://www.virustotal.com/gui/file/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b)
188
+ to
189
+ [0/63](https://www.virustotal.com/gui/file/2f427bc784e2a865d8f000c21f366cb8459842f97c56465cbe963f221b3e115a)
190
+ on virus total:
191
+ ![](./examples/images/lazarus.png)
192
+
193
+ Obfuscating [BTC-Clipper](https://github.com/NightfallGT/BTC-Clipper), we go
194
+ from
195
+ [13/64](https://www.virustotal.com/gui/file/9817d8de9bf7d2740b5b66e30ec1afdd98d7d119074a61cbba05514d4ebdc149)
196
+ to
197
+ [0/63](https://www.virustotal.com/gui/file/71631daa26fe6c2cf77d282a16f8b3fd31e4794b63709b956599563b95e64816)
198
+ on virus total:
199
+ ![](./examples/images/btc_clipper.png)
200
+
201
+ Obfuscating a
202
+ [Braodo malware](https://bazaar.abuse.ch/sample/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f/),
203
+ we go from
204
+ [10/61](https://www.virustotal.com/gui/file/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f)
205
+ to
206
+ [0/63](https://www.virustotal.com/gui/file/8791188aaf7655093307e46fa68e3705ee7249cb81e05ea416ae96ad2fd2f0f2)
207
+ on virus total:
208
+ ![](./examples/images/braodo.png)
209
+
210
+ Obfuscating [Python-File-Stealer](https://github.com/KrizzhSriskantharajah-UK/Python-File-Stealer),
211
+ we go from
212
+ [4/63](https://www.virustotal.com/gui/file/2fc798f1df42adae3af2f7d2623edc74f6b8f08a7ae16ef3b67305c4ad668c82)
213
+ to
214
+ [0/63](https://www.virustotal.com/gui/file/8d529e6ee2806986ca376a427d683fdf6980d6332134e4759d790d604d6b5dcb)
215
+ on virus total:
216
+ ![](./examples/images/python_stealer.png)
217
+
176
218
  ## Install
177
219
 
178
220
  There are multiple installation options, with PIP, a virtualenv, a container, or with Nix.
179
221
 
180
222
  There is also the option to run the web server, see [server/README.md](./server/README.md).
181
223
 
224
+ And you can try it without installing anything:
225
+
226
+ ```bash
227
+ echo 'print("Hello, world!")' | curl -X POST -d @- https://pof.run
228
+ ```
229
+
182
230
  ### 1. PIP
183
231
 
184
232
  From [pypi](https://pypi.org/project/python-obfuscation-framework):
@@ -303,24 +351,37 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
303
351
  Source in `examples/source.py`.
304
352
 
305
353
  ```python
306
- import 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()
354
+ import os as pT2Ic6
355
+
356
+ def SeIpTxc():
357
+ """Get Linux release info from /etc/os-release."""
358
+ pDkFbLZO = '/etc/os-release'
359
+ if not pT2Ic6.path.exists(pDkFbLZO):
360
+ print('OS release file not found. This might not be a Linux system.')
361
+ return None
362
+ rDq = {}
363
+ try:
364
+ with open(pDkFbLZO, 'r') as bpBm:
365
+ for UOFvQ in bpBm:
366
+ if not UOFvQ or '=' not in UOFvQ:
367
+ continue
368
+ aSFP, UUka_V_7 = UOFvQ.ObwKdQ6LVz().g54Qp('=', 1)
369
+ UUka_V_7 = UUka_V_7.ObwKdQ6LVz('"\'\n')
370
+ rDq[aSFP] = UUka_V_7
371
+ print('\nLinux Release Information:')
372
+ print(f"Distribution: {rDq.IDiXt2('NAME', 'Unknown')}")
373
+ print(f"Version: {rDq.IDiXt2('VERSION', 'Unknown')}")
374
+ print(f"Version ID: {rDq.IDiXt2('VERSION_ID', 'Unknown')}")
375
+ print(f"Pretty Name: {rDq.IDiXt2('PRETTY_NAME', 'Unknown')}")
376
+ return rDq
377
+ except Exception as FXfc:
378
+ print(f'Error reading release file: {FXfc}')
379
+ return None
380
+ if __name__ == '__main__':
381
+ if pT2Ic6.name == 'posix' and pT2Ic6.path.exists('/etc/os-release'):
382
+ Sd65C = SeIpTxc()
383
+ else:
384
+ print('This script is designed for Linux systems.')
324
385
  ```
325
386
 
326
387
  > [!WARNING]
@@ -352,6 +413,9 @@ print('Helnelemd'.replace('nelem','lo, worl'))
352
413
  # One on n
353
414
  print("".join([d if g%3==0 else""for g,d in enumerate('H9IesYlvJl5loU4,dK nDw51ovsrozl0UdoI!jL')]))
354
415
 
416
+ # Hex-encoded
417
+ print('\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64')
418
+
355
419
  # Unicode
356
420
  print('\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0077\u006f\u0072\u006c\u0064')
357
421
 
@@ -393,32 +457,58 @@ print((True+True+True+True+True+True+True+True+True+True+True+True+True+True+Tru
393
457
  Move every variable at the top of the file with random names.
394
458
 
395
459
  ```python
396
- 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
404
-
405
- def get_random_letter():
406
- """This is a docstring."""
407
- return random.choice(string.ascii_lowercase)
408
-
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()
460
+ N842V="\"'\n"
461
+ gvBXIX='NAME'
462
+ Lzxdy='VERSION'
463
+ NklI="__main__"
464
+ IoTpEBJ='VERSION_ID'
465
+ eQqDDpOL=1
466
+ IpEPxvQ="This script is designed for Linux systems."
467
+ ka6U_Q='PRETTY_NAME'
468
+ hCf5UQQT="="
469
+ GMUC6z="/etc/os-release"
470
+ eOa=Exception
471
+ CCCs=None
472
+ EUr2fN=open
473
+ wGDb="r"
474
+ hm8="OS release file not found. This might not be a Linux system."
475
+ QElu="posix"
476
+ fNdZY9=__name__
477
+ LvMs="\nLinux Release Information:"
478
+ uFCf7Vy='Unknown'
479
+ joyHA=print
480
+ import os
481
+
482
+ def get_linux_release_info():
483
+ """Get Linux release info from /etc/os-release."""
484
+ release_file=GMUC6z
485
+ if not os.path.exists(release_file):
486
+ joyHA(hm8)
487
+ return CCCs
488
+ release_info={}
489
+ try:
490
+ with EUr2fN(release_file,wGDb)as f:
491
+ for line in f:
492
+ if not line or hCf5UQQT not in line:
493
+ continue
494
+ key,value=line.strip().split(hCf5UQQT,eQqDDpOL)
495
+ value=value.strip(N842V)
496
+ release_info[key]=value
497
+ joyHA(LvMs)
498
+ joyHA(f"Distribution: {release_info.get(gvBXIX,uFCf7Vy)}")
499
+ joyHA(f"Version: {release_info.get(Lzxdy,uFCf7Vy)}")
500
+ joyHA(f"Version ID: {release_info.get(IoTpEBJ,uFCf7Vy)}")
501
+ joyHA(f"Pretty Name: {release_info.get(ka6U_Q,uFCf7Vy)}")
502
+ return release_info
503
+ except eOa as e:
504
+ joyHA(f"Error reading release file: {e}")
505
+ return CCCs
506
+
507
+ if fNdZY9==NklI:
508
+ if os.name==QElu and os.path.exists(GMUC6z):
509
+ release_details=get_linux_release_info()
510
+ else:
511
+ joyHA(IpEPxvQ)
422
512
  ```
423
513
 
424
514
  #### BuiltinsObfuscator
@@ -460,26 +550,37 @@ Replaces call of global functions with `globals()['func_name']()`.
460
550
  Source in `examples/source.py`.
461
551
 
462
552
  ```python
463
- import 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']()
553
+ import os
554
+
555
+ def get_linux_release_info():
556
+ release_file="/etc/os-release"
557
+ if not os.path.exists(release_file):
558
+ print("OS release file not found. This might not be a Linux system.")
559
+ return None
560
+ release_info={}
561
+ try:
562
+ with open(release_file,"r")as f:
563
+ for line in f:
564
+ if not line or"="not in line:
565
+ continue
566
+ key,value=line.strip().split("=",1)
567
+ value=value.strip("\"'\n")
568
+ release_info[key]=value
569
+ print("\nLinux Release Information:")
570
+ print(f"Distribution: {release_info.get('NAME','Unknown')}")
571
+ print(f"Version: {release_info.get('VERSION','Unknown')}")
572
+ print(f"Version ID: {release_info.get('VERSION_ID','Unknown')}")
573
+ print(f"Pretty Name: {release_info.get('PRETTY_NAME','Unknown')}")
574
+ return release_info
575
+ except Exception as e:
576
+ print(f"Error reading release file: {e}")
577
+ return None
578
+
579
+ if __name__=="__main__":
580
+ if os.name=="posix"and os.path.exists("/etc/os-release"):
581
+ release_details=globals()['get_linux_release_info']()
582
+ else:
583
+ print("This script is designed for Linux systems.")
483
584
  ```
484
585
 
485
586
  #### ShiftObfuscator
@@ -513,6 +614,19 @@ def sntdecode(encoded):
513
614
  exec(sntdecode('\t\t\t \t\t\t \t \t\t \t \t \t\t \t\t\t \t\t\t \t \t \t \t \t\t\t \t \t \t\t \t \t \t\t \t\t \t\t \t\t \t\t \t\t\t\t \t \t\t \t \t\t\t \t\t\t \t\t \t\t\t\t \t\t\t \t \t\t \t\t \t\t \t \t \t\t\t \t \t \t \t \t '))
514
615
  ```
515
616
 
617
+ #### WhitespaceObfuscator
618
+
619
+ Use whitespace and zero width whitespace `\u200B`.
620
+
621
+ ```python
622
+ def wsdecode(encoded):
623
+ msg_bin=encoded.replace(" ","0").replace('\u200b',"1")
624
+ n=int(msg_bin,2)
625
+ return n.to_bytes((n.bit_length()+7)//8,"big")
626
+
627
+ exec(wsdecode("​​​ ​​​ ​ ​​ ​ ​ ​​ ​​​ ​​​ ​ ​ ​ ​ ​​​ ​ ​ ​​ ​ ​ ​​ ​​ ​​ ​​ ​​ ​​​​ ​ ​​ ​ ​​​ ​​​ ​​ ​​​​ ​​​ ​ ​​ ​​ ​​ ​ ​ ​​​ ​ ​ ​ ​ ​ "))
628
+ ```
629
+
516
630
  #### RC4Obfuscator
517
631
 
518
632
  Warning: the RC4 obfuscator (and other cipher obfuscators) will combine both, the cipher text and the key in the same file, this is obviously not secure, and should never be used for security purposes. The idea behind this obfuscator is to fool humans, AV, EDR, network TAP etc. not to be secured and safe.
@@ -2,15 +2,17 @@
2
2
 
3
3
  [![python-obfuscation-framework-pypi](https://img.shields.io/pypi/v/python-obfuscation-framework.svg)](https://pypi.org/project/python-obfuscation-framework)
4
4
 
5
+ Test it at [pof.run](https://pof.run).
6
+
5
7
  Python Obfuscation Framework, a complete Python offensive security toolkit to generate staged obfuscated payloads.
6
8
 
7
9
  pof will allow you to:
8
10
 
9
- - **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
10
- - **Slow down static analysis** of the payload or the stage.
11
+ - **Slow down static analysis** with layered obfuscation and novel techniques.
11
12
  - **Evade sandbox** by checking host information like MAC addresses, CPU count, memory count, uptime, and much more.
12
13
  - **Add guardrails** to ensure the payload only execute on the desired target host by verifying for username, hostname, domainame and much more.
13
14
  - **Prevent dynamic analysis** by detecting debugging or tracing via malloc.
15
+ - **Create staged payloads**, store stages inside images, on trusted sites, encrypt, compress, or encode them, and much more.
14
16
  - **Enable automation** to produce numerous variant of the same payload.
15
17
 
16
18
  The main benefit of POF is customizability, you can generate your payload however you want, choose the obfuscation you want and combine them.
@@ -128,12 +130,58 @@ globals()["".join([chr(ord(i) - 3) for i in "bbvqlwolxebb"[::-1]])].__dict__[
128
130
 
129
131
  More examples and usage can be found in `examples/` or in the section bellow.
130
132
 
133
+ ## Effectiveness
134
+
135
+ The tests are done using the default configuration of pof, no sandbox evasion
136
+ technique was used with obfuscation. Also note that I haven't tested the
137
+ malware to see if they still work, they should, but they may break with
138
+ obfuscation.
139
+
140
+ Obfuscating a [Lazarus malware](https://bazaar.abuse.ch/sample/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b/),
141
+ we go from
142
+ [18/63](https://www.virustotal.com/gui/file/c3cb53c4a290bc9ab6c9eb825ed0ca38bb54bcc4a59f33be72becdff80cb091b)
143
+ to
144
+ [0/63](https://www.virustotal.com/gui/file/2f427bc784e2a865d8f000c21f366cb8459842f97c56465cbe963f221b3e115a)
145
+ on virus total:
146
+ ![](./examples/images/lazarus.png)
147
+
148
+ Obfuscating [BTC-Clipper](https://github.com/NightfallGT/BTC-Clipper), we go
149
+ from
150
+ [13/64](https://www.virustotal.com/gui/file/9817d8de9bf7d2740b5b66e30ec1afdd98d7d119074a61cbba05514d4ebdc149)
151
+ to
152
+ [0/63](https://www.virustotal.com/gui/file/71631daa26fe6c2cf77d282a16f8b3fd31e4794b63709b956599563b95e64816)
153
+ on virus total:
154
+ ![](./examples/images/btc_clipper.png)
155
+
156
+ Obfuscating a
157
+ [Braodo malware](https://bazaar.abuse.ch/sample/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f/),
158
+ we go from
159
+ [10/61](https://www.virustotal.com/gui/file/b86e4bff935db9345cc1467e615ff4fbe292fae618ae927595d328cfd9e8a08f)
160
+ to
161
+ [0/63](https://www.virustotal.com/gui/file/8791188aaf7655093307e46fa68e3705ee7249cb81e05ea416ae96ad2fd2f0f2)
162
+ on virus total:
163
+ ![](./examples/images/braodo.png)
164
+
165
+ Obfuscating [Python-File-Stealer](https://github.com/KrizzhSriskantharajah-UK/Python-File-Stealer),
166
+ we go from
167
+ [4/63](https://www.virustotal.com/gui/file/2fc798f1df42adae3af2f7d2623edc74f6b8f08a7ae16ef3b67305c4ad668c82)
168
+ to
169
+ [0/63](https://www.virustotal.com/gui/file/8d529e6ee2806986ca376a427d683fdf6980d6332134e4759d790d604d6b5dcb)
170
+ on virus total:
171
+ ![](./examples/images/python_stealer.png)
172
+
131
173
  ## Install
132
174
 
133
175
  There are multiple installation options, with PIP, a virtualenv, a container, or with Nix.
134
176
 
135
177
  There is also the option to run the web server, see [server/README.md](./server/README.md).
136
178
 
179
+ And you can try it without installing anything:
180
+
181
+ ```bash
182
+ echo 'print("Hello, world!")' | curl -X POST -d @- https://pof.run
183
+ ```
184
+
137
185
  ### 1. PIP
138
186
 
139
187
  From [pypi](https://pypi.org/project/python-obfuscation-framework):
@@ -258,24 +306,37 @@ echo "print('Hello, world')" | pof -f obfuscator -k UUIDObfuscator | python
258
306
  Source in `examples/source.py`.
259
307
 
260
308
  ```python
261
- import random as dZoHe5KQ5T
262
- import string as BOu1uhdV
263
-
264
- def hrEnWnn_d():
265
- """This is a docstring."""
266
- return dZoHe5KQ5T.choice(BOu1uhdV.ascii_lowercase)
267
-
268
- def a_D(wYKTr7D5Ex):
269
- JfQdd = hrEnWnn_d()
270
- for kEw73z in range(wYKTr7D5Ex - 1):
271
- JfQdd += hrEnWnn_d()
272
- return JfQdd
273
-
274
- def VLBQn3():
275
- mxO = a_D(8)
276
- tBceS = 'My pet is name: ' + mxO
277
- print(tBceS)
278
- VLBQn3()
309
+ import os as pT2Ic6
310
+
311
+ def SeIpTxc():
312
+ """Get Linux release info from /etc/os-release."""
313
+ pDkFbLZO = '/etc/os-release'
314
+ if not pT2Ic6.path.exists(pDkFbLZO):
315
+ print('OS release file not found. This might not be a Linux system.')
316
+ return None
317
+ rDq = {}
318
+ try:
319
+ with open(pDkFbLZO, 'r') as bpBm:
320
+ for UOFvQ in bpBm:
321
+ if not UOFvQ or '=' not in UOFvQ:
322
+ continue
323
+ aSFP, UUka_V_7 = UOFvQ.ObwKdQ6LVz().g54Qp('=', 1)
324
+ UUka_V_7 = UUka_V_7.ObwKdQ6LVz('"\'\n')
325
+ rDq[aSFP] = UUka_V_7
326
+ print('\nLinux Release Information:')
327
+ print(f"Distribution: {rDq.IDiXt2('NAME', 'Unknown')}")
328
+ print(f"Version: {rDq.IDiXt2('VERSION', 'Unknown')}")
329
+ print(f"Version ID: {rDq.IDiXt2('VERSION_ID', 'Unknown')}")
330
+ print(f"Pretty Name: {rDq.IDiXt2('PRETTY_NAME', 'Unknown')}")
331
+ return rDq
332
+ except Exception as FXfc:
333
+ print(f'Error reading release file: {FXfc}')
334
+ return None
335
+ if __name__ == '__main__':
336
+ if pT2Ic6.name == 'posix' and pT2Ic6.path.exists('/etc/os-release'):
337
+ Sd65C = SeIpTxc()
338
+ else:
339
+ print('This script is designed for Linux systems.')
279
340
  ```
280
341
 
281
342
  > [!WARNING]
@@ -307,6 +368,9 @@ print('Helnelemd'.replace('nelem','lo, worl'))
307
368
  # One on n
308
369
  print("".join([d if g%3==0 else""for g,d in enumerate('H9IesYlvJl5loU4,dK nDw51ovsrozl0UdoI!jL')]))
309
370
 
371
+ # Hex-encoded
372
+ print('\x48\x65\x6c\x6c\x6f\x2c\x20\x77\x6f\x72\x6c\x64')
373
+
310
374
  # Unicode
311
375
  print('\u0048\u0065\u006c\u006c\u006f\u002c\u0020\u0077\u006f\u0072\u006c\u0064')
312
376
 
@@ -348,32 +412,58 @@ print((True+True+True+True+True+True+True+True+True+True+True+True+True+True+Tru
348
412
  Move every variable at the top of the file with random names.
349
413
 
350
414
  ```python
351
- gfdd_j=print
352
- uVu8Mq=8
353
- GqTsw9ZK="My pet is name: "
354
- u4F5X=range
355
- rSO2F=1
356
- # source file that will be obfuscated
357
- import random
358
- import string
359
-
360
- def get_random_letter():
361
- """This is a docstring."""
362
- return random.choice(string.ascii_lowercase)
363
-
364
- def get_random_name(name_len):
365
- # this is a comment
366
- name=get_random_letter()
367
- for _ in u4F5X(name_len-rSO2F):
368
- name+=get_random_letter()
369
- return name
370
-
371
- def present_my_pet():
372
- pet_name=get_random_name(uVu8Mq)
373
- message=GqTsw9ZK+pet_name
374
- gfdd_j(message)
375
-
376
- present_my_pet()
415
+ N842V="\"'\n"
416
+ gvBXIX='NAME'
417
+ Lzxdy='VERSION'
418
+ NklI="__main__"
419
+ IoTpEBJ='VERSION_ID'
420
+ eQqDDpOL=1
421
+ IpEPxvQ="This script is designed for Linux systems."
422
+ ka6U_Q='PRETTY_NAME'
423
+ hCf5UQQT="="
424
+ GMUC6z="/etc/os-release"
425
+ eOa=Exception
426
+ CCCs=None
427
+ EUr2fN=open
428
+ wGDb="r"
429
+ hm8="OS release file not found. This might not be a Linux system."
430
+ QElu="posix"
431
+ fNdZY9=__name__
432
+ LvMs="\nLinux Release Information:"
433
+ uFCf7Vy='Unknown'
434
+ joyHA=print
435
+ import os
436
+
437
+ def get_linux_release_info():
438
+ """Get Linux release info from /etc/os-release."""
439
+ release_file=GMUC6z
440
+ if not os.path.exists(release_file):
441
+ joyHA(hm8)
442
+ return CCCs
443
+ release_info={}
444
+ try:
445
+ with EUr2fN(release_file,wGDb)as f:
446
+ for line in f:
447
+ if not line or hCf5UQQT not in line:
448
+ continue
449
+ key,value=line.strip().split(hCf5UQQT,eQqDDpOL)
450
+ value=value.strip(N842V)
451
+ release_info[key]=value
452
+ joyHA(LvMs)
453
+ joyHA(f"Distribution: {release_info.get(gvBXIX,uFCf7Vy)}")
454
+ joyHA(f"Version: {release_info.get(Lzxdy,uFCf7Vy)}")
455
+ joyHA(f"Version ID: {release_info.get(IoTpEBJ,uFCf7Vy)}")
456
+ joyHA(f"Pretty Name: {release_info.get(ka6U_Q,uFCf7Vy)}")
457
+ return release_info
458
+ except eOa as e:
459
+ joyHA(f"Error reading release file: {e}")
460
+ return CCCs
461
+
462
+ if fNdZY9==NklI:
463
+ if os.name==QElu and os.path.exists(GMUC6z):
464
+ release_details=get_linux_release_info()
465
+ else:
466
+ joyHA(IpEPxvQ)
377
467
  ```
378
468
 
379
469
  #### BuiltinsObfuscator
@@ -415,26 +505,37 @@ Replaces call of global functions with `globals()['func_name']()`.
415
505
  Source in `examples/source.py`.
416
506
 
417
507
  ```python
418
- import random
419
- import string
420
-
421
- def get_random_letter():
422
- """This is a docstring."""
423
- return random.choice(string.ascii_lowercase)
424
-
425
- def get_random_name(name_len):
426
- # this is a comment
427
- name=globals()['get_random_letter']()
428
- for _ in range(name_len-1):
429
- name+=globals()['get_random_letter']()
430
- return name
431
-
432
- def present_my_pet():
433
- pet_name=globals()['get_random_name'](8)
434
- message="My pet is name: "+pet_name
435
- print(message)
436
-
437
- globals()['present_my_pet']()
508
+ import os
509
+
510
+ def get_linux_release_info():
511
+ release_file="/etc/os-release"
512
+ if not os.path.exists(release_file):
513
+ print("OS release file not found. This might not be a Linux system.")
514
+ return None
515
+ release_info={}
516
+ try:
517
+ with open(release_file,"r")as f:
518
+ for line in f:
519
+ if not line or"="not in line:
520
+ continue
521
+ key,value=line.strip().split("=",1)
522
+ value=value.strip("\"'\n")
523
+ release_info[key]=value
524
+ print("\nLinux Release Information:")
525
+ print(f"Distribution: {release_info.get('NAME','Unknown')}")
526
+ print(f"Version: {release_info.get('VERSION','Unknown')}")
527
+ print(f"Version ID: {release_info.get('VERSION_ID','Unknown')}")
528
+ print(f"Pretty Name: {release_info.get('PRETTY_NAME','Unknown')}")
529
+ return release_info
530
+ except Exception as e:
531
+ print(f"Error reading release file: {e}")
532
+ return None
533
+
534
+ if __name__=="__main__":
535
+ if os.name=="posix"and os.path.exists("/etc/os-release"):
536
+ release_details=globals()['get_linux_release_info']()
537
+ else:
538
+ print("This script is designed for Linux systems.")
438
539
  ```
439
540
 
440
541
  #### ShiftObfuscator
@@ -468,6 +569,19 @@ def sntdecode(encoded):
468
569
  exec(sntdecode('\t\t\t \t\t\t \t \t\t \t \t \t\t \t\t\t \t\t\t \t \t \t \t \t\t\t \t \t \t\t \t \t \t\t \t\t \t\t \t\t \t\t \t\t\t\t \t \t\t \t \t\t\t \t\t\t \t\t \t\t\t\t \t\t\t \t \t\t \t\t \t\t \t \t \t\t\t \t \t \t \t \t '))
469
570
  ```
470
571
 
572
+ #### WhitespaceObfuscator
573
+
574
+ Use whitespace and zero width whitespace `\u200B`.
575
+
576
+ ```python
577
+ def wsdecode(encoded):
578
+ msg_bin=encoded.replace(" ","0").replace('\u200b',"1")
579
+ n=int(msg_bin,2)
580
+ return n.to_bytes((n.bit_length()+7)//8,"big")
581
+
582
+ exec(wsdecode("​​​ ​​​ ​ ​​ ​ ​ ​​ ​​​ ​​​ ​ ​ ​ ​ ​​​ ​ ​ ​​ ​ ​ ​​ ​​ ​​ ​​ ​​ ​​​​ ​ ​​ ​ ​​​ ​​​ ​​ ​​​​ ​​​ ​ ​​ ​​ ​​ ​ ​ ​​​ ​ ​ ​ ​ ​ "))
583
+ ```
584
+
471
585
  #### RC4Obfuscator
472
586
 
473
587
  Warning: the RC4 obfuscator (and other cipher obfuscators) will combine both, the cipher text and the key in the same file, this is obviously not secure, and should never be used for security purposes. The idea behind this obfuscator is to fool humans, AV, EDR, network TAP etc. not to be secured and safe.
@@ -1,5 +1,5 @@
1
1
  # POF, a free and open source Python obfuscation framework.
2
- # Copyright (C) 2022 - 2025 POF Team
2
+ # Copyright (C) 2022 - 2026 Deoktr
3
3
  #
4
4
  # This program is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -1,5 +1,5 @@
1
1
  # POF, a free and open source Python obfuscation framework.
2
- # Copyright (C) 2022 - 2025 POF Team
2
+ # Copyright (C) 2022 - 2026 Deoktr
3
3
  #
4
4
  # This program is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by
@@ -1,5 +1,5 @@
1
1
  # POF, a free and open source Python obfuscation framework.
2
- # Copyright (C) 2022 - 2025 POF Team
2
+ # Copyright (C) 2022 - 2026 Deoktr
3
3
  #
4
4
  # This program is free software: you can redistribute it and/or modify
5
5
  # it under the terms of the GNU General Public License as published by