-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobfusfucker
executable file
·84 lines (68 loc) · 2.35 KB
/
obfusfucker
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/env python3
def get_num(n, ps=False):
if ps:
return scopify(get_num(n))
if n == 0:
return '+[]'
elif n == 1:
return '+!![]'
elif n > 1:
return '!+[]' + '+!![]' * (n - 1)
ALPHA = 'abcdefghijklmnopqrstuvwxyz'
def scopify(s):
return f'({s})'
def get_char(c, ps=False, st=False):
if c in '0123456789':
return get_num(int(c), ps)
for w, v in WORDS.items():
n = w.find(c)
if n != -1:
return f'({v}+[])[{get_num(n)}]'
if c == 'C':
return f'{get_global("escape")}({get_char("<", True)})[{get_num(2)}]'
elif c == 'E':
return f'{get_global("escape")}({get_char(">")})[{get_num(2)}]'
elif c == '<':
return f'([]+[])[{make_string("italics")}](){f"[{get_num(0)}]" * (not st)}'
elif c == '>':
return f'([]+[])[{make_string("italics")}]()[{get_num(2)}]'
elif c == '/':
return f'([]+[])[{make_string("italics")}]()[{get_num(4)}]'
elif c == 'S':
return f'([]+{get_constr("([]+[])")})[{get_num(9)}]'
elif c == 'g':
return f'([]+{get_constr("([]+[])")})[{get_num(14)}]'
elif c == 'm':
return f'([]+{get_constr("(+[])")})[{get_num(11)}]'
elif c == ',':
return f'([[],[]]+[])'
elif c in ALPHA:
return f'({get_num(ALPHA.index(c) + 10)})[{make_string("toString")}]({get_num(36)})'
else:
return f'{get_constr("([]+[])")}[{make_string("fromCharCode")}]({get_num(ord(c))})'
def get_constr(v):
return f'{v}[{make_string("constructor")}]'
def get_global(f):
return f'{make_program(f"return {f}")}()'
def make_string(s):
return '[]+' + ('+'.join(get_char(c, True if i else False) for i, c in enumerate(s)) if s else '[]')
def make_fun():
return f'[][{make_string("flat")}]'
WORDS = {
'true': '!![]',
'false': '![]',
'NaN': '+[![]]',
'undefined': '[][[]]',
'Infinity': f'+({get_num(1)}+[]+(!![]+[])[{get_num(3)}]+({get_num(1)}){"+(+[])" * 3})'
}
WORDS['function flat() {'] = f'([]+{make_fun()})'
def make_program(prog):
return f'{get_constr(make_fun())}({make_string(prog)})'
if __name__ == '__main__':
import sys
if len(sys.argv) > 1:
with open(sys.argv[1]) as f:
print(make_program(f.read()) + '()')
else:
print(f'Usage: {sys.argv[0]} [FILE]')
print('Translate JavaScript into JsFuck.')