jsfuck.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. (function(){
  2. var USE_CHAR_CODE = "USE_CHAR_CODE";
  3. var MIN = 32, MAX = 126;
  4. var MAPPING = {
  5. 'a': '("false")[1]',
  6. 'b': '(window+[])[2]',
  7. 'c': '([]["filter"]+[])[3]',
  8. 'd': '("undefined")[2]',
  9. 'e': '("true")[3]',
  10. 'f': '("false")[0]',
  11. 'g': '([]+String)[14]',
  12. 'h': '(+(17))["toString"](18)',
  13. 'i': '([false]+undefined)[10]',
  14. 'j': '(window+"")[3]',
  15. 'k': '(+(20))["toString"](21)',
  16. 'l': '("false")[2]',
  17. 'm': '(Number+"")[11]',
  18. 'n': '("undefined")[1]',
  19. 'o': '(true+[]["filter"])[10]', // todo
  20. 'p': '(+(25))["toString"](30)',
  21. 'q': '(+(26))["toString"](30)',
  22. 'r': '("true")[1]',
  23. 's': '("false")[3]',
  24. 't': '("true")[0]',
  25. 'u': '("undefined")[0]',
  26. 'v': '(+(31))["toString"](32)',
  27. 'w': '(+(32))["toString"](33)',
  28. 'x': '(+(33))["toString"](34)',
  29. 'y': '(NaN+[Infinity])[10]', // TODO: Shorten
  30. 'z': '(+(35))["toString"](36)',
  31. 'A': '(Array+"")[9]',
  32. 'B': '(Boolean+"")[9]',
  33. 'C': 'Function("return \'\\\\"+(103)+"\'")()',
  34. 'D': USE_CHAR_CODE,
  35. 'E': USE_CHAR_CODE,
  36. 'F': '(Function+"")[9]',
  37. 'G': USE_CHAR_CODE,
  38. 'H': USE_CHAR_CODE,
  39. 'I': '("Infinity")[0]',
  40. 'J': USE_CHAR_CODE,
  41. 'K': USE_CHAR_CODE,
  42. 'L': USE_CHAR_CODE,
  43. 'M': USE_CHAR_CODE,
  44. 'N': '("NaN")[0]',
  45. 'O': USE_CHAR_CODE,
  46. 'P': USE_CHAR_CODE,
  47. 'Q': USE_CHAR_CODE,
  48. 'R': USE_CHAR_CODE,
  49. 'S': '(String+[])[9]',
  50. 'T': USE_CHAR_CODE,
  51. 'U': USE_CHAR_CODE,
  52. 'V': USE_CHAR_CODE,
  53. 'W': USE_CHAR_CODE,
  54. 'X': USE_CHAR_CODE,
  55. 'Y': USE_CHAR_CODE,
  56. 'Z': USE_CHAR_CODE,
  57. ' ': '([]["filter"]+[])[8]',
  58. '!': USE_CHAR_CODE,
  59. '"': '("")["link"]()[8]',
  60. '#': USE_CHAR_CODE,
  61. '$': USE_CHAR_CODE,
  62. '%': 'window["escape"]("<")[0]',
  63. '&': USE_CHAR_CODE,
  64. '\'': USE_CHAR_CODE,
  65. '(': '([]["filter"]+"")[15]',
  66. ')': '([]["filter"]+"")[16]',
  67. '*': USE_CHAR_CODE,
  68. '+': USE_CHAR_CODE,
  69. ',': USE_CHAR_CODE,
  70. '-': USE_CHAR_CODE,
  71. '.': USE_CHAR_CODE,
  72. '/': '("")["sub"]()[6]',
  73. ':': 'window["Date"]()[21]',
  74. ';': USE_CHAR_CODE,
  75. '<': '("")["sub"]()[0]',
  76. '=': '("")["fontcolor"]()[11]',
  77. '>': '("")["sub"]()[10]',
  78. '?': USE_CHAR_CODE,
  79. '@': USE_CHAR_CODE,
  80. '[': USE_CHAR_CODE,
  81. '\\': 'window["unescape"]("%"+(5)+"c")[0]',
  82. ']': USE_CHAR_CODE,
  83. '^': USE_CHAR_CODE,
  84. '_': USE_CHAR_CODE,
  85. '`': USE_CHAR_CODE,
  86. '{': '([]["filter"]+"")[18]',
  87. '|': USE_CHAR_CODE,
  88. '}': USE_CHAR_CODE,
  89. '~': USE_CHAR_CODE
  90. };
  91. var SIMPLE = {
  92. 'false': '![]',
  93. 'true': '!![]',
  94. 'undefined': '[][[]]',
  95. 'NaN': '+[![]]',
  96. 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])'
  97. };
  98. var CONSTRUCTORS = {
  99. 'Number': '+[]',
  100. 'String': '[]+[]',
  101. 'Array': '[]',
  102. 'Boolean': '![]',
  103. 'Function': '[]["sort"]'
  104. }
  105. function fillMissingChars(){
  106. for (var key in MAPPING){
  107. if (MAPPING[key] === USE_CHAR_CODE){
  108. MAPPING[key] = 'String["fromCharCode"](' + key.charCodeAt(0) + ')';
  109. }
  110. }
  111. }
  112. function fillMissingDigits(){
  113. var output, number, i;
  114. for (number = 0; number < 10; number++){
  115. output = "+[]";
  116. if (number > 0){ output = "+!" + output; }
  117. for (i = 1; i < number; i++){ output = "+!+[]" + output; }
  118. if (number > 1){ output = output.substr(1); }
  119. MAPPING[number] = "[" + output + "]";
  120. }
  121. }
  122. function replaceMap(){
  123. var character = "", value, original, regEx, replacement;
  124. for (var i = MIN; i <= MAX; i++){
  125. character = String.fromCharCode(i);
  126. value = MAPPING[character];
  127. original = value;
  128. for (key in CONSTRUCTORS){
  129. replacement = CONSTRUCTORS[key];
  130. regEx = new RegExp("\\b" + key, "gi");
  131. value = value.replace(regEx, "(" + replacement + ")['constructor']");
  132. }
  133. for (key in SIMPLE){
  134. replacement = SIMPLE[key];
  135. // replace quotes symbols
  136. regEx = new RegExp('"' + key + '"', "gi");
  137. value = value.replace(regEx, replacement + "+[]");
  138. // replace left symbols
  139. regEx = new RegExp(key, "gi");
  140. value = value.replace(regEx, "(" + replacement + ")");
  141. }
  142. for (key = 0; key < 10; key++){
  143. regEx = new RegExp(key, "gi");
  144. value = value.replace(regEx, "+[" + MAPPING[key] + "]");
  145. }
  146. value = value.replace(/""/gi, "[]+[]");
  147. try {
  148. eval(value);
  149. } catch (e) {
  150. throw "Can't convert " + character + "\n" + original + "\n" + value;
  151. }
  152. MAPPING[character] = value;
  153. }
  154. }
  155. function swap(input, recursive){
  156. if (input == "") { return ""; }
  157. var character = input[0],
  158. length = 1,
  159. replacement,
  160. next,
  161. key;
  162. for (key in SIMPLE){
  163. if (input.indexOf(key) === 0){
  164. replacement = SIMPLE[key];
  165. length = key.length;
  166. if (recursive && input.length === length) {
  167. replacement += "+[]";
  168. }
  169. }
  170. }
  171. replacement = replacement || MAPPING[character];
  172. next = input.substr(length);
  173. input = input.substr(0, length);
  174. return (recursive ? "" : " + \n" ) + "/* " + input + " */ " + replacement + swap(next, false);
  175. }
  176. window = this;
  177. function encode(input){
  178. var output = swap(input, true);
  179. var evaluated = eval(output);
  180. if (input == evaluated){
  181. console.log(output);
  182. console.log(input);
  183. } else {
  184. console.error("FAILED");
  185. console.log(input);
  186. console.log(evaluated);
  187. }
  188. }
  189. fillMissingDigits();
  190. fillMissingChars();
  191. replaceMap();
  192. var input = "true\"false\"InfinityundefinedNaNalert(1);";
  193. for (var i = MIN; i <= MAX; i++){
  194. input += String.fromCharCode(i);
  195. }
  196. encode(input);
  197. //encode("f")
  198. console.log("\nDONE")
  199. })();