jsfuck.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /*! JSFuck 0.4.0 - http://jsfuck.com */
  2. (function(self){
  3. var USE_CHAR_CODE = "USE_CHAR_CODE";
  4. var MIN = 32, MAX = 126;
  5. var SIMPLE = {
  6. 'false': '![]',
  7. 'true': '!![]',
  8. 'undefined': '[][[]]',
  9. 'NaN': '+[![]]',
  10. 'Infinity': '+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]]+[+[]])' // +"1e1000"
  11. };
  12. var CONSTRUCTORS = {
  13. 'Array': '[]',
  14. 'Number': '(+[])',
  15. 'String': '([]+[])',
  16. 'Boolean': '(![])',
  17. 'Function': '[]["filter"]',
  18. 'RegExp': 'Function("return/"+false+"/")()'
  19. };
  20. var MAPPING = {
  21. 'a': '(false+"")[1]',
  22. 'b': '(Function("return{}")()+"")[2]',
  23. 'c': '([]["filter"]+"")[3]',
  24. 'd': '(undefined+"")[2]',
  25. 'e': '(true+"")[3]',
  26. 'f': '(false+"")[0]',
  27. 'g': '(false+[0]+String)[20]',
  28. 'h': '(+(101))["toString"](21)[1]',
  29. 'i': '([false]+undefined)[10]',
  30. 'j': '(Function("return{}")()+"")[10]',
  31. 'k': '(+(20))["toString"](21)',
  32. 'l': '(false+"")[2]',
  33. 'm': '(Number+"")[11]',
  34. 'n': '(undefined+"")[1]',
  35. 'o': '(true+[]["filter"])[10]',
  36. 'p': '(+(211))["toString"](31)[1]',
  37. 'q': '(+(212))["toString"](31)[1]',
  38. 'r': '(true+"")[1]',
  39. 's': '(false+"")[3]',
  40. 't': '(true+"")[0]',
  41. 'u': '(undefined+"")[0]',
  42. 'v': '(+(31))["toString"](32)',
  43. 'w': '(+(32))["toString"](33)',
  44. 'x': '(+(101))["toString"](34)[1]',
  45. 'y': '(NaN+[Infinity])[10]',
  46. 'z': '(+(35))["toString"](36)',
  47. 'A': '(+[]+Array)[10]',
  48. 'B': '(+[]+Boolean)[10]',
  49. 'C': 'Function("return escape")()(("")["italics"]())[2]',
  50. 'D': 'Function("return escape")()([]["filter"])["slice"]("-1")',
  51. 'E': '(RegExp+"")[12]',
  52. 'F': '(+[]+Function)[10]',
  53. 'G': '(false+Function("return Date")()())[30]',
  54. 'H': USE_CHAR_CODE,
  55. 'I': '(Infinity+"")[0]',
  56. //'J': USE_CHAR_CODE,
  57. 'K': USE_CHAR_CODE,
  58. 'L': USE_CHAR_CODE,
  59. 'M': '(true+Function("return Date")()())[30]',
  60. 'N': '(NaN+"")[0]',
  61. 'O': '(NaN+Function("return{}")())[11]',
  62. 'P': USE_CHAR_CODE,
  63. 'Q': USE_CHAR_CODE,
  64. 'R': '(+[]+RegExp)[10]',
  65. 'S': '(+[]+String)[10]',
  66. 'T': '(NaN+Function("return Date")()())[30]',
  67. 'U': '(NaN+Function("return{}")()["toString"]["call"]())[11]',
  68. 'V': USE_CHAR_CODE,
  69. 'W': USE_CHAR_CODE,
  70. 'X': USE_CHAR_CODE,
  71. 'Y': USE_CHAR_CODE,
  72. 'Z': USE_CHAR_CODE,
  73. ' ': '(NaN+[]["filter"])[11]',
  74. '!': USE_CHAR_CODE,
  75. '"': '("")["fontcolor"]()[12]',
  76. '#': USE_CHAR_CODE,
  77. '$': USE_CHAR_CODE,
  78. '%': 'Function("return escape")()([]["filter"])[20]',
  79. '&': USE_CHAR_CODE,
  80. '\'': USE_CHAR_CODE,
  81. '(': '(false+[]["filter"])[20]',
  82. ')': '(true+[]["filter"])[20]',
  83. '*': USE_CHAR_CODE,
  84. '+': '(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[2]',
  85. ',': '[[]]["concat"]([[]])+""',
  86. '-': '(+(.+[0000000001])+"")[2]',
  87. '.': '(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]',
  88. '/': '(false+[0])["italics"]()[10]',
  89. ':': '(RegExp()+"")[3]',
  90. ';': USE_CHAR_CODE,
  91. '<': '("")["italics"]()[0]',
  92. '=': '("")["fontcolor"]()[11]',
  93. '>': '("")["italics"]()[2]',
  94. '?': '(RegExp()+"")[2]',
  95. '@': USE_CHAR_CODE,
  96. '[': '(Function("return{}")()+"")[0]',
  97. '\\': USE_CHAR_CODE,
  98. ']': '(Function("return{}")()+"")["slice"]("-1")',
  99. '^': USE_CHAR_CODE,
  100. '_': USE_CHAR_CODE,
  101. '`': USE_CHAR_CODE,
  102. '{': '(NaN+[]["filter"])[21]',
  103. '|': USE_CHAR_CODE,
  104. '}': '([]["filter"]+"")["slice"]("-1")',
  105. '~': USE_CHAR_CODE
  106. };
  107. var GLOBAL = 'Function("return this")()';
  108. function fillMissingChars(){
  109. for (var key in MAPPING){
  110. if (MAPPING[key] === USE_CHAR_CODE){
  111. MAPPING[key] = 'Function("return unescape")()("%"'+ key.charCodeAt(0).toString(16).replace(/(\d+)/g, "+($1)+\"") + '")';
  112. }
  113. }
  114. }
  115. function fillMissingDigits(){
  116. var output, number, i;
  117. for (number = 0; number < 10; number++){
  118. output = "+[]";
  119. if (number > 0){ output = "+!" + output; }
  120. for (i = 1; i < number; i++){ output = "+!+[]" + output; }
  121. if (number > 1){ output = output.substr(1); }
  122. MAPPING[number] = "[" + output + "]";
  123. }
  124. }
  125. function replaceMap(){
  126. var character = "", value, original, i, key;
  127. function replace(pattern, replacement){
  128. value = value.replace(
  129. new RegExp(pattern, "gi"),
  130. replacement
  131. );
  132. }
  133. function digitReplacer(_,x) { return MAPPING[x]; }
  134. function numberReplacer(_,y) {
  135. var values = y.split("");
  136. var head = +(values.shift());
  137. var output = "+[]";
  138. if (head > 0){ output = "+!" + output; }
  139. for (i = 1; i < head; i++){ output = "+!+[]" + output; }
  140. if (head > 1){ output = output.substr(1); }
  141. return [output].concat(values).join("+").replace(/(\d)/g, digitReplacer);
  142. }
  143. for (i = MIN; i <= MAX; i++){
  144. character = String.fromCharCode(i);
  145. value = MAPPING[character];
  146. if(!value) {continue;}
  147. original = value;
  148. for (key in CONSTRUCTORS){
  149. replace("\\b" + key, CONSTRUCTORS[key] + '["constructor"]');
  150. }
  151. for (key in SIMPLE){
  152. replace(key, SIMPLE[key]);
  153. }
  154. replace('(\\d\\d+)', numberReplacer);
  155. replace('\\((\\d)\\)', digitReplacer);
  156. replace('\\[(\\d)\\]', digitReplacer);
  157. replace("GLOBAL", GLOBAL);
  158. replace('\\+""', "+[]");
  159. replace('""', "[]+[]");
  160. MAPPING[character] = value;
  161. }
  162. }
  163. function replaceStrings(){
  164. var regEx = /[^\[\]\(\)\!\+]{1}/g,
  165. all, value, missing,
  166. count = MAX - MIN;
  167. function findMissing(){
  168. var all, value, done = false;
  169. missing = {};
  170. for (all in MAPPING){
  171. value = MAPPING[all];
  172. if (value.match(regEx)){
  173. missing[all] = value;
  174. done = true;
  175. }
  176. }
  177. return done;
  178. }
  179. function mappingReplacer(a, b) {
  180. return b.split("").join("+");
  181. }
  182. function valueReplacer(c) {
  183. return missing[c] ? c : MAPPING[c];
  184. }
  185. for (all in MAPPING){
  186. MAPPING[all] = MAPPING[all].replace(/\"([^\"]+)\"/gi, mappingReplacer);
  187. }
  188. while (findMissing()){
  189. for (all in missing){
  190. value = MAPPING[all];
  191. value = value.replace(regEx, valueReplacer);
  192. MAPPING[all] = value;
  193. missing[all] = value;
  194. }
  195. if (count-- === 0){
  196. console.error("Could not compile the following chars:", missing);
  197. }
  198. }
  199. }
  200. function encode(input, wrapWithEval){
  201. var output = [];
  202. if (!input){
  203. return "";
  204. }
  205. var r = "";
  206. for (var i in SIMPLE) {
  207. r += i + "|";
  208. }
  209. r+=".";
  210. input.replace(new RegExp(r, 'g'), function(c) {
  211. var replacement = SIMPLE[c];
  212. if (replacement) {
  213. output.push("[" + replacement + "]+[]");
  214. } else {
  215. replacement = MAPPING[c];
  216. if (replacement){
  217. output.push(replacement);
  218. } else {
  219. if (c === "J") {
  220. replacement =
  221. "([][" + encode("filter") + "]" +
  222. "[" + encode("constructor") + "]" +
  223. "(" + encode("return new Date(200000000)") + ")()+[])[!+[]+!+[]+!+[]+!+[]]";
  224. output.push(replacement);
  225. MAPPING[c] = replacement;
  226. } else {
  227. replacement =
  228. "([]+[])[" + encode("constructor") + "]" +
  229. "[" + encode("fromCharCode") + "]" +
  230. "(" + encode(c.charCodeAt(0) + "") + ")";
  231. output.push(replacement);
  232. MAPPING[c] = replacement;
  233. }
  234. }
  235. }
  236. });
  237. output = output.join("+");
  238. if (/^\d$/.test(input)){
  239. output += "+[]";
  240. }
  241. if (wrapWithEval){
  242. output = "[][" + encode("filter") + "]" +
  243. "[" + encode("constructor") + "]" +
  244. "(" + output + ")()";
  245. }
  246. return output;
  247. }
  248. fillMissingDigits();
  249. fillMissingChars();
  250. replaceMap();
  251. replaceStrings();
  252. self.JSFuck = {
  253. encode: encode
  254. };
  255. })(typeof(exports) === "undefined" ? window : exports);