js-beautify 0.1.7
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.
- data/.document +5 -0
- data/.gitmodules +4 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +27 -0
- data/LICENSE.txt +20 -0
- data/README.rdoc +13 -0
- data/Rakefile +29 -0
- data/VERSION +1 -0
- data/bin/js-beautify +5 -0
- data/init.sh +3 -0
- data/js-beautify-copy/.gitmodules +3 -0
- data/js-beautify-copy/Makefile +71 -0
- data/js-beautify-copy/README.md +39 -0
- data/js-beautify-copy/attic/beautify-cl/beautify-cl.js +142 -0
- data/js-beautify-copy/attic/bin/beautify_js +80 -0
- data/js-beautify-copy/attic/opera-userscript/beautifier.js +1087 -0
- data/js-beautify-copy/attic/opera-userscript/make_opera_userscript.sh +42 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.cpp +121 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.pro +5 -0
- data/js-beautify-copy/attic/qtscript/jsbeautify.qrc +6 -0
- data/js-beautify-copy/attic/qtscript/readme.txt +28 -0
- data/js-beautify-copy/attic/readme.txt +2 -0
- data/js-beautify-copy/attic/unmaintained/bbedit/jsBeautify_BBED.scpt +522 -0
- data/js-beautify-copy/attic/unmaintained/c-sharp/JSBeautify.cs +801 -0
- data/js-beautify-copy/attic/v8/README.txt +40 -0
- data/js-beautify-copy/attic/v8/beautify.h +2390 -0
- data/js-beautify-copy/attic/v8/jsbeautify.cpp +215 -0
- data/js-beautify-copy/beautify-css.js +198 -0
- data/js-beautify-copy/beautify-html.js +514 -0
- data/js-beautify-copy/beautify.js +1293 -0
- data/js-beautify-copy/favicon.png +0 -0
- data/js-beautify-copy/index.html +401 -0
- data/js-beautify-copy/jquery/jquery.cookie.js +96 -0
- data/js-beautify-copy/jquery/jquery.js +167 -0
- data/js-beautify-copy/license.txt +24 -0
- data/js-beautify-copy/php/jsbeautifier.php +1599 -0
- data/js-beautify-copy/php/test.php +476 -0
- data/js-beautify-copy/python/MANIFEST.in +2 -0
- data/js-beautify-copy/python/js-beautify +7 -0
- data/js-beautify-copy/python/js-beautify-profile +16 -0
- data/js-beautify-copy/python/js-beautify-test +10 -0
- data/js-beautify-copy/python/jsbeautifier/__init__.py +1166 -0
- data/js-beautify-copy/python/jsbeautifier/tests/__init__.py +1 -0
- data/js-beautify-copy/python/jsbeautifier/tests/testindentation.py +43 -0
- data/js-beautify-copy/python/jsbeautifier/tests/testjsbeautifier.py +464 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/README.specs.mkd +25 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/__init__.py +67 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/evalbased.py +39 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/javascriptobfuscator.py +58 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/myobfuscate.py +86 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/packer.py +104 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/__init__.py +2 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-myobfuscate-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-myobfuscate-output.js +65 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-packer-62-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/test-packer-non62-input.js +1 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testjavascriptobfuscator.py +46 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testmyobfuscate.py +40 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testpacker.py +34 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/tests/testurlencode.py +36 -0
- data/js-beautify-copy/python/jsbeautifier/unpackers/urlencode.py +34 -0
- data/js-beautify-copy/python/setup.py +17 -0
- data/js-beautify-copy/tests/beautify-tests.js +489 -0
- data/js-beautify-copy/tests/run-tests +17 -0
- data/js-beautify-copy/tests/sanitytest.js +128 -0
- data/js-beautify-copy/unpackers/javascriptobfuscator_unpacker.js +103 -0
- data/js-beautify-copy/unpackers/myobfuscate_unpacker.js +81 -0
- data/js-beautify-copy/unpackers/p_a_c_k_e_r_unpacker.js +61 -0
- data/js-beautify-copy/unpackers/urlencode_unpacker.js +51 -0
- data/lib/js-beautify.rb +0 -0
- data/test/helper.rb +18 -0
- data/test/test_js-beautify.rb +7 -0
- data/update.sh +23 -0
- metadata +173 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# UNPACKERS SPECIFICATIONS
|
|
2
|
+
|
|
3
|
+
Nothing very difficult: an unpacker is a submodule placed in the directory
|
|
4
|
+
where this file was found. Each unpacker must define three symbols:
|
|
5
|
+
|
|
6
|
+
* `PRIORITY` : integer number expressing the priority in applying this
|
|
7
|
+
unpacker. Lower number means higher priority.
|
|
8
|
+
Makes sense only if a source file has been packed with
|
|
9
|
+
more than one packer.
|
|
10
|
+
* `detect(source)` : returns `True` if source is packed, otherwise, `False`.
|
|
11
|
+
* `unpack(source)` : takes a `source` string and unpacks it. Must always return
|
|
12
|
+
valid JavaScript. That is to say, your code should look
|
|
13
|
+
like:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
if detect(source):
|
|
17
|
+
return do_your_fancy_things_with(source)
|
|
18
|
+
else:
|
|
19
|
+
return source
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
*You can safely define any other symbol in your module, as it will be ignored.*
|
|
23
|
+
|
|
24
|
+
`__init__` code will automatically load new unpackers, without any further step
|
|
25
|
+
to be accomplished. Simply drop it in this directory.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#
|
|
2
|
+
# General code for JSBeautifier unpackers infrastructure. See README.specs
|
|
3
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
4
|
+
#
|
|
5
|
+
|
|
6
|
+
"""General code for JSBeautifier unpackers infrastructure."""
|
|
7
|
+
|
|
8
|
+
import pkgutil
|
|
9
|
+
import re
|
|
10
|
+
from jsbeautifier.unpackers import evalbased
|
|
11
|
+
|
|
12
|
+
# NOTE: AT THE MOMENT, IT IS DEACTIVATED FOR YOUR SECURITY: it runs js!
|
|
13
|
+
BLACKLIST = ['jsbeautifier.unpackers.evalbased']
|
|
14
|
+
|
|
15
|
+
class UnpackingError(Exception):
|
|
16
|
+
"""Badly packed source or general error. Argument is a
|
|
17
|
+
meaningful description."""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
def getunpackers():
|
|
21
|
+
"""Scans the unpackers dir, finds unpackers and add them to UNPACKERS list.
|
|
22
|
+
An unpacker will be loaded only if it is a valid python module (name must
|
|
23
|
+
adhere to naming conventions) and it is not blacklisted (i.e. inserted
|
|
24
|
+
into BLACKLIST."""
|
|
25
|
+
path = __path__
|
|
26
|
+
prefix = __name__ + '.'
|
|
27
|
+
unpackers = []
|
|
28
|
+
interface = ['unpack', 'detect', 'PRIORITY']
|
|
29
|
+
for _importer, modname, _ispkg in pkgutil.iter_modules(path, prefix):
|
|
30
|
+
if 'tests' not in modname and modname not in BLACKLIST:
|
|
31
|
+
try:
|
|
32
|
+
module = __import__(modname, fromlist=interface)
|
|
33
|
+
except ImportError:
|
|
34
|
+
raise UnpackingError('Bad unpacker: %s' % modname)
|
|
35
|
+
else:
|
|
36
|
+
unpackers.append(module)
|
|
37
|
+
|
|
38
|
+
return sorted(unpackers, key = lambda mod: mod.PRIORITY)
|
|
39
|
+
|
|
40
|
+
UNPACKERS = getunpackers()
|
|
41
|
+
|
|
42
|
+
def run(source, evalcode=False):
|
|
43
|
+
"""Runs the applicable unpackers and return unpacked source as a string."""
|
|
44
|
+
for unpacker in [mod for mod in UNPACKERS if mod.detect(source)]:
|
|
45
|
+
source = unpacker.unpack(source)
|
|
46
|
+
if evalcode and evalbased.detect(source):
|
|
47
|
+
source = evalbased.unpack(source)
|
|
48
|
+
return source
|
|
49
|
+
|
|
50
|
+
def filtercomments(source):
|
|
51
|
+
"""NOT USED: strips trailing comments and put them at the top."""
|
|
52
|
+
trailing_comments = []
|
|
53
|
+
comment = True
|
|
54
|
+
|
|
55
|
+
while comment:
|
|
56
|
+
if re.search(r'^\s*\/\*', source):
|
|
57
|
+
comment = source[0, source.index('*/') + 2]
|
|
58
|
+
elif re.search(r'^\s*\/\/', source):
|
|
59
|
+
comment = re.search(r'^\s*\/\/', source).group(0)
|
|
60
|
+
else:
|
|
61
|
+
comment = None
|
|
62
|
+
|
|
63
|
+
if comment:
|
|
64
|
+
source = re.sub(r'^\s+', '', source[len(comment):])
|
|
65
|
+
trailing_comments.append(comment)
|
|
66
|
+
|
|
67
|
+
return '\n'.join(trailing_comments) + source
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Unpacker for eval() based packers, a part of javascript beautifier
|
|
3
|
+
# by Einar Lielmanis <einar@jsbeautifier.org>
|
|
4
|
+
#
|
|
5
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
6
|
+
#
|
|
7
|
+
# usage:
|
|
8
|
+
#
|
|
9
|
+
# if detect(some_string):
|
|
10
|
+
# unpacked = unpack(some_string)
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
"""Unpacker for eval() based packers: runs JS code and returns result.
|
|
14
|
+
Works only if a JS interpreter (e.g. Mozilla's Rhino) is installed and
|
|
15
|
+
properly set up on host."""
|
|
16
|
+
|
|
17
|
+
from subprocess import PIPE, Popen
|
|
18
|
+
|
|
19
|
+
PRIORITY = 3
|
|
20
|
+
|
|
21
|
+
def detect(source):
|
|
22
|
+
"""Detects if source is likely to be eval() packed."""
|
|
23
|
+
return source.strip().lower().startswith('eval(function(')
|
|
24
|
+
|
|
25
|
+
def unpack(source):
|
|
26
|
+
"""Runs source and return resulting code."""
|
|
27
|
+
return jseval('print %s;' % source[4:]) if detect(source) else source
|
|
28
|
+
|
|
29
|
+
# In case of failure, we'll just return the original, without crashing on user.
|
|
30
|
+
def jseval(script):
|
|
31
|
+
"""Run code in the JS interpreter and return output."""
|
|
32
|
+
try:
|
|
33
|
+
interpreter = Popen(['js'], stdin=PIPE, stdout=PIPE)
|
|
34
|
+
except OSError:
|
|
35
|
+
return script
|
|
36
|
+
result, errors = interpreter.communicate(script)
|
|
37
|
+
if interpreter.poll() or errors:
|
|
38
|
+
return script
|
|
39
|
+
return result
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#
|
|
2
|
+
# simple unpacker/deobfuscator for scripts messed up with
|
|
3
|
+
# javascriptobfuscator.com
|
|
4
|
+
#
|
|
5
|
+
# written by Einar Lielmanis <einar@jsbeautifier.org>
|
|
6
|
+
# rewritten in Python by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
7
|
+
#
|
|
8
|
+
# Will always return valid javascript: if `detect()` is false, `code` is
|
|
9
|
+
# returned, unmodified.
|
|
10
|
+
#
|
|
11
|
+
# usage:
|
|
12
|
+
#
|
|
13
|
+
# if javascriptobfuscator.detect(some_string):
|
|
14
|
+
# some_string = javascriptobfuscator.unpack(some_string)
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
"""deobfuscator for scripts messed up with JavascriptObfuscator.com"""
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
|
|
21
|
+
PRIORITY = 1
|
|
22
|
+
|
|
23
|
+
def smartsplit(code):
|
|
24
|
+
"""Split `code` at " symbol, only if it is not escaped."""
|
|
25
|
+
strings = []
|
|
26
|
+
pos = 0
|
|
27
|
+
while pos < len(code):
|
|
28
|
+
if code[pos] == '"':
|
|
29
|
+
word = '' # new word
|
|
30
|
+
pos += 1
|
|
31
|
+
while pos < len(code):
|
|
32
|
+
if code[pos] == '"':
|
|
33
|
+
break
|
|
34
|
+
if code[pos] == '\\':
|
|
35
|
+
word += '\\'
|
|
36
|
+
pos += 1
|
|
37
|
+
word += code[pos]
|
|
38
|
+
pos += 1
|
|
39
|
+
strings.append('"%s"' % word)
|
|
40
|
+
pos += 1
|
|
41
|
+
return strings
|
|
42
|
+
|
|
43
|
+
def detect(code):
|
|
44
|
+
"""Detects if `code` is JavascriptObfuscator.com packed."""
|
|
45
|
+
# prefer `is not` idiom, so that a true boolean is returned
|
|
46
|
+
return (re.search(r'^var _0x[a-f0-9]+ ?\= ?\[', code) is not None)
|
|
47
|
+
|
|
48
|
+
def unpack(code):
|
|
49
|
+
"""Unpacks JavascriptObfuscator.com packed code."""
|
|
50
|
+
if detect(code):
|
|
51
|
+
matches = re.search(r'var (_0x[a-f\d]+) ?\= ?\[(.*?)\];', code)
|
|
52
|
+
if matches:
|
|
53
|
+
variable = matches.group(1)
|
|
54
|
+
dictionary = smartsplit(matches.group(2))
|
|
55
|
+
code = code[len(matches.group(0)):]
|
|
56
|
+
for key, value in enumerate(dictionary):
|
|
57
|
+
code = code.replace(r'%s[%s]' % (variable, key), value)
|
|
58
|
+
return code
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
#
|
|
2
|
+
# deobfuscator for scripts messed up with myobfuscate.com
|
|
3
|
+
# by Einar Lielmanis <einar@jsbeautifier.org>
|
|
4
|
+
#
|
|
5
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
6
|
+
#
|
|
7
|
+
# usage:
|
|
8
|
+
#
|
|
9
|
+
# if detect(some_string):
|
|
10
|
+
# unpacked = unpack(some_string)
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
# CAVEAT by Einar Lielmanis
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# You really don't want to obfuscate your scripts there: they're tracking
|
|
17
|
+
# your unpackings, your script gets turned into something like this,
|
|
18
|
+
# as of 2011-08-26:
|
|
19
|
+
#
|
|
20
|
+
# var _escape = 'your_script_escaped';
|
|
21
|
+
# var _111 = document.createElement('script');
|
|
22
|
+
# _111.src = 'http://api.www.myobfuscate.com/?getsrc=ok' +
|
|
23
|
+
# '&ref=' + encodeURIComponent(document.referrer) +
|
|
24
|
+
# '&url=' + encodeURIComponent(document.URL);
|
|
25
|
+
# var 000 = document.getElementsByTagName('head')[0];
|
|
26
|
+
# 000.appendChild(_111);
|
|
27
|
+
# document.write(unescape(_escape));
|
|
28
|
+
#
|
|
29
|
+
|
|
30
|
+
"""Deobfuscator for scripts messed up with MyObfuscate.com"""
|
|
31
|
+
|
|
32
|
+
import re
|
|
33
|
+
import base64
|
|
34
|
+
|
|
35
|
+
# Python 2 retrocompatibility
|
|
36
|
+
# pylint: disable=F0401
|
|
37
|
+
# pylint: disable=E0611
|
|
38
|
+
try:
|
|
39
|
+
from urllib import unquote
|
|
40
|
+
except ImportError:
|
|
41
|
+
from urllib.parse import unquote
|
|
42
|
+
|
|
43
|
+
from jsbeautifier.unpackers import UnpackingError
|
|
44
|
+
|
|
45
|
+
PRIORITY = 1
|
|
46
|
+
|
|
47
|
+
CAVEAT = """//
|
|
48
|
+
// Unpacker warning: be careful when using myobfuscate.com for your projects:
|
|
49
|
+
// scripts obfuscated by the free online version call back home.
|
|
50
|
+
//
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
SIGNATURE = (r'["\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F'
|
|
55
|
+
r'\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x61\x62\x63\x64\x65'
|
|
56
|
+
r'\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75'
|
|
57
|
+
r'\x76\x77\x78\x79\x7A\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2B'
|
|
58
|
+
r'\x2F\x3D","","\x63\x68\x61\x72\x41\x74","\x69\x6E\x64\x65\x78'
|
|
59
|
+
r'\x4F\x66","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","'
|
|
60
|
+
r'\x6C\x65\x6E\x67\x74\x68"]')
|
|
61
|
+
|
|
62
|
+
def detect(source):
|
|
63
|
+
"""Detects MyObfuscate.com packer."""
|
|
64
|
+
return SIGNATURE in source
|
|
65
|
+
|
|
66
|
+
def unpack(source):
|
|
67
|
+
"""Unpacks js code packed with MyObfuscate.com"""
|
|
68
|
+
if not detect(source):
|
|
69
|
+
return source
|
|
70
|
+
payload = unquote(_filter(source))
|
|
71
|
+
match = re.search(r"^var _escape\='<script>(.*)<\/script>'",
|
|
72
|
+
payload, re.DOTALL)
|
|
73
|
+
polished = match.group(1) if match else source
|
|
74
|
+
return CAVEAT + polished
|
|
75
|
+
|
|
76
|
+
def _filter(source):
|
|
77
|
+
"""Extracts and decode payload (original file) from `source`"""
|
|
78
|
+
try:
|
|
79
|
+
varname = re.search(r'eval\(\w+\(\w+\((\w+)\)\)\);', source).group(1)
|
|
80
|
+
reverse = re.search(r"var +%s *\= *'(.*)';" % varname, source).group(1)
|
|
81
|
+
except AttributeError:
|
|
82
|
+
raise UnpackingError('Malformed MyObfuscate data.')
|
|
83
|
+
try:
|
|
84
|
+
return base64.b64decode(reverse[::-1].encode('utf8')).decode('utf8')
|
|
85
|
+
except TypeError:
|
|
86
|
+
raise UnpackingError('MyObfuscate payload is not base64-encoded.')
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier
|
|
3
|
+
# by Einar Lielmanis <einar@jsbeautifier.org>
|
|
4
|
+
#
|
|
5
|
+
# written by Stefano Sanfilippo <a.little.coder@gmail.com>
|
|
6
|
+
#
|
|
7
|
+
# usage:
|
|
8
|
+
#
|
|
9
|
+
# if detect(some_string):
|
|
10
|
+
# unpacked = unpack(some_string)
|
|
11
|
+
#
|
|
12
|
+
|
|
13
|
+
"""Unpacker for Dean Edward's p.a.c.k.e.r"""
|
|
14
|
+
|
|
15
|
+
import re
|
|
16
|
+
import string
|
|
17
|
+
from jsbeautifier.unpackers import UnpackingError
|
|
18
|
+
|
|
19
|
+
PRIORITY = 1
|
|
20
|
+
|
|
21
|
+
def detect(source):
|
|
22
|
+
"""Detects whether `source` is P.A.C.K.E.R. coded."""
|
|
23
|
+
return source.replace(' ', '').startswith('eval(function(p,a,c,k,e,r')
|
|
24
|
+
|
|
25
|
+
def unpack(source):
|
|
26
|
+
"""Unpacks P.A.C.K.E.R. packed js code."""
|
|
27
|
+
payload, symtab, radix, count = _filterargs(source)
|
|
28
|
+
|
|
29
|
+
if count != len(symtab):
|
|
30
|
+
raise UnpackingError('Malformed p.a.c.k.e.r. symtab.')
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
unbase = Unbaser(radix)
|
|
34
|
+
except TypeError:
|
|
35
|
+
raise UnpackingError('Unknown p.a.c.k.e.r. encoding.')
|
|
36
|
+
|
|
37
|
+
def lookup(match):
|
|
38
|
+
"""Look up symbols in the synthetic symtab."""
|
|
39
|
+
word = match.group(0)
|
|
40
|
+
return symtab[unbase(word)] or word
|
|
41
|
+
|
|
42
|
+
source = re.sub(r'\b\w+\b', lookup, payload)
|
|
43
|
+
return _replacestrings(source)
|
|
44
|
+
|
|
45
|
+
def _filterargs(source):
|
|
46
|
+
"""Juice from a source file the four args needed by decoder."""
|
|
47
|
+
argsregex = (r"}\('(.*)', *(\d+), *(\d+), *'(.*)'\."
|
|
48
|
+
r"split\('\|'\), *(\d+), *(.*)\)\)")
|
|
49
|
+
args = re.search(argsregex, source, re.DOTALL).groups()
|
|
50
|
+
|
|
51
|
+
try:
|
|
52
|
+
return args[0], args[3].split('|'), int(args[1]), int(args[2])
|
|
53
|
+
except ValueError:
|
|
54
|
+
raise UnpackingError('Corrupted p.a.c.k.e.r. data.')
|
|
55
|
+
|
|
56
|
+
def _replacestrings(source):
|
|
57
|
+
"""Strip string lookup table (list) and replace values in source."""
|
|
58
|
+
match = re.search(r'var *(_\w+)\=\["(.*?)"\];', source, re.DOTALL)
|
|
59
|
+
|
|
60
|
+
if match:
|
|
61
|
+
varname, strings = match.groups()
|
|
62
|
+
startpoint = len(match.group(0))
|
|
63
|
+
lookup = strings.split('","')
|
|
64
|
+
variable = '%s[%%d]' % varname
|
|
65
|
+
for index, value in enumerate(lookup):
|
|
66
|
+
source = source.replace(variable % index, '"%s"' % value)
|
|
67
|
+
return source[startpoint:]
|
|
68
|
+
return source
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class Unbaser(object):
|
|
72
|
+
"""Functor for a given base. Will efficiently convert
|
|
73
|
+
strings to natural numbers."""
|
|
74
|
+
ALPHABET = {
|
|
75
|
+
62 : '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
|
|
76
|
+
95 : (' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
77
|
+
'[\]^_`abcdefghijklmnopqrstuvwxyz{|}~')
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
def __init__(self, base):
|
|
81
|
+
self.base = base
|
|
82
|
+
|
|
83
|
+
# If base can be handled by int() builtin, let it do it for us
|
|
84
|
+
if 2 <= base <= 36:
|
|
85
|
+
self.unbase = lambda string: int(string, base)
|
|
86
|
+
else:
|
|
87
|
+
# Build conversion dictionary cache
|
|
88
|
+
try:
|
|
89
|
+
self.dictionary = dict((cipher, index) for
|
|
90
|
+
index, cipher in enumerate(self.ALPHABET[base]))
|
|
91
|
+
except KeyError:
|
|
92
|
+
raise TypeError('Unsupported base encoding.')
|
|
93
|
+
|
|
94
|
+
self.unbase = self._dictunbaser
|
|
95
|
+
|
|
96
|
+
def __call__(self, string):
|
|
97
|
+
return self.unbase(string)
|
|
98
|
+
|
|
99
|
+
def _dictunbaser(self, string):
|
|
100
|
+
"""Decodes a value to an integer."""
|
|
101
|
+
ret = 0
|
|
102
|
+
for index, cipher in enumerate(string[::-1]):
|
|
103
|
+
ret += (self.base ** index) * self.dictionary[cipher]
|
|
104
|
+
return ret
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var OO0=["\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x2B\x2F\x3D","","\x63\x68\x61\x72\x41\x74","\x69\x6E\x64\x65\x78\x4F\x66","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x6C\x65\x6E\x67\x74\x68"];function _1OO(_0IO){var _011=OO0[0];var lOO,O10,_0ll,OlO,_01O,IOO,I01,_001,_11O=0,Ol0=OO0[1];do{OlO=_011[OO0[3]](_0IO[OO0[2]](_11O++));_01O=_011[OO0[3]](_0IO[OO0[2]](_11O++));IOO=_011[OO0[3]](_0IO[OO0[2]](_11O++));I01=_011[OO0[3]](_0IO[OO0[2]](_11O++));_001=OlO<<18|_01O<<12|IOO<<6|I01;lOO=_001>>16&0xff;O10=_001>>8&0xff;_0ll=_001&0xff;if(IOO==64){Ol0+=String[OO0[4]](lOO);}else{if(I01==64){Ol0+=String[OO0[4]](lOO,O10);}else{Ol0+=String[OO0[4]](lOO,O10,_0ll);};};} while(_11O<_0IO[OO0[5]]);return Ol0;};function O0I(O11){var OO1=OO0[1],_11O=0;for(_11O=O11[OO0[5]]-1;_11O>=0;_11O--){OO1+=O11[OO0[2]](_11O);};return OO1;};var _0OO='=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';eval(_1OO(O0I(_0OO)));
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Unpacker warning: be careful when using myobfuscate.com for your projects:
|
|
3
|
+
// scripts obfuscated by the free online version call back home.
|
|
4
|
+
//
|
|
5
|
+
|
|
6
|
+
//
|
|
7
|
+
// Unpacker for Dean Edward's p.a.c.k.e.r, a part of javascript beautifier
|
|
8
|
+
// written by Einar Lielmanis <einar@jsbeautifier.org>
|
|
9
|
+
//
|
|
10
|
+
// Coincidentally, it can defeat a couple of other eval-based compressors.
|
|
11
|
+
//
|
|
12
|
+
// usage:
|
|
13
|
+
//
|
|
14
|
+
// if (P_A_C_K_E_R.detect(some_string)) {
|
|
15
|
+
// var unpacked = P_A_C_K_E_R.unpack(some_string);
|
|
16
|
+
// }
|
|
17
|
+
//
|
|
18
|
+
//
|
|
19
|
+
|
|
20
|
+
var P_A_C_K_E_R = {
|
|
21
|
+
detect: function (str) {
|
|
22
|
+
return P_A_C_K_E_R._starts_with(str.toLowerCase().replace(/ +/g, ''), 'eval(function(') ||
|
|
23
|
+
P_A_C_K_E_R._starts_with(str.toLowerCase().replace(/ +/g, ''), 'eval((function(') ;
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
unpack: function (str) {
|
|
27
|
+
var unpacked_source = '';
|
|
28
|
+
if (P_A_C_K_E_R.detect(str)) {
|
|
29
|
+
try {
|
|
30
|
+
eval('unpacked_source = ' + str.substring(4) + ';')
|
|
31
|
+
if (typeof unpacked_source == 'string' && unpacked_source) {
|
|
32
|
+
str = unpacked_source;
|
|
33
|
+
}
|
|
34
|
+
} catch (error) {
|
|
35
|
+
// well, it failed. we'll just return the original, instead of crashing on user.
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return str;
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
_starts_with: function (str, what) {
|
|
42
|
+
return str.substr(0, what.length) === what;
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
run_tests: function (sanity_test) {
|
|
46
|
+
var t = sanity_test || new SanityTest();
|
|
47
|
+
t.test_function(P_A_C_K_E_R.detect, "P_A_C_K_E_R.detect");
|
|
48
|
+
t.expect('', false);
|
|
49
|
+
t.expect('var a = b', false);
|
|
50
|
+
t.expect('eval(function(p,a,c,k,e,r', true);
|
|
51
|
+
t.expect('eval ( function(p, a, c, k, e, r', true);
|
|
52
|
+
|
|
53
|
+
t.test_function(P_A_C_K_E_R.unpack, 'P_A_C_K_E_R.unpack');
|
|
54
|
+
t.expect("eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('0 2=1',3,3,'var||a'.split('|'),0,{}))",
|
|
55
|
+
'var a=1');
|
|
56
|
+
|
|
57
|
+
var starts_with_a = function(what) { return P_A_C_K_E_R._starts_with(what, 'a'); }
|
|
58
|
+
t.test_function(starts_with_a, "P_A_C_K_E_R._starts_with(?, a)");
|
|
59
|
+
t.expect('abc', true);
|
|
60
|
+
t.expect('bcd', false);
|
|
61
|
+
t.expect('a', true);
|
|
62
|
+
t.expect('', false);
|
|
63
|
+
return t;
|
|
64
|
+
}
|
|
65
|
+
}
|