瀏覽代碼

Merge pull request #16 from hazzik/optimizations-2

Optimizations 2
Martin Kleppe 11 年之前
父節點
當前提交
bbe886b3f0
共有 2 個文件被更改,包括 181 次插入140 次删除
  1. 98 57
      jsfuck.js
  2. 83 83
      output.txt

+ 98 - 57
jsfuck.js

@@ -16,60 +16,61 @@
 
   var CONSTRUCTORS = {
     'Array':    '[]',
-    'Number':   '+[]',
-    'String':   '[]+[]',
-    'Boolean':  '![]',
-    'Function':  '[]["filter"]'
+    'Number':   '(+[])',
+    'String':   '([]+[])',
+    'Boolean':  '(![])',
+    'Function': '[]["filter"]',
+    'RegExp':   'Function("return/0/")()'
   };
 
   var MAPPING = {
-    'a':   '("false")[1]',
+    'a':   '(false+"")[1]',
     'b':   '(+(11))["toString"](20)',
     'c':   '([]["filter"]+"")[3]',
-    'd':   '("undefined")[2]',
-    'e':   '("true")[3]',
-    'f':   '("false")[0]',
+    'd':   '(undefined+"")[2]',
+    'e':   '(true+"")[3]',
+    'f':   '(false+"")[0]',
     'g':   '(+false+[false]+String)[20]',
-    'h':   '(+(17))["toString"](20)',
+    'h':   '(+(101))["toString"](21)[1]',
     'i':   '([false]+undefined)[10]',
-    'j':   '(+(19))["toString"](20)',
+    'j':   '(+(40))["toString"](21)[1]',
     'k':   '(+(20))["toString"](21)',
-    'l':   '("false")[2]',
+    'l':   '(false+"")[2]',
     'm':   '(Number+"")[11]',
-    'n':   '("undefined")[1]',
+    'n':   '(undefined+"")[1]',
     'o':   '(true+[]["filter"])[10]',
-    'p':   '(+(25))["toString"](30)',
-    'q':   '(+(26))["toString"](30)',
-    'r':   '("true")[1]',
-    's':   '("false")[3]',
-    't':   '("true")[0]',
-    'u':   '("undefined")[0]',
+    'p':   '(+(211))["toString"](31)[1]',
+    'q':   '(+(212))["toString"](31)[1]',
+    'r':   '(true+"")[1]',
+    's':   '(false+"")[3]',
+    't':   '(true+"")[0]',
+    'u':   '(undefined+"")[0]',
     'v':   '(+(31))["toString"](32)',
     'w':   '(+(32))["toString"](33)',
-    'x':   '(+(33))["toString"](34)',
+    'x':   '(+(101))["toString"](34)[1]',
     'y':   '(NaN+[Infinity])[10]',
     'z':   '(+(35))["toString"](36)',
 
     'A':   '(+false+Array)[10]',
     'B':   '(+false+Boolean)[10]',
-    'C':   'GLOBAL["escape"]("<")[2]',
-    'D':   'GLOBAL["escape"]("=")[2]',
-    'E':   'GLOBAL["escape"](">")[2]',
+    'C':   'Function("return escape")()("<")[2]',
+    'D':   'Function("return escape")()("=")[2]',
+    'E':   '(RegExp+"")[12]',
     'F':   '(+false+Function)[10]',
-    'G':   USE_CHAR_CODE,
+    'G':   '(false+Function("return Date")()())[30]',
     'H':   USE_CHAR_CODE,
-    'I':   '("Infinity")[0]',
-    'J':   USE_CHAR_CODE,
+    'I':   '(Infinity+"")[0]',
+    //'J':   USE_CHAR_CODE,
     'K':   USE_CHAR_CODE,
     'L':   USE_CHAR_CODE,
-    'M':   USE_CHAR_CODE,
-    'N':   '("NaN")[0]',
-    'O':   USE_CHAR_CODE,
+    'M':   '(true+Function("return Date")()())[30]',
+    'N':   '(NaN+"")[0]',
+    //'O':   USE_CHAR_CODE,
     'P':   USE_CHAR_CODE,
     'Q':   USE_CHAR_CODE,
-    'R':   USE_CHAR_CODE,
+    'R':   '(+false+RegExp)[10]',
     'S':   '(+false+String)[10]',
-    'T':   USE_CHAR_CODE,
+    'T':   '(NaN+Function("return Date")()())[30]',
     'U':   USE_CHAR_CODE,
     'V':   USE_CHAR_CODE,
     'W':   USE_CHAR_CODE,
@@ -82,23 +83,23 @@
     '"':   '("")["fontcolor"]()[12]',
     '#':   USE_CHAR_CODE,
     '$':   USE_CHAR_CODE,
-    '%':   'GLOBAL["escape"]("<")[0]',
+    '%':   'Function("return escape")()("<")[0]',
     '&':   USE_CHAR_CODE,
     '\'':  USE_CHAR_CODE,
     '(':   '(false+[]["filter"])[20]',
     ')':   '(true+[]["filter"])[20]',
     '*':   USE_CHAR_CODE,
     '+':   '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]',
-    ',':   '[[]]["concat"]([][[]])+""',
-    '-':   '(+(.0000000001)+"")[2]',
+    ',':   '[[]]["concat"]([[]])+""',
+    '-':   '(+(.+[0000000001])+"")[2]',
     '.':   '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]',
     '/':   '(false+[+false])["italics"]()[10]',
-    ':':   'GLOBAL["Date"]()[21]',
+    ':':   '(RegExp()+"")[3]',
     ';':   USE_CHAR_CODE,
     '<':   '("")["italics"]()[0]',
     '=':   '("")["fontcolor"]()[11]',
     '>':   '("")["italics"]()[2]',
-    '?':   USE_CHAR_CODE,
+    '?':   '(RegExp()+"")[2]',
     '@':   USE_CHAR_CODE,
     '[':   '(GLOBAL+"")[0]',
     '\\':  USE_CHAR_CODE,
@@ -112,12 +113,12 @@
     '~':   USE_CHAR_CODE
   };
 
-  var GLOBAL = '[]["filter"]["constructor"]("return this")()';
+  var GLOBAL = 'Function("return this")()';
 
   function fillMissingChars(){
     for (var key in MAPPING){
       if (MAPPING[key] === USE_CHAR_CODE){
-        MAPPING[key] = 'GLOBAL["unescape"]("%"'+ key.charCodeAt(0).toString(16).replace(/(\d+)/g, "+($1)+\"") + '")';
+        MAPPING[key] = 'Function("return unescape")()("%"'+ key.charCodeAt(0).toString(16).replace(/(\d+)/g, "+($1)+\"") + '")';
       }
     }
   }
@@ -147,23 +148,37 @@
       );
     }
 
+    function digitReplacer(_,x) { return MAPPING[x]; }
+
+    function numberReplacer(_,y) {
+      var values = y.split("");
+      var head = +(values.shift());
+      var output = "+[]";
+
+      if (head > 0){ output = "+!" + output; }
+      for (i = 1; i < head; i++){ output = "+!+[]" + output; }
+      if (head > 1){ output = output.substr(1); }
+
+      return [output].concat(values).join("+").replace(/(\d)/g, digitReplacer);
+    }
+
     for (i = MIN; i <= MAX; i++){
       character = String.fromCharCode(i);
       value = MAPPING[character];
+      if(!value) {continue;}
       original = value;
 
       for (key in CONSTRUCTORS){
-        replace("\\b" + key, '(' + CONSTRUCTORS[key] + ')["constructor"]');
+        replace("\\b" + key, CONSTRUCTORS[key] + '["constructor"]');
       }
 
       for (key in SIMPLE){
-        replace('"' + key + '"', SIMPLE[key] + "+[]");
         replace(key, SIMPLE[key]);
       }
 
-      for (key = 0; key < 10; key++){
-        replace(key, "+[" + MAPPING[key] + "]");
-      }
+      replace('(\\d\\d+)', numberReplacer);
+      replace('\\((\\d)\\)', digitReplacer);
+      replace('\\[(\\d)\\]', digitReplacer);
 
       replace("GLOBAL", GLOBAL);
       replace('\\+""', "+[]");
@@ -196,12 +211,12 @@
       return done;
     }
 
-    function mappingReplacer(a, b){
+    function mappingReplacer(a, b) {
       return b.split("").join("+");
     }
 
     function valueReplacer(c) {
-      return missing[c] ? c : MAPPING[c];  
+      return missing[c] ? c : MAPPING[c];
     }
 
     for (all in MAPPING){
@@ -230,21 +245,47 @@
       return "";
     }
 
-    input.replace(/./g, function(c){
-
-      var replacement = MAPPING[c];
+    var r = "";
+    for (var i in SIMPLE) {
+      r += i + "|";
+    }
+    r+=".";
 
-      if (replacement){
-        output.push(MAPPING[c]); 
+    input.replace(new RegExp(r, 'g'), function(c) {
+      var replacement = SIMPLE[c];
+      if (replacement) {
+        output.push("[" + replacement + "]+[]");
       } else {
-
-        replacement =
-          "([]+[])[" + encode("constructor") + "]" +
-          "[" + encode("fromCharCode") + "]" +
-          "(" + encode(c.charCodeAt(0) + "") + ")";
- 
-        output.push(replacement);
-        MAPPING[c] = replacement;
+        replacement = MAPPING[c];
+        if (replacement){
+          output.push(replacement);
+        } else {
+          if (c === "J") {
+            replacement =
+              "([][" + encode("filter") + "]" +
+              "[" + encode("constructor") + "]" +
+              "(" + encode("return new Date(200000000)") + ")()+[])[!+[]+!+[]+!+[]+!+[]]";
+     
+            output.push(replacement);
+            MAPPING[c] = replacement;
+          } else if (c === "O") {
+            replacement =
+              "([][" + encode("filter") + "]" +
+              "[" + encode("constructor") + "]" +
+              "(" + encode("return new Date(24000000000)") + ")()+[])[!+[]+!+[]+!+[]+!+[]]";
+     
+            output.push(replacement);
+            MAPPING[c] = replacement;
+          } else {
+            replacement =
+              "([]+[])[" + encode("constructor") + "]" +
+              "[" + encode("fromCharCode") + "]" +
+              "(" + encode(c.charCodeAt(0) + "") + ")";
+     
+            output.push(replacement);
+            MAPPING[c] = replacement;
+          }
+        }
       }
     });
 

+ 83 - 83
output.txt

@@ -1,19 +1,19 @@
-` ` 186
-`!` 12956
-`"` 877
-`#` 12965
-`$` 12970
-`%` 6629
-`&` 12980
-`'` 12985
-`(` 185
-`)` 186
-`*` 12964
-`+` 75
-`,` 628
-`-` 178
+` ` 147
+`!` 6564
+`"` 691
+`#` 6573
+`$` 6578
+`%` 3401
+`&` 6588
+`'` 6593
+`(` 146
+`)` 147
+`*` 6569
+`+` 70
+`,` 498
+`-` 153
 `.` 72
-`/` 383
+`/` 305
 `0` 8
 `1` 10
 `2` 14
@@ -24,71 +24,71 @@
 `7` 39
 `8` 44
 `9` 49
-`:` 11789
-`;` 16328
-`<` 392
-`=` 947
-`>` 398
-`?` 13947
-`@` 13944
-`A` 1011
-`B` 1012
-`C` 7137
-`D` 7692
-`E` 7143
-`F` 1172
-`G` 13975
-`H` 13980
-`I` 75
-`J` 12974
-`K` 15170
-`L` 13135
-`M` 12981
-`N` 21
-`O` 12972
-`P` 12969
-`Q` 12971
-`R` 12975
-`S` 925
-`T` 12985
-`U` 12990
-`V` 12995
-`W` 13000
-`X` 13005
-`Y` 13010
-`Z` 12979
-`[` 3723
-`\` 13140
-`]` 12986
-`^` 12989
-`_` 12977
-``` 12974
-`a` 20
-`b` 2216
-`c` 181
-`d` 27
-`e` 30
-`f` 18
-`g` 935
-`h` 2245
-`i` 34
-`j` 2255
-`k` 2220
-`l` 24
-`m` 923
-`n` 23
-`o` 182
-`p` 2244
-`q` 2249
-`r` 21
-`s` 29
-`t` 19
-`u` 21
-`v` 2236
-`w` 2245
-`x` 2255
-`y` 91
-`z` 2275
-`{` 190
-`|` 13150
-`}` 12996
+`:` 2286
+`;` 8307
+`<` 292
+`=` 687
+`>` 298
+`?` 2281
+`@` 6572
+`A` 726
+`B` 729
+`C` 3407
+`D` 3802
+`E` 2287
+`F` 847
+`G` 4979
+`H` 6608
+`I` 70
+`J` 7301
+`K` 8312
+`L` 6708
+`M` 4980
+`N` 16
+`O` 7329
+`P` 6577
+`Q` 6579
+`R` 2283
+`S` 731
+`T` 4982
+`U` 6598
+`V` 6603
+`W` 6608
+`X` 6613
+`Y` 6618
+`Z` 6584
+`[` 2931
+`\` 6713
+`]` 6591
+`^` 6594
+`_` 6582
+``` 6582
+`a` 15
+`b` 1748
+`c` 144
+`d` 22
+`e` 25
+`f` 13
+`g` 741
+`h` 1763
+`i` 27
+`j` 1769
+`k` 1752
+`l` 19
+`m` 729
+`n` 18
+`o` 143
+`p` 1774
+`q` 1778
+`r` 16
+`s` 24
+`t` 14
+`u` 16
+`v` 1768
+`w` 1777
+`x` 1782
+`y` 84
+`z` 1807
+`{` 151
+`|` 6723
+`}` 6601