python-obfuscation-framework 1.4.1__py3-none-any.whl
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.
- pof/__init__.py +21 -0
- pof/__main__.py +22 -0
- pof/cli.py +187 -0
- pof/errors.py +2 -0
- pof/evasion/__init__.py +57 -0
- pof/evasion/argv.py +44 -0
- pof/evasion/base.py +48 -0
- pof/evasion/cpu/__init__.py +0 -0
- pof/evasion/cpu/cpu_count.py +27 -0
- pof/evasion/fs/__init__.py +0 -0
- pof/evasion/fs/directory_exist.py +29 -0
- pof/evasion/fs/directory_list_exist.py +46 -0
- pof/evasion/fs/directory_list_missing.py +45 -0
- pof/evasion/fs/directory_missing.py +28 -0
- pof/evasion/fs/exec_method.py +51 -0
- pof/evasion/fs/executable_path.py +66 -0
- pof/evasion/fs/file_exist.py +29 -0
- pof/evasion/fs/file_list_exist.py +46 -0
- pof/evasion/fs/file_list_missing.py +45 -0
- pof/evasion/fs/file_missing.py +31 -0
- pof/evasion/fs/tmp.py +112 -0
- pof/evasion/hardware/__init__.py +0 -0
- pof/evasion/hardware/ram_count.py +50 -0
- pof/evasion/hooks/__init__.py +0 -0
- pof/evasion/hooks/debugger.py +36 -0
- pof/evasion/hooks/tracemalloc.py +23 -0
- pof/evasion/human/__init__.py +0 -0
- pof/evasion/human/p.py +45 -0
- pof/evasion/human/prompt.py +69 -0
- pof/evasion/integrity.py +129 -0
- pof/evasion/multi.py +41 -0
- pof/evasion/os/__init__.py +0 -0
- pof/evasion/os/domain.py +27 -0
- pof/evasion/os/hostname.py +27 -0
- pof/evasion/os/uid.py +28 -0
- pof/evasion/os/username.py +27 -0
- pof/evasion/processes/__init__.py +0 -0
- pof/evasion/processes/proc_count.py +47 -0
- pof/evasion/time/__init__.py +0 -0
- pof/evasion/time/expire.py +75 -0
- pof/evasion/time/uptime.py +48 -0
- pof/evasion/time/utc.py +26 -0
- pof/evasion/utils.py +198 -0
- pof/main.py +369 -0
- pof/obfuscator/__init__.py +86 -0
- pof/obfuscator/builtins.py +482 -0
- pof/obfuscator/cipher/__init__.py +0 -0
- pof/obfuscator/cipher/deep_encryption.py +194 -0
- pof/obfuscator/cipher/rc4.py +22 -0
- pof/obfuscator/cipher/shift.py +19 -0
- pof/obfuscator/cipher/xor.py +121 -0
- pof/obfuscator/compression/__init__.py +0 -0
- pof/obfuscator/compression/bz2.py +22 -0
- pof/obfuscator/compression/gzip.py +22 -0
- pof/obfuscator/compression/lzma.py +22 -0
- pof/obfuscator/compression/zlib.py +22 -0
- pof/obfuscator/constants.py +294 -0
- pof/obfuscator/definitions.py +341 -0
- pof/obfuscator/encoding/__init__.py +0 -0
- pof/obfuscator/encoding/a85.py +21 -0
- pof/obfuscator/encoding/b16.py +21 -0
- pof/obfuscator/encoding/b32.py +21 -0
- pof/obfuscator/encoding/b32hex.py +21 -0
- pof/obfuscator/encoding/b64.py +21 -0
- pof/obfuscator/encoding/b85.py +25 -0
- pof/obfuscator/encoding/binascii.py +22 -0
- pof/obfuscator/encoding/snt.py +23 -0
- pof/obfuscator/esoteric/__init__.py +0 -0
- pof/obfuscator/esoteric/call.py +49 -0
- pof/obfuscator/esoteric/doc.py +237 -0
- pof/obfuscator/esoteric/globals.py +62 -0
- pof/obfuscator/esoteric/imports.py +55 -0
- pof/obfuscator/extract_variables.py +297 -0
- pof/obfuscator/junk/__init__.py +0 -0
- pof/obfuscator/junk/add_comments.py +102 -0
- pof/obfuscator/junk/add_newlines.py +36 -0
- pof/obfuscator/names.py +474 -0
- pof/obfuscator/names_rope.py +375 -0
- pof/obfuscator/numbers.py +271 -0
- pof/obfuscator/other/__init__.py +0 -0
- pof/obfuscator/other/tokens.py +47 -0
- pof/obfuscator/remove/__init__.py +0 -0
- pof/obfuscator/remove/comments.py +36 -0
- pof/obfuscator/remove/exceptions.py +75 -0
- pof/obfuscator/remove/indents.py +28 -0
- pof/obfuscator/remove/loggings.py +120 -0
- pof/obfuscator/remove/loggings_old.py +45 -0
- pof/obfuscator/remove/newline.py +27 -0
- pof/obfuscator/remove/print.py +40 -0
- pof/obfuscator/restructure.py +15 -0
- pof/obfuscator/stegano/__init__.py +0 -0
- pof/obfuscator/stegano/docstrings.py +111 -0
- pof/obfuscator/stegano/ipv6encoding.py +21 -0
- pof/obfuscator/stegano/macencoding.py +21 -0
- pof/obfuscator/stegano/uuidencoding.py +21 -0
- pof/obfuscator/strings.py +359 -0
- pof/stager/__init__.py +17 -0
- pof/stager/cipher/__init__.py +0 -0
- pof/stager/cipher/rc4.py +36 -0
- pof/stager/download.py +80 -0
- pof/stager/image.py +374 -0
- pof/stager/lots/__init__.py +1 -0
- pof/stager/lots/cl1pnet.py +51 -0
- pof/stager/lots/pastebin.py +35 -0
- pof/stager/lots/pasters.py +30 -0
- pof/stager/quine.py +135 -0
- pof/utils/__init__.py +0 -0
- pof/utils/cipher/__init__.py +7 -0
- pof/utils/cipher/rc4.py +407 -0
- pof/utils/cipher/shift.py +41 -0
- pof/utils/compression/__init__.py +11 -0
- pof/utils/compression/bz2.py +38 -0
- pof/utils/compression/gzip.py +38 -0
- pof/utils/compression/lzma.py +38 -0
- pof/utils/compression/zlib.py +38 -0
- pof/utils/encoding/__init__.py +19 -0
- pof/utils/encoding/a85.py +35 -0
- pof/utils/encoding/b16.py +30 -0
- pof/utils/encoding/b3.py +93 -0
- pof/utils/encoding/b32.py +30 -0
- pof/utils/encoding/b32hex.py +30 -0
- pof/utils/encoding/b64.py +30 -0
- pof/utils/encoding/b85.py +35 -0
- pof/utils/encoding/binascii.py +38 -0
- pof/utils/encoding/snt.py +97 -0
- pof/utils/entropy.py +24 -0
- pof/utils/extract_names.py +204 -0
- pof/utils/generator/__init__.py +17 -0
- pof/utils/generator/advanced.py +53 -0
- pof/utils/generator/base.py +178 -0
- pof/utils/generator/basic.py +107 -0
- pof/utils/generator/names.txt +37241 -0
- pof/utils/generator/unicode.py +171 -0
- pof/utils/se/__init__.py +3 -0
- pof/utils/se/homoglyphs.py +99 -0
- pof/utils/se/homoglyphs.txt +96 -0
- pof/utils/stegano/__init__.py +5 -0
- pof/utils/stegano/ipv6encoding.py +97 -0
- pof/utils/stegano/macencoding.py +96 -0
- pof/utils/stegano/uuidencoding.py +102 -0
- pof/utils/tokens.py +68 -0
- python_obfuscation_framework-1.4.1.dist-info/LICENSE +674 -0
- python_obfuscation_framework-1.4.1.dist-info/METADATA +851 -0
- python_obfuscation_framework-1.4.1.dist-info/RECORD +147 -0
- python_obfuscation_framework-1.4.1.dist-info/WHEEL +5 -0
- python_obfuscation_framework-1.4.1.dist-info/entry_points.txt +2 -0
- python_obfuscation_framework-1.4.1.dist-info/top_level.txt +1 -0
pof/main.py
ADDED
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
"""pof (Python Obfuscator Framework)."""
|
|
2
|
+
|
|
3
|
+
import io
|
|
4
|
+
import logging
|
|
5
|
+
import random
|
|
6
|
+
from tokenize import generate_tokens
|
|
7
|
+
|
|
8
|
+
from pof.evasion import (
|
|
9
|
+
CPUCountEvasion,
|
|
10
|
+
DebuggerEvasion,
|
|
11
|
+
DomainEvasion,
|
|
12
|
+
ExecPathEvasion,
|
|
13
|
+
ExpireEvasion,
|
|
14
|
+
FileExistEvasion,
|
|
15
|
+
FileListExistEvasion,
|
|
16
|
+
FileListMissingEvasion,
|
|
17
|
+
FileMissingEvasion,
|
|
18
|
+
HostnameEvasion,
|
|
19
|
+
LinuxRAMCountEvasion,
|
|
20
|
+
LinuxUIDEvasion,
|
|
21
|
+
TracemallocEvasion,
|
|
22
|
+
UsernameEvasion,
|
|
23
|
+
)
|
|
24
|
+
from pof.obfuscator import (
|
|
25
|
+
AddCommentsObfuscator,
|
|
26
|
+
BuiltinsObfuscator,
|
|
27
|
+
CommentsObfuscator,
|
|
28
|
+
ConstantsObfuscator,
|
|
29
|
+
DefinitionsObfuscator,
|
|
30
|
+
DocstringObfuscator,
|
|
31
|
+
ExceptionObfuscator,
|
|
32
|
+
GlobalsObfuscator,
|
|
33
|
+
IndentsObfuscator,
|
|
34
|
+
LoggingObfuscator,
|
|
35
|
+
NamesObfuscator,
|
|
36
|
+
NewlineObfuscator,
|
|
37
|
+
NumberObfuscator,
|
|
38
|
+
PrintObfuscator,
|
|
39
|
+
StringsObfuscator,
|
|
40
|
+
XORObfuscator,
|
|
41
|
+
)
|
|
42
|
+
from pof.stager import ImageStager, RC4Stager
|
|
43
|
+
from pof.utils.cipher import RC4Cipher
|
|
44
|
+
from pof.utils.extract_names import NameExtract
|
|
45
|
+
from pof.utils.generator import AdvancedGenerator, BaseGenerator, BasicGenerator
|
|
46
|
+
from pof.utils.tokens import untokenize
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class BaseObfuscator:
|
|
50
|
+
@staticmethod
|
|
51
|
+
def _get_tokens(source: str):
|
|
52
|
+
if "\r" in source:
|
|
53
|
+
source = source.replace("\r\n", "\n").replace("\r", "\n")
|
|
54
|
+
if not source.endswith("\n"):
|
|
55
|
+
source += "\n"
|
|
56
|
+
io_obj = io.StringIO(source)
|
|
57
|
+
return list(generate_tokens(io_obj.readline))
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def _untokenize(tokens):
|
|
61
|
+
return untokenize(tokens)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class Obfuscator(BaseObfuscator):
|
|
65
|
+
def obfuscate(
|
|
66
|
+
self,
|
|
67
|
+
source,
|
|
68
|
+
*,
|
|
69
|
+
remove_logs=False,
|
|
70
|
+
remove_prints=False,
|
|
71
|
+
remove_exceptions=False,
|
|
72
|
+
):
|
|
73
|
+
"""Complete chained obfuscation."""
|
|
74
|
+
tokens = self._get_tokens(source)
|
|
75
|
+
|
|
76
|
+
# get all the names and add them to the RESERVED_WORDS for the
|
|
77
|
+
# generators
|
|
78
|
+
reserved_words_add = NameExtract.get_names(tokens)
|
|
79
|
+
BaseGenerator.extend_reserved(reserved_words_add)
|
|
80
|
+
|
|
81
|
+
msg = f"reserved {len(tokens)} names"
|
|
82
|
+
logging.info(msg)
|
|
83
|
+
|
|
84
|
+
# clean input
|
|
85
|
+
tokens = CommentsObfuscator().obfuscate_tokens(tokens)
|
|
86
|
+
if remove_logs:
|
|
87
|
+
# doesn't work yet !
|
|
88
|
+
tokens = LoggingObfuscator().obfuscate_tokens(tokens)
|
|
89
|
+
|
|
90
|
+
if remove_prints:
|
|
91
|
+
# not 100% safe !
|
|
92
|
+
tokens = PrintObfuscator().obfuscate_tokens(tokens)
|
|
93
|
+
|
|
94
|
+
if remove_exceptions:
|
|
95
|
+
# not fully tested
|
|
96
|
+
ex_generator = (
|
|
97
|
+
BasicGenerator.number_name_generator()
|
|
98
|
+
) # TODO (deoktr): have multiple generator !!!
|
|
99
|
+
tokens = ExceptionObfuscator(
|
|
100
|
+
add_codes=True,
|
|
101
|
+
generator=ex_generator,
|
|
102
|
+
).obfuscate_tokens(tokens)
|
|
103
|
+
|
|
104
|
+
tokens = DefinitionsObfuscator().obfuscate_tokens(tokens)
|
|
105
|
+
|
|
106
|
+
# configure generator
|
|
107
|
+
# generator = alphabet_generator()
|
|
108
|
+
gen_dict = {
|
|
109
|
+
86: AdvancedGenerator.realistic_generator(),
|
|
110
|
+
10: BasicGenerator.alphabet_generator(),
|
|
111
|
+
4: BasicGenerator.number_name_generator(length=random.randint(2, 5)),
|
|
112
|
+
}
|
|
113
|
+
generator = AdvancedGenerator.multi_generator(gen_dict)
|
|
114
|
+
|
|
115
|
+
# core obfuscation
|
|
116
|
+
tokens = ConstantsObfuscator(
|
|
117
|
+
generator=generator,
|
|
118
|
+
obf_number_rate=0.7,
|
|
119
|
+
# obf_string_rate=0.1,
|
|
120
|
+
obf_string_rate=0, # FIXME (deoktr): when string obfuscation is enable and
|
|
121
|
+
# name obfuscator comes next, the time delai of
|
|
122
|
+
# http requests are very slow, idk why
|
|
123
|
+
obf_builtins_rate=0.3,
|
|
124
|
+
).obfuscate_tokens(tokens)
|
|
125
|
+
|
|
126
|
+
# FIXME (deoktr): breaks !
|
|
127
|
+
# for detailed explanation just consider the following:
|
|
128
|
+
# ```
|
|
129
|
+
# import module
|
|
130
|
+
# class Bar:
|
|
131
|
+
# def __init__(self):
|
|
132
|
+
# self.foo = getattr(config, "FOO", True)
|
|
133
|
+
# module.imported.function(self.foo)
|
|
134
|
+
# ```
|
|
135
|
+
# in this case the first instance of `foo` will successfully be
|
|
136
|
+
# obfuscated (as it should) but then with the getattr it's marked has
|
|
137
|
+
# "imported" because it's the result of a builtin function, but notice
|
|
138
|
+
# that it's not a "simple" variable but rather it's a class attribute
|
|
139
|
+
# and has a 'self' behind it, so if the variable is marked has imported
|
|
140
|
+
# and a `.` is placed behind it, it won't be changed, this is the case
|
|
141
|
+
# in the function call, which is itself imported, and thus set the
|
|
142
|
+
# imported attribute for itself and all the parameters given to it
|
|
143
|
+
# this is because we don't keep track of the level of the imported
|
|
144
|
+
#
|
|
145
|
+
# FIXME (deoktr): breaks !
|
|
146
|
+
# Another problem is related to result of function, this is, ofc very
|
|
147
|
+
# hard to deal with, but if a function returns an object, such has for
|
|
148
|
+
# example an object of an imported class, which attribute are not
|
|
149
|
+
# obfuscatable, then it breaks.
|
|
150
|
+
# ```
|
|
151
|
+
# import foo
|
|
152
|
+
# def a():
|
|
153
|
+
# return foo.bar()
|
|
154
|
+
# x = a()
|
|
155
|
+
# x.baz()
|
|
156
|
+
# ```
|
|
157
|
+
# In this context, `baz` would be obfuscated, but it shouldn't because
|
|
158
|
+
# the function is part of the `foo` imported module
|
|
159
|
+
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
160
|
+
|
|
161
|
+
tokens = GlobalsObfuscator().obfuscate_tokens(tokens)
|
|
162
|
+
tokens = BuiltinsObfuscator().obfuscate_tokens(tokens)
|
|
163
|
+
|
|
164
|
+
b64decode_name = next(generator)
|
|
165
|
+
b85decode_name = next(generator)
|
|
166
|
+
string_obfuscator = StringsObfuscator(
|
|
167
|
+
import_b64decode=True,
|
|
168
|
+
import_b85decode=True,
|
|
169
|
+
b64decode_name=b64decode_name,
|
|
170
|
+
b85decode_name=b85decode_name,
|
|
171
|
+
)
|
|
172
|
+
tokens = string_obfuscator.obfuscate_tokens(tokens)
|
|
173
|
+
string_obfuscator.import_b64decode = False
|
|
174
|
+
string_obfuscator.import_b85decode = False
|
|
175
|
+
|
|
176
|
+
for _ in range(2):
|
|
177
|
+
tokens = NumberObfuscator().obfuscate_tokens(tokens)
|
|
178
|
+
tokens = BuiltinsObfuscator().obfuscate_tokens(tokens)
|
|
179
|
+
for _ in range(2):
|
|
180
|
+
tokens = string_obfuscator.obfuscate_tokens(tokens)
|
|
181
|
+
tokens = AddCommentsObfuscator().obfuscate_tokens(tokens)
|
|
182
|
+
|
|
183
|
+
# clean output
|
|
184
|
+
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
185
|
+
tokens = NewlineObfuscator().obfuscate_tokens(tokens)
|
|
186
|
+
|
|
187
|
+
xor_payload = False
|
|
188
|
+
if xor_payload:
|
|
189
|
+
tokens = XORObfuscator().obfuscate_tokens(tokens)
|
|
190
|
+
generator = BasicGenerator.alphabet_generator()
|
|
191
|
+
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
192
|
+
|
|
193
|
+
docstring_payload = False
|
|
194
|
+
if docstring_payload:
|
|
195
|
+
tokens = DocstringObfuscator().obfuscate_tokensj(tokens)
|
|
196
|
+
generator = BasicGenerator.alphabet_generator()
|
|
197
|
+
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
198
|
+
tokens = BuiltinsObfuscator().obfuscate_tokens(tokens)
|
|
199
|
+
tokens = StringsObfuscator(
|
|
200
|
+
import_b64decode=True,
|
|
201
|
+
import_b85decode=True,
|
|
202
|
+
b64decode_name=b64decode_name,
|
|
203
|
+
b85decode_name=b85decode_name,
|
|
204
|
+
).obfuscate_tokens(tokens)
|
|
205
|
+
|
|
206
|
+
return self._untokenize(tokens)
|
|
207
|
+
|
|
208
|
+
def basic(self, source):
|
|
209
|
+
"""Just the bare minimum obfuscation."""
|
|
210
|
+
tokens = self._get_tokens(source)
|
|
211
|
+
tokens = CommentsObfuscator().obfuscate_tokens(tokens)
|
|
212
|
+
generator = BasicGenerator.alphabet_generator()
|
|
213
|
+
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
214
|
+
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
215
|
+
tokens = NewlineObfuscator().obfuscate_tokens(tokens)
|
|
216
|
+
return self._untokenize(tokens)
|
|
217
|
+
|
|
218
|
+
def full_evasion( # noqa: C901, PLR0913, PLR0912
|
|
219
|
+
self,
|
|
220
|
+
source,
|
|
221
|
+
hostname: str | None = None,
|
|
222
|
+
username: str | None = None,
|
|
223
|
+
uid=None,
|
|
224
|
+
domain: str | None = None,
|
|
225
|
+
file_exist=None,
|
|
226
|
+
file_missing=None,
|
|
227
|
+
min_cpu_count: int | None = None,
|
|
228
|
+
min_ram: int | None = None,
|
|
229
|
+
file_list_exist=None,
|
|
230
|
+
file_list_missing=None,
|
|
231
|
+
*,
|
|
232
|
+
expire: bool = False,
|
|
233
|
+
check_tracemalloc: bool = False,
|
|
234
|
+
check_debugger: bool = False,
|
|
235
|
+
check_executable_path: bool = False,
|
|
236
|
+
):
|
|
237
|
+
tokens = self._get_tokens(source)
|
|
238
|
+
|
|
239
|
+
if file_missing:
|
|
240
|
+
tokens = FileMissingEvasion(file=file_missing).add_evasion(tokens)
|
|
241
|
+
if min_cpu_count:
|
|
242
|
+
tokens = CPUCountEvasion(min_cpu_count=min_cpu_count).add_evasion(tokens)
|
|
243
|
+
if min_ram:
|
|
244
|
+
tokens = LinuxRAMCountEvasion(min_ram=min_ram).add_evasion(tokens)
|
|
245
|
+
if check_tracemalloc:
|
|
246
|
+
tokens = TracemallocEvasion().add_evasion(tokens)
|
|
247
|
+
if file_list_exist:
|
|
248
|
+
from pof.evasion.utils import FILE_SYSTEM
|
|
249
|
+
|
|
250
|
+
tokens = FileListMissingEvasion(file_list=FILE_SYSTEM).add_evasion(tokens)
|
|
251
|
+
if file_exist:
|
|
252
|
+
tokens = FileExistEvasion(file=file_exist).add_evasion(tokens)
|
|
253
|
+
if file_list_missing:
|
|
254
|
+
# TODO (deoktr): remove
|
|
255
|
+
idk = ["/tmp/a", "/tmp/b"] # noqa: S108
|
|
256
|
+
tokens = FileListExistEvasion(file_list=idk).add_evasion(tokens)
|
|
257
|
+
if domain:
|
|
258
|
+
tokens = DomainEvasion(domain=domain).add_evasion(tokens)
|
|
259
|
+
if hostname:
|
|
260
|
+
tokens = HostnameEvasion(hostname=hostname).add_evasion(tokens)
|
|
261
|
+
if uid:
|
|
262
|
+
tokens = LinuxUIDEvasion(uid=uid).add_evasion(tokens)
|
|
263
|
+
if username:
|
|
264
|
+
tokens = UsernameEvasion(username=username).add_evasion(tokens)
|
|
265
|
+
if expire:
|
|
266
|
+
from datetime import datetime, timedelta
|
|
267
|
+
|
|
268
|
+
over_datetime = datetime.utcnow() # noqa: DTZ003
|
|
269
|
+
under_datetime = datetime.utcnow() + timedelta(seconds=5) # noqa: DTZ003
|
|
270
|
+
tokens = ExpireEvasion(
|
|
271
|
+
under_datetime=under_datetime,
|
|
272
|
+
over_datetime=over_datetime,
|
|
273
|
+
).add_evasion(tokens)
|
|
274
|
+
if check_executable_path:
|
|
275
|
+
tokens = ExecPathEvasion().add_evasion(tokens)
|
|
276
|
+
if check_debugger:
|
|
277
|
+
tokens = DebuggerEvasion().add_evasion(tokens)
|
|
278
|
+
|
|
279
|
+
return self._untokenize(tokens)
|
|
280
|
+
|
|
281
|
+
def circles(self, source):
|
|
282
|
+
tokens = self._get_tokens(source)
|
|
283
|
+
generator = AdvancedGenerator.fixed_length_generator()
|
|
284
|
+
tokens = CommentsObfuscator().obfuscate_tokens(tokens)
|
|
285
|
+
tokens = ExceptionObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
286
|
+
tokens = LoggingObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
287
|
+
# FIXME (deoktr): when placed BEFORE NamesObfuscator it breaks the code
|
|
288
|
+
# tokens = ConstantsObfuscator(
|
|
289
|
+
# generator=generator,
|
|
290
|
+
# obf_number_rate=1,
|
|
291
|
+
# # FIXME (deoktr): breaks if obf_string_rate=1 with NamesObfuscator
|
|
292
|
+
# obf_string_rate=0,
|
|
293
|
+
# # FIXME (deoktr): breaks if obf_builtins_rate=1 with NamesObfuscator
|
|
294
|
+
# obf_builtins_rate=0,
|
|
295
|
+
# ).obfuscate_tokens(tokens)
|
|
296
|
+
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
297
|
+
tokens = ConstantsObfuscator(
|
|
298
|
+
generator=generator,
|
|
299
|
+
obf_number_rate=1,
|
|
300
|
+
obf_string_rate=1,
|
|
301
|
+
obf_builtins_rate=1,
|
|
302
|
+
).obfuscate_tokens(tokens)
|
|
303
|
+
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
304
|
+
tokens = NewlineObfuscator().obfuscate_tokens(tokens)
|
|
305
|
+
|
|
306
|
+
from tokenize import COMMENT, NEWLINE
|
|
307
|
+
|
|
308
|
+
tokens = [(COMMENT, "# I love circles <3"), (NEWLINE, "\n"), *tokens]
|
|
309
|
+
|
|
310
|
+
return self._untokenize(tokens)
|
|
311
|
+
|
|
312
|
+
def image(self, source):
|
|
313
|
+
"""Encrypt and store the payload code inside an image."""
|
|
314
|
+
tokens = self._get_tokens(source)
|
|
315
|
+
img_in = "pof/wip/stegano/i.png"
|
|
316
|
+
encoding_class = RC4Cipher()
|
|
317
|
+
tokens = ImageStager(encoding_class=encoding_class).generate_stager(
|
|
318
|
+
tokens,
|
|
319
|
+
img_in,
|
|
320
|
+
)
|
|
321
|
+
return self._untokenize(tokens)
|
|
322
|
+
|
|
323
|
+
def advanced_image(self, source):
|
|
324
|
+
"""Obfuscate, encrypt, and store the payload code inside an image."""
|
|
325
|
+
tokens = self._get_tokens(source)
|
|
326
|
+
generator = BasicGenerator.alphabet_generator()
|
|
327
|
+
|
|
328
|
+
# obfuscate source
|
|
329
|
+
tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
330
|
+
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
331
|
+
|
|
332
|
+
# stage inside image
|
|
333
|
+
img_in = "pof/wip/stegano/i.png"
|
|
334
|
+
encoding_class = RC4Cipher()
|
|
335
|
+
tokens = ImageStager(encoding_class=encoding_class).generate_stager(
|
|
336
|
+
tokens,
|
|
337
|
+
img_in,
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
# FIXME (deoktr): break the image stager
|
|
341
|
+
# obfuscate stager
|
|
342
|
+
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
343
|
+
# tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
344
|
+
|
|
345
|
+
# encrypt stager
|
|
346
|
+
tokens = RC4Stager().generate_stager(tokens)
|
|
347
|
+
|
|
348
|
+
# FIXME (deoktr): break the decryption part because set 256 to a variable
|
|
349
|
+
# obfuscate decryption stager
|
|
350
|
+
# tokens = NamesObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
351
|
+
# tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
352
|
+
|
|
353
|
+
return self._untokenize(tokens)
|
|
354
|
+
|
|
355
|
+
def test(self, source):
|
|
356
|
+
tokens = self._get_tokens(source)
|
|
357
|
+
|
|
358
|
+
# generator = AdvancedGenerator.fixed_length_generator()
|
|
359
|
+
# tokens = ConstantsObfuscator(generator=generator).obfuscate_tokens(tokens)
|
|
360
|
+
|
|
361
|
+
tokens = CommentsObfuscator().obfuscate_tokens(tokens)
|
|
362
|
+
# tokens = DeepEncryptionEvasion().add_evasion(tokens) # TODO (deoktr): fix
|
|
363
|
+
tokens = NamesObfuscator(
|
|
364
|
+
generator=AdvancedGenerator.fixed_length_generator(),
|
|
365
|
+
).obfuscate_tokens(tokens)
|
|
366
|
+
tokens = IndentsObfuscator().obfuscate_tokens(tokens)
|
|
367
|
+
tokens = NewlineObfuscator().obfuscate_tokens(tokens)
|
|
368
|
+
|
|
369
|
+
return self._untokenize(tokens)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from .builtins import BuiltinsObfuscator
|
|
2
|
+
from .cipher.deep_encryption import DeepEncryptionObfuscator
|
|
3
|
+
from .cipher.rc4 import RC4Obfuscator
|
|
4
|
+
from .cipher.shift import ShiftObfuscator
|
|
5
|
+
from .cipher.xor import XORObfuscator
|
|
6
|
+
from .compression.bz2 import Bz2Obfuscator
|
|
7
|
+
from .compression.gzip import GzipObfuscator
|
|
8
|
+
from .compression.lzma import LzmaObfuscator
|
|
9
|
+
from .compression.zlib import ZlibObfuscator
|
|
10
|
+
from .constants import ConstantsObfuscator
|
|
11
|
+
from .definitions import DefinitionsObfuscator
|
|
12
|
+
from .encoding.a85 import ASCII85Obfuscator
|
|
13
|
+
from .encoding.b16 import Base16Obfuscator
|
|
14
|
+
from .encoding.b32 import Base32Obfuscator
|
|
15
|
+
from .encoding.b32hex import Base32HexObfuscator
|
|
16
|
+
from .encoding.b64 import Base64Obfuscator
|
|
17
|
+
from .encoding.b85 import Base85Obfuscator
|
|
18
|
+
from .encoding.binascii import BinasciiObfuscator
|
|
19
|
+
from .encoding.snt import SpacenTabObfuscator
|
|
20
|
+
from .esoteric.call import CallObfuscator
|
|
21
|
+
from .esoteric.doc import CharFromDocObfuscator
|
|
22
|
+
from .esoteric.globals import GlobalsObfuscator
|
|
23
|
+
from .esoteric.imports import ImportsObfuscator
|
|
24
|
+
from .extract_variables import ExtractVariablesObfuscator
|
|
25
|
+
from .junk.add_comments import AddCommentsObfuscator
|
|
26
|
+
from .junk.add_newlines import AddNewlinesObfuscator
|
|
27
|
+
from .names import NamesObfuscator
|
|
28
|
+
from .names_rope import NamesRopeObfuscator
|
|
29
|
+
from .numbers import NumberObfuscator
|
|
30
|
+
from .other.tokens import TokensObfuscator
|
|
31
|
+
from .remove.comments import CommentsObfuscator
|
|
32
|
+
from .remove.exceptions import ExceptionObfuscator
|
|
33
|
+
from .remove.indents import IndentsObfuscator
|
|
34
|
+
from .remove.loggings import LoggingObfuscator, LoggingRemoveObfuscator
|
|
35
|
+
from .remove.newline import NewlineObfuscator
|
|
36
|
+
from .remove.print import PrintObfuscator
|
|
37
|
+
from .stegano.docstrings import DocstringObfuscator
|
|
38
|
+
from .stegano.ipv6encoding import IPv6Obfuscator
|
|
39
|
+
from .stegano.macencoding import MACObfuscator
|
|
40
|
+
from .stegano.uuidencoding import UUIDObfuscator
|
|
41
|
+
from .strings import StringsObfuscator
|
|
42
|
+
|
|
43
|
+
__all__ = [
|
|
44
|
+
"ASCII85Obfuscator",
|
|
45
|
+
"AddCommentsObfuscator",
|
|
46
|
+
"AddNewlinesObfuscator",
|
|
47
|
+
"Base16Obfuscator",
|
|
48
|
+
"Base32HexObfuscator",
|
|
49
|
+
"Base32Obfuscator",
|
|
50
|
+
"Base64Obfuscator",
|
|
51
|
+
"Base85Obfuscator",
|
|
52
|
+
"BinasciiObfuscator",
|
|
53
|
+
"BuiltinsObfuscator",
|
|
54
|
+
"Bz2Obfuscator",
|
|
55
|
+
"CallObfuscator",
|
|
56
|
+
"CharFromDocObfuscator",
|
|
57
|
+
"CommentsObfuscator",
|
|
58
|
+
"ConstantsObfuscator",
|
|
59
|
+
"DeepEncryptionObfuscator",
|
|
60
|
+
"DefinitionsObfuscator",
|
|
61
|
+
"DocstringObfuscator",
|
|
62
|
+
"ExceptionObfuscator",
|
|
63
|
+
"ExtractVariablesObfuscator",
|
|
64
|
+
"GlobalsObfuscator",
|
|
65
|
+
"GzipObfuscator",
|
|
66
|
+
"IPv6Obfuscator",
|
|
67
|
+
"ImportsObfuscator",
|
|
68
|
+
"IndentsObfuscator",
|
|
69
|
+
"LoggingObfuscator",
|
|
70
|
+
"LoggingRemoveObfuscator",
|
|
71
|
+
"LzmaObfuscator",
|
|
72
|
+
"MACObfuscator",
|
|
73
|
+
"NamesObfuscator",
|
|
74
|
+
"NamesRopeObfuscator",
|
|
75
|
+
"NewlineObfuscator",
|
|
76
|
+
"NumberObfuscator",
|
|
77
|
+
"PrintObfuscator",
|
|
78
|
+
"RC4Obfuscator",
|
|
79
|
+
"ShiftObfuscator",
|
|
80
|
+
"SpacenTabObfuscator",
|
|
81
|
+
"StringsObfuscator",
|
|
82
|
+
"TokensObfuscator",
|
|
83
|
+
"UUIDObfuscator",
|
|
84
|
+
"XORObfuscator",
|
|
85
|
+
"ZlibObfuscator",
|
|
86
|
+
]
|