python-obfuscation-framework 1.9.3__tar.gz → 1.9.4__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 (181) hide show
  1. {python_obfuscation_framework-1.9.3/python_obfuscation_framework.egg-info → python_obfuscation_framework-1.9.4}/PKG-INFO +6 -4
  2. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/README.md +5 -3
  3. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/__init__.py +2 -0
  4. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/controlflow/control_flow_flatten.py +1 -1
  5. python_obfuscation_framework-1.9.4/pof/obfuscator/junk/dead_code.py +332 -0
  6. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pyproject.toml +1 -1
  7. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4/python_obfuscation_framework.egg-info}/PKG-INFO +6 -4
  8. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/SOURCES.txt +1 -0
  9. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/conftest.py +2 -0
  10. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/multiline_strings.py +0 -8
  11. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/LICENSE +0 -0
  12. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/MANIFEST.in +0 -0
  13. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/__init__.py +0 -0
  14. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/__main__.py +0 -0
  15. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/cli.py +0 -0
  16. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/cli_v2.py +0 -0
  17. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/errors.py +0 -0
  18. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/__init__.py +0 -0
  19. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/argv.py +0 -0
  20. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/base.py +0 -0
  21. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/cpu/__init__.py +0 -0
  22. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/cpu/cpu_count.py +0 -0
  23. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/__init__.py +0 -0
  24. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_exist.py +0 -0
  25. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_list_exist.py +0 -0
  26. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_list_missing.py +0 -0
  27. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/directory_missing.py +0 -0
  28. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/exec_method.py +0 -0
  29. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/executable_path.py +0 -0
  30. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_exist.py +0 -0
  31. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_list_exist.py +0 -0
  32. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_list_missing.py +0 -0
  33. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/file_missing.py +0 -0
  34. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/fs/tmp.py +0 -0
  35. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hardware/__init__.py +0 -0
  36. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hardware/ram_count.py +0 -0
  37. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/__init__.py +0 -0
  38. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/debugger.py +0 -0
  39. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/hooks/tracemalloc.py +0 -0
  40. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/__init__.py +0 -0
  41. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/p.py +0 -0
  42. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/human/prompt.py +0 -0
  43. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/integrity.py +0 -0
  44. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/multi.py +0 -0
  45. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/__init__.py +0 -0
  46. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/domain.py +0 -0
  47. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/hostname.py +0 -0
  48. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/uid.py +0 -0
  49. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/os/username.py +0 -0
  50. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/processes/__init__.py +0 -0
  51. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/processes/proc_count.py +0 -0
  52. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/__init__.py +0 -0
  53. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/expire.py +0 -0
  54. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/uptime.py +0 -0
  55. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/time/utc.py +0 -0
  56. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/evasion/utils.py +0 -0
  57. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/logger.py +0 -0
  58. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/main.py +0 -0
  59. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/boolean.py +0 -0
  60. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/builtins.py +0 -0
  61. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/__init__.py +0 -0
  62. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/deep_encryption.py +0 -0
  63. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/rc4.py +0 -0
  64. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/shift.py +0 -0
  65. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/cipher/xor.py +0 -0
  66. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/__init__.py +0 -0
  67. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/bz2.py +0 -0
  68. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/gzip.py +0 -0
  69. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/lzma.py +0 -0
  70. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/compression/zlib.py +0 -0
  71. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/constants.py +0 -0
  72. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/controlflow/__init__.py +0 -0
  73. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/definitions.py +0 -0
  74. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/__init__.py +0 -0
  75. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/a85.py +0 -0
  76. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b16.py +0 -0
  77. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b32.py +0 -0
  78. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b32hex.py +0 -0
  79. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b64.py +0 -0
  80. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/b85.py +0 -0
  81. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/binascii.py +0 -0
  82. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/snt.py +0 -0
  83. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/encoding/whitespace.py +0 -0
  84. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/__init__.py +0 -0
  85. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/call.py +0 -0
  86. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/doc.py +0 -0
  87. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/globals.py +0 -0
  88. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/esoteric/imports.py +0 -0
  89. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/extract_variables.py +0 -0
  90. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/__init__.py +0 -0
  91. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/add_comments.py +0 -0
  92. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/junk/add_newlines.py +0 -0
  93. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/names.py +0 -0
  94. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/names_rope.py +0 -0
  95. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/numbers.py +0 -0
  96. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/other/__init__.py +0 -0
  97. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/other/tokens.py +0 -0
  98. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/__init__.py +0 -0
  99. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/comments.py +0 -0
  100. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/exceptions.py +0 -0
  101. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/indents.py +0 -0
  102. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/loggings.py +0 -0
  103. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/loggings_old.py +0 -0
  104. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/newline.py +0 -0
  105. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/remove/print.py +0 -0
  106. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/restructure.py +0 -0
  107. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/__init__.py +0 -0
  108. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/docstrings.py +0 -0
  109. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/ipv6encoding.py +0 -0
  110. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/macencoding.py +0 -0
  111. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/stegano/uuidencoding.py +0 -0
  112. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/strings.py +0 -0
  113. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/obfuscator/variables.py +0 -0
  114. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/__init__.py +0 -0
  115. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/cipher/__init__.py +0 -0
  116. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/cipher/rc4.py +0 -0
  117. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/download.py +0 -0
  118. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/image.py +0 -0
  119. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/__init__.py +0 -0
  120. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/cl1pnet.py +0 -0
  121. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/pastebin.py +0 -0
  122. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/lots/pasters.py +0 -0
  123. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/stager/quine.py +0 -0
  124. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/__init__.py +0 -0
  125. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/__init__.py +0 -0
  126. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/rc4.py +0 -0
  127. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/cipher/shift.py +0 -0
  128. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/__init__.py +0 -0
  129. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/bz2.py +0 -0
  130. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/gzip.py +0 -0
  131. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/lzma.py +0 -0
  132. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/compression/zlib.py +0 -0
  133. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/__init__.py +0 -0
  134. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/a85.py +0 -0
  135. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b16.py +0 -0
  136. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b3.py +0 -0
  137. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b32.py +0 -0
  138. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b32hex.py +0 -0
  139. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b64.py +0 -0
  140. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/b85.py +0 -0
  141. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/binascii.py +0 -0
  142. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/snt.py +0 -0
  143. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/encoding/whitespace.py +0 -0
  144. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/entropy.py +0 -0
  145. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/extract_names.py +0 -0
  146. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/format.py +0 -0
  147. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/__init__.py +0 -0
  148. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/advanced.py +0 -0
  149. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/base.py +0 -0
  150. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/basic.py +0 -0
  151. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/comments.py +0 -0
  152. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/comments.txt +0 -0
  153. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/names.txt +0 -0
  154. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/generator/unicode.py +0 -0
  155. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/__init__.py +0 -0
  156. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/homoglyphs.py +0 -0
  157. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/se/homoglyphs.txt +0 -0
  158. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/__init__.py +0 -0
  159. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/ipv6encoding.py +0 -0
  160. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/macencoding.py +0 -0
  161. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/stegano/uuidencoding.py +0 -0
  162. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/pof/utils/tokens.py +0 -0
  163. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/dependency_links.txt +0 -0
  164. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/entry_points.txt +0 -0
  165. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/requires.txt +0 -0
  166. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/python_obfuscation_framework.egg-info/top_level.txt +0 -0
  167. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/setup.cfg +0 -0
  168. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/__init__.py +0 -0
  169. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/__init__.py +0 -0
  170. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/__init__.py +0 -0
  171. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/complex.py +0 -0
  172. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/moderate.py +0 -0
  173. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/fixtures/simple.py +0 -0
  174. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/test_edge_cases.py +0 -0
  175. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/test_integration.py +0 -0
  176. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/obfuscator/utils.py +0 -0
  177. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/pyproject.toml +0 -0
  178. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/__init__.py +0 -0
  179. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/se/__init__.py +0 -0
  180. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/se/test_homoglyphs.py +0 -0
  181. {python_obfuscation_framework-1.9.3 → python_obfuscation_framework-1.9.4}/tests/utils/test_generator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-obfuscation-framework
3
- Version: 1.9.3
3
+ Version: 1.9.4
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>
@@ -1268,9 +1268,12 @@ interesting strings in Python source code. To check rules against source files
1268
1268
  and/or obfuscated files run:
1269
1269
 
1270
1270
  ```bash
1271
- yara --no-warnings yara/python.yar file.py
1271
+ yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
1272
1272
  ```
1273
1273
 
1274
+ > [!NOTE]
1275
+ > The rules are far from perfect, but they are a starting point.
1276
+
1274
1277
  ## Development
1275
1278
 
1276
1279
  Project directory structure:
@@ -1363,8 +1366,7 @@ Other Python obfuscation projects:
1363
1366
 
1364
1367
  ## TODO
1365
1368
 
1366
- - Add control flow obfuscation, add dead code, opaque predicates, control flow
1367
- flattening.
1369
+ - Add dead code, opaque predicates.
1368
1370
  - Fix `NamesObfuscator`.
1369
1371
  - Add option to prepend a shebang, and add ability to customize it.
1370
1372
 
@@ -1223,9 +1223,12 @@ interesting strings in Python source code. To check rules against source files
1223
1223
  and/or obfuscated files run:
1224
1224
 
1225
1225
  ```bash
1226
- yara --no-warnings yara/python.yar file.py
1226
+ yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
1227
1227
  ```
1228
1228
 
1229
+ > [!NOTE]
1230
+ > The rules are far from perfect, but they are a starting point.
1231
+
1229
1232
  ## Development
1230
1233
 
1231
1234
  Project directory structure:
@@ -1318,8 +1321,7 @@ Other Python obfuscation projects:
1318
1321
 
1319
1322
  ## TODO
1320
1323
 
1321
- - Add control flow obfuscation, add dead code, opaque predicates, control flow
1322
- flattening.
1324
+ - Add dead code, opaque predicates.
1323
1325
  - Fix `NamesObfuscator`.
1324
1326
  - Add option to prepend a shebang, and add ability to customize it.
1325
1327
 
@@ -43,6 +43,7 @@ from .esoteric.imports import ImportsObfuscator
43
43
  from .extract_variables import ExtractVariablesObfuscator
44
44
  from .junk.add_comments import AddCommentsObfuscator
45
45
  from .junk.add_newlines import AddNewlinesObfuscator
46
+ from .junk.dead_code import DeadCodeObfuscator
46
47
  from .names import NamesObfuscator
47
48
  from .names_rope import NamesRopeObfuscator
48
49
  from .numbers import NumberObfuscator
@@ -78,6 +79,7 @@ __all__ = [
78
79
  "CommentsObfuscator",
79
80
  "ConstantsObfuscator",
80
81
  "ControlFlowFlattenObfuscator",
82
+ "DeadCodeObfuscator",
81
83
  "DeepEncryptionObfuscator",
82
84
  "DefinitionsObfuscator",
83
85
  "DocstringObfuscator",
@@ -67,7 +67,7 @@ class ControlFlowFlattenObfuscator:
67
67
 
68
68
  dispatcher_cases: list[ast.If | None] = []
69
69
 
70
- for idx, (state_num, stmt) in enumerate(zip(block_states, body)):
70
+ for idx, (state_num, stmt) in enumerate(zip(block_states, body, strict=True)):
71
71
  next_state = block_states[idx + 1] if idx + 1 < num_blocks else exit_state
72
72
 
73
73
  case_body: list[ast.stmt] = []
@@ -0,0 +1,332 @@
1
+ # POF, a free and open source Python obfuscation framework.
2
+ # Copyright (C) 2022 - 2026 Deoktr
3
+ #
4
+ # This program is free software: you can redistribute it and/or modify
5
+ # it under the terms of the GNU General Public License as published by
6
+ # the Free Software Foundation, either version 3 of the License, or
7
+ # (at your option) any later version.
8
+ #
9
+ # This program is distributed in the hope that it will be useful,
10
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ # GNU General Public License for more details.
13
+ #
14
+ # You should have received a copy of the GNU General Public License
15
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
16
+
17
+ import random
18
+ from collections.abc import Generator
19
+ from tokenize import (
20
+ COMMENT,
21
+ DEDENT,
22
+ INDENT,
23
+ NAME,
24
+ NEWLINE,
25
+ NL,
26
+ NUMBER,
27
+ OP,
28
+ STRING,
29
+ )
30
+
31
+ from pof.utils.generator import BasicGenerator
32
+
33
+
34
+ class DeadCodeObfuscator:
35
+ """Insert dead (unreachable/unused) code blocks into the source."""
36
+
37
+ VALID_STATEMENT_TYPES = (
38
+ "function",
39
+ "if",
40
+ "for",
41
+ "while",
42
+ "assignment",
43
+ )
44
+
45
+ def __init__( # noqa: PLR0913
46
+ self,
47
+ frequency: float = 0.3,
48
+ max_function_depth: int = 2,
49
+ max_branches: int = 3,
50
+ statement_types: list[str] | None = None,
51
+ generate_classes: bool = False, # noqa: FBT001, FBT002
52
+ generator: Generator[str] | None = None,
53
+ ) -> None:
54
+ self.frequency: float = frequency
55
+ self.max_function_depth: int = max_function_depth
56
+ self.max_branches: int = max_branches
57
+ self.generate_classes: bool = generate_classes
58
+
59
+ if statement_types is not None:
60
+ self.statement_types: list[str] = [
61
+ s for s in statement_types if s in self.VALID_STATEMENT_TYPES
62
+ ]
63
+ else:
64
+ self.statement_types = list(self.VALID_STATEMENT_TYPES)
65
+
66
+ if generator is None:
67
+ generator = BasicGenerator.function_generator()
68
+ self.generator: Generator[str] = generator
69
+ self._var_generator: Generator[str] = BasicGenerator.alphabet_generator()
70
+
71
+ def _next_name(self) -> str:
72
+ return next(self.generator)
73
+
74
+ def _next_var(self) -> str:
75
+ return next(self._var_generator)
76
+
77
+ @staticmethod
78
+ def _collect_existing_names(tokens) -> set[str]:
79
+ names: set[str] = set()
80
+ for toknum, tokval, *_ in tokens:
81
+ if toknum == NAME:
82
+ names.add(tokval)
83
+ return names
84
+
85
+ def _random_expr_tokens(self):
86
+ choice = random.randint(0, 3)
87
+ if choice == 0:
88
+ a, b = random.randint(1, 999), random.randint(1, 999)
89
+ op = random.choice(["+", "-", "*", "%"])
90
+ return [(NUMBER, str(a)), (OP, op), (NUMBER, str(b))]
91
+ if choice == 1:
92
+ words = ["data", "info", "temp", "cache", "buf", "msg", "tag"]
93
+ return [(STRING, repr(random.choice(words)))]
94
+ if choice == 2: # noqa: PLR2004
95
+ items = [random.randint(0, 100) for _ in range(random.randint(1, 4))]
96
+ tokens = [(OP, "[")]
97
+ for i, item in enumerate(items):
98
+ if i > 0:
99
+ tokens.append((OP, ","))
100
+ tokens.append((NUMBER, str(item)))
101
+ tokens.append((OP, "]"))
102
+ return tokens
103
+ return [(NUMBER, str(random.randint(0, 9999)))]
104
+
105
+ def _body_tokens(self, count: int = 0):
106
+ """Generate body tokens for a block (assignments)."""
107
+ if count == 0:
108
+ count = random.randint(1, 3)
109
+ tokens = []
110
+ for _ in range(count):
111
+ var = self._next_var()
112
+ tokens.append((NAME, var))
113
+ tokens.append((OP, "="))
114
+ tokens.extend(self._random_expr_tokens())
115
+ tokens.append((NEWLINE, "\n"))
116
+ return tokens
117
+
118
+ def _generate_dead_function_tokens(self, indent_level: int, depth: int):
119
+ fname = self._next_name()
120
+ params = [self._next_var() for _ in range(random.randint(0, 3))]
121
+ inner_indent = " " * (indent_level + 1)
122
+
123
+ tokens = [
124
+ (NAME, "def"),
125
+ (NAME, fname),
126
+ (OP, "("),
127
+ ]
128
+ for i, p in enumerate(params):
129
+ if i > 0:
130
+ tokens.append((OP, ","))
131
+ tokens.append((NAME, p))
132
+ tokens.extend(
133
+ [
134
+ (OP, ")"),
135
+ (OP, ":"),
136
+ (NEWLINE, "\n"),
137
+ (INDENT, inner_indent),
138
+ ],
139
+ )
140
+ tokens.extend(self._body_tokens())
141
+
142
+ if depth < self.max_function_depth and random.random() < 0.3: # noqa: PLR2004
143
+ tokens.extend(
144
+ self._generate_dead_function_tokens(indent_level + 1, depth + 1),
145
+ )
146
+
147
+ tokens.append((DEDENT, ""))
148
+ return tokens
149
+
150
+ def _generate_dead_if_tokens(self, indent_level: int):
151
+ false_conds = [
152
+ [(NAME, "False")],
153
+ [(NUMBER, "0")],
154
+ [(STRING, '""')],
155
+ [(NAME, "None")],
156
+ ]
157
+ inner_indent = " " * (indent_level + 1)
158
+
159
+ tokens = [(NAME, "if")]
160
+ tokens.extend(random.choice(false_conds))
161
+ tokens.extend(
162
+ [
163
+ (OP, ":"),
164
+ (NEWLINE, "\n"),
165
+ (INDENT, inner_indent),
166
+ ],
167
+ )
168
+ tokens.extend(self._body_tokens())
169
+ tokens.append((DEDENT, ""))
170
+
171
+ num_elif = random.randint(0, max(0, self.max_branches - 1))
172
+ for _ in range(num_elif):
173
+ tokens.append((NAME, "elif"))
174
+ tokens.extend(random.choice(false_conds))
175
+ tokens.extend(
176
+ [
177
+ (OP, ":"),
178
+ (NEWLINE, "\n"),
179
+ (INDENT, inner_indent),
180
+ ],
181
+ )
182
+ tokens.extend(self._body_tokens())
183
+ tokens.append((DEDENT, ""))
184
+
185
+ return tokens
186
+
187
+ def _generate_dead_for_tokens(self, indent_level: int):
188
+ var = self._next_var()
189
+ inner_indent = " " * (indent_level + 1)
190
+
191
+ empty_choices = [
192
+ [(OP, "["), (OP, "]")],
193
+ [(NAME, "range"), (OP, "("), (NUMBER, "0"), (OP, ")")],
194
+ ]
195
+
196
+ tokens = [
197
+ (NAME, "for"),
198
+ (NAME, var),
199
+ (NAME, "in"),
200
+ ]
201
+ tokens.extend(random.choice(empty_choices))
202
+ tokens.extend(
203
+ [
204
+ (OP, ":"),
205
+ (NEWLINE, "\n"),
206
+ (INDENT, inner_indent),
207
+ ],
208
+ )
209
+ tokens.extend(self._body_tokens())
210
+ tokens.append((DEDENT, ""))
211
+ return tokens
212
+
213
+ def _generate_dead_while_tokens(self, indent_level: int):
214
+ inner_indent = " " * (indent_level + 1)
215
+ tokens = [
216
+ (NAME, "while"),
217
+ (NAME, "False"),
218
+ (OP, ":"),
219
+ (NEWLINE, "\n"),
220
+ (INDENT, inner_indent),
221
+ ]
222
+ tokens.extend(self._body_tokens())
223
+ tokens.append((DEDENT, ""))
224
+ return tokens
225
+
226
+ def _generate_dead_class_tokens(self, indent_level: int):
227
+ cname = self._next_name().capitalize()
228
+ inner_indent = " " * (indent_level + 1)
229
+ tokens = [
230
+ (NAME, "class"),
231
+ (NAME, cname),
232
+ (OP, ":"),
233
+ (NEWLINE, "\n"),
234
+ (INDENT, inner_indent),
235
+ ]
236
+ tokens.extend(self._generate_dead_function_tokens(indent_level + 1, 0))
237
+ tokens.append((DEDENT, ""))
238
+ return tokens
239
+
240
+ def _generate_dead_assignment_tokens(self):
241
+ var = self._next_var()
242
+ tokens = [
243
+ (NAME, var),
244
+ (OP, "="),
245
+ ]
246
+ tokens.extend(self._random_expr_tokens())
247
+ tokens.append((NEWLINE, "\n"))
248
+ return tokens
249
+
250
+ def _generate_dead_code(self, indent_level: int):
251
+ """Generate a dead code block and return its tokens."""
252
+ available = list(self.statement_types)
253
+ if self.generate_classes:
254
+ available.append("class")
255
+
256
+ if indent_level > 0:
257
+ weights = []
258
+ for t in available:
259
+ if t in ("function", "class"):
260
+ weights.append(1)
261
+ else:
262
+ weights.append(3)
263
+ else:
264
+ weights = [1] * len(available)
265
+
266
+ choice = random.choices(available, weights=weights, k=1)[0]
267
+
268
+ match choice:
269
+ case "function":
270
+ return self._generate_dead_function_tokens(indent_level, 0)
271
+ case "if":
272
+ return self._generate_dead_if_tokens(indent_level)
273
+ case "for":
274
+ return self._generate_dead_for_tokens(indent_level)
275
+ case "while":
276
+ return self._generate_dead_while_tokens(indent_level)
277
+ case "class":
278
+ return self._generate_dead_class_tokens(indent_level)
279
+ case _:
280
+ return self._generate_dead_assignment_tokens()
281
+
282
+ def obfuscate_tokens(self, tokens): # noqa: C901
283
+ existing: set[str] = self._collect_existing_names(tokens)
284
+ BasicGenerator.extend_reserved(list(existing))
285
+
286
+ result = []
287
+ indent_level: int = 0
288
+ paren_depth: int = 0
289
+ in_decorator: bool = False
290
+
291
+ for idx, (toknum, tokval, *_) in enumerate(tokens):
292
+ if toknum == INDENT:
293
+ indent_level += 1
294
+ elif toknum == DEDENT:
295
+ indent_level = max(0, indent_level - 1)
296
+
297
+ if toknum == OP and tokval in ("(", "[", "{"):
298
+ paren_depth += 1
299
+ elif toknum == OP and tokval in (")", "]", "}"):
300
+ paren_depth = max(0, paren_depth - 1)
301
+
302
+ if toknum == OP and tokval == "@":
303
+ in_decorator = True
304
+ if in_decorator and toknum == NEWLINE:
305
+ in_decorator = False
306
+
307
+ result.append((toknum, tokval))
308
+
309
+ # insert dead code after NEWLINE tokens
310
+ # do NOT insert if an INDENT is upcoming (possibly after NL/COMMENT
311
+ # tokens), that would break the block header (def/if/for/while/
312
+ # class/try) by placing code between the header's NEWLINE and the
313
+ # body's INDENT
314
+ if (
315
+ toknum == NEWLINE
316
+ and paren_depth == 0
317
+ and not in_decorator
318
+ and random.random() < self.frequency
319
+ ):
320
+ has_upcoming_indent = False
321
+ for j in range(idx + 1, len(tokens)):
322
+ upcoming = tokens[j][0]
323
+ if upcoming in (NL, COMMENT):
324
+ continue
325
+ if upcoming == INDENT:
326
+ has_upcoming_indent = True
327
+ break
328
+ if not has_upcoming_indent:
329
+ dead_tokens = self._generate_dead_code(indent_level)
330
+ result.extend(dead_tokens)
331
+
332
+ return result
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "python-obfuscation-framework"
7
- version = "1.9.3"
7
+ version = "1.9.4"
8
8
  description = "Python Obfuscation Framework"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-obfuscation-framework
3
- Version: 1.9.3
3
+ Version: 1.9.4
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>
@@ -1268,9 +1268,12 @@ interesting strings in Python source code. To check rules against source files
1268
1268
  and/or obfuscated files run:
1269
1269
 
1270
1270
  ```bash
1271
- yara --no-warnings yara/python.yar file.py
1271
+ yara --no-warnings yara/python.yar examples/out/custom_complete_format.py
1272
1272
  ```
1273
1273
 
1274
+ > [!NOTE]
1275
+ > The rules are far from perfect, but they are a starting point.
1276
+
1274
1277
  ## Development
1275
1278
 
1276
1279
  Project directory structure:
@@ -1363,8 +1366,7 @@ Other Python obfuscation projects:
1363
1366
 
1364
1367
  ## TODO
1365
1368
 
1366
- - Add control flow obfuscation, add dead code, opaque predicates, control flow
1367
- flattening.
1369
+ - Add dead code, opaque predicates.
1368
1370
  - Fix `NamesObfuscator`.
1369
1371
  - Add option to prepend a shebang, and add ability to customize it.
1370
1372
 
@@ -90,6 +90,7 @@ pof/obfuscator/esoteric/imports.py
90
90
  pof/obfuscator/junk/__init__.py
91
91
  pof/obfuscator/junk/add_comments.py
92
92
  pof/obfuscator/junk/add_newlines.py
93
+ pof/obfuscator/junk/dead_code.py
93
94
  pof/obfuscator/other/__init__.py
94
95
  pof/obfuscator/other/tokens.py
95
96
  pof/obfuscator/remove/__init__.py
@@ -32,6 +32,7 @@ from pof.obfuscator import (
32
32
  CommentsObfuscator,
33
33
  ConstantsObfuscator,
34
34
  ControlFlowFlattenObfuscator,
35
+ DeadCodeObfuscator,
35
36
  DeepEncryptionObfuscator,
36
37
  DefinitionsObfuscator,
37
38
  DocstringObfuscator,
@@ -191,6 +192,7 @@ OBFUSCATOR_REGISTRY: list[ObfuscatorEntry] = [
191
192
  # Junk / behavior-altering
192
193
  ObfuscatorEntry(AddCommentsObfuscator, "AddCommentsObfuscator", "junk"),
193
194
  ObfuscatorEntry(AddNewlinesObfuscator, "AddNewlinesObfuscator", "junk"),
195
+ ObfuscatorEntry(DeadCodeObfuscator, "DeadCodeObfuscator", "junk"),
194
196
  # name/variable obfuscators
195
197
  ObfuscatorEntry(ConstantsObfuscator, "ConstantsObfuscator", "other"),
196
198
  ObfuscatorEntry(
@@ -1,30 +1,22 @@
1
1
  # Language features: implicit string concatenation (multi-line and single-line)
2
-
3
-
4
- # Multi-line implicit concatenation (parenthesized)
5
2
  a = ("hello"
6
3
  "world")
7
4
  print(a)
8
5
 
9
- # In function call across lines
10
6
  print(("foo"
11
7
  "bar"))
12
8
 
13
- # Three strings across lines
14
9
  b = ("one"
15
10
  "two"
16
11
  "three")
17
12
  print(b)
18
13
 
19
- # Mixed quote styles
20
14
  c = ('hello'
21
15
  "world")
22
16
  print(c)
23
17
 
24
- # Single-line implicit concatenation
25
18
  d = "hello" "world"
26
19
  print(d)
27
20
 
28
- # Three strings on one line
29
21
  e = "a" "b" "c"
30
22
  print(e)