kong0itey 发表于 2013-2-7 16:19:49

[转载]JavaScript代码混淆器

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Content-Language" content="zh-CN" /> <title> New Document </title> <meta name="Design Corp" content="myhhe.cn" /> <meta name="Designer" content="hayden" /> <meta name="Designer mail" content="QQ:3996992" /> <meta name="robots" content="hayden" /> <meta name="Keywords" content="" /> <meta name="Description" content="" /></head><body><div class="cenlst01" style="height:580px;text-align:center;">   <br>   <div class="f14"> JS混淆工具</div>      <div><TEXTAREA id=code rows=12 cols=80>/*这个是一个类*/function xx(num,str){//说明var a = num;this.aa = a;this.bb = function(){alert(str);}this.cc = function(){for(var i=0;i<10;i++){document.title=i;}}}xx.prototype.dd= function(){alert("dd");}var a = new xx(100,"hello"),b=new xx(0,"ttyp");eval("a.aa=20");a.bb();b.dd();alert(a.aa);</TEXTAREA> <BR><INPUT onclick=go() type=button value='打乱去' class='submit1'><br><textarea id=display rows=12 cols=80></textarea><SCRIPT language=JavaScript><!--/**//**//**//****    ==================================================================================================**    类名:CLASS_CONFUSION**    功能:JS混淆**    示例:25175.com    ---------------------------------------------------------------------------------------------------            var xx      = new CLASS_CONFUSION(code);            document.getElementById("display").innerHTML = xx.confusion();    ---------------------------------------------------------------------------------------------------**    作者:ttyp**    邮件:ttyp@21cn.com**    日期:2006-3-20**    版本:0.12**    ==================================================================================================**/function CLASS_CONFUSION(code){    //哈希表类    function Hashtable(){      this._hash      = new Object();      this.add      = function(key,value){                            if(typeof(key)!="undefined"){                              if(this.contains(key)==false){                                    this._hash=typeof(value)=="undefined"?null:value;                                    return true;                              } else {                                    return false;                              }                            } else {                              return false;                            }                        }      this.remove      = function(key){delete this._hash;}      this.count      = function(){var i=0;for(var k in this._hash){i++;} return i;}      this.items      = function(key){return this._hash;}      this.contains    = function(key){return typeof(this._hash)!="undefined";}      this.clear      = function(){for(var k in this._hash){delete this._hash;}}    }    function VariableMap(parent){      this.table = new Hashtable();      this.level = parent?parent.level+1:0;      this.parent= parent;      this.add = function(key,value){this.table.add(key,value)};      this.items = function(key){return this.table.items(key)};      this.count = function(){return this.table.count()};      this.contains = function(key){return this.table.contains(key);}      this.isParameter    = false;    }    this._caseSensitive = true;    //字符串转换为哈希表    this.str2hashtable = function(key,cs){      var _key    = key.split(/,/g);      var _hash    = new Hashtable();      var _cs      = true;      if(typeof(cs)=="undefined"||cs==null){            _cs = this._caseSensitive;      } else {            _cs = cs;      }      for(var i in _key){            if(_cs){                _hash.add(_key);            } else {                _hash.add((_key+"").toLowerCase());            }      }      return _hash;    }    //获得需要转换的代码    this._codetxt      = code;    if(typeof(syntax)=="undefined"){      syntax = "";    }    this._deleteComment = false;    //是否大小写敏感    this._caseSensitive    = true;    //得到关键字哈希表    this._keywords      = this.str2hashtable("switch,case,delete,default,typeof,for,in,function,void,this,boolean,while,if,return,new,true,false,try,catch,throw,null,else,do,var");    this._function      = this.str2hashtable("function");    this._var            = "var";    this._beginBlock    = "{";    this._endBlock      = "}";    this._window      = this.str2hashtable("alert,escape,unescape,document,parseInt,parseFloat");    //得到内建对象哈希表    this._commonObjects = this.str2hashtable("String,Number,Boolean,RegExp,Error,Math,Date,Object,Array,Global");    //得到分割字符    this._wordDelimiters= "  ,.?!;:\\/<>(){}[]\"'\r\n\t=+-|*%@#$^&";    //引用字符    this._quotation      = this.str2hashtable("\",'");    //行注释字符    this._lineComment    = "//";    //转义字符    this._escape      = "\\";    //多行引用开始    this._commentOn      = "/*";    //多行引用结束    this._commentOff    = "*/";    this._execute      = "eval";    //引用调用字符    this._call            = ".";    this._varPause      = "=";    this._varContinue    = ",";    //变量个数    this._varNum = 0;    this.confusion    = function() {      var codeArr = new Array();      var word_index = 0;      var htmlTxt = new Array();      //得到分割字符数组(分词)      for (var i = 0; i < this._codetxt.length; i++) {            if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) {      //找不到关键字                if (codeArr == null || typeof(codeArr) == 'undefined') {                  codeArr = "";                }                codeArr += this._codetxt.charAt(i);            } else {                if (typeof(codeArr) != 'undefined' && codeArr.length > 0)                  word_index++;                codeArr = this._codetxt.charAt(i);            }      }      var quote_opened                = false;    //引用标记      var slash_star_comment_opened    = false;    //多行注释标记      var slash_slash_comment_opened    = false;    //单行注释标记      var line_num                  = 1;      //行号      var quote_char                  = "";      //引用标记类型      var call_opened                  = false;      var call_string                  = "";      var var_opened                  = false;      var var_pause                  = false;      var function_opened                = false;      var parameter_opened            = false;      var var_map                        = new VariableMap();      var cur_var_map                  = var_map;      var execute_opened                = false;      //按分割字,分块显示      for (var i=0; i <=word_index; i++){            //单独处理指针引用            if(call_opened&&typeof(codeArr)!="undefined"){                if(call_string.length==0){                  if(this.isVar(codeArr)){                        call_string +=codeArr;                  }else{                        htmlTxt = "[\"" + this.toHex(call_string) + "\"]";                        if(codeArr!=this._call){                            htmlTxt = codeArr;                            call_opened = false;                        }                        call_string = "";                  }                } else {                  if(!this.isVar(codeArr)){                        htmlTxt = "[\"" + this.toHex(call_string) + "\"]";                        if(codeArr!=this._call){                            htmlTxt = codeArr;                            call_opened = false;                        }                        call_string = "";                  }else{                        htmlTxt = "[\"" + this.toHex(call_string) + "\"]";                  }                }                continue;            }            //处理空行(由于转义带来)            if(typeof(codeArr)=="undefined"||codeArr.length==0){                continue;            } else if(codeArr==" "){                htmlTxt = " ";            } else if(codeArr=="\n"){            //处理换行            } else if (codeArr == "\r"){                slash_slash_comment_opened = false;                quote_opened = false;                var_opened = false;                htmlTxt = "\r\n";                line_num++;            //处理function里的参数标记            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr)){                htmlTxt = codeArr;                function_opened = true;            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr=="("){                htmlTxt = codeArr;                if(function_opened == true){                  function_opened =false;                  var_opened = true;                  cur_var_map = new VariableMap(cur_var_map);                  cur_var_map.isParameter = true;                }            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==")"){                htmlTxt = codeArr;                //处理var a = new Class(),b=new Date();类似的问题                if(cur_var_map.isParameter){                  var_opened = false;                  var_pause = false;                }            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==";"){                htmlTxt = codeArr;                var_opened = false;                var_pause = false;                if(execute_opened){                  execute_opened = false;                }            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._var){                htmlTxt = codeArr;                var_opened = true;                var_pause = false;            } else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._varPause){                htmlTxt = codeArr;                var_pause = true;            } else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._varContinue){                htmlTxt = codeArr;                var_pause = false;            } else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._beginBlock){                cur_var_map = new VariableMap(cur_var_map);                var_opened = false;                htmlTxt = codeArr;            } else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._endBlock){                cur_var_map = cur_var_map.parent;                if(cur_var_map.isParameter){                  cur_var_map = cur_var_map.parent;                }                htmlTxt = codeArr;            //处理引用调用            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr==this._call){                //判断引用(.)后面第一个是否为字母货_$                if(i<word_index-1){                  if(this.isVar(codeArr)){                        if(call_opened){                            htmlTxt = this.toHex(call_string);                        }                        call_opened = true;                  }else{                        htmlTxt = this._call;                  }                }else{                  htmlTxt = this._call;                }            //处理关键字            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isKeyword(codeArr)){            htmlTxt = codeArr;            //处理eval后的字符串            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && codeArr==this._execute){            htmlTxt = "window[\"" + this.toHex(codeArr) + "\"]";            execute_opened = true;            //window内置对象            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isWindow(codeArr)){            htmlTxt = "window[\"" + this.toHex(codeArr) + "\"]";            //处理普通对象            } else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isCommonObject(codeArr)){                htmlTxt ="window[\"" + this.toHex(codeArr) + "\"]";            //处理双引号(引号前不能为转义字符)            } else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr)){                if (quote_opened){                  //是相应的引号                  if(quote_char==codeArr){                        htmlTxt = codeArr;                        quote_opened    = false;                        quote_char      = "";                  } else {                        htmlTxt = this.toHex(codeArr);                  }                } else {                  htmlTxt =codeArr;                  quote_opened    = true;                  quote_char      = codeArr;                }            //处理转义字符            } else if(codeArr == this._escape){                htmlTxt = codeArr;                if(i<word_index-1){                  if(codeArr.charCodeAt(0)>=32&&codeArr.charCodeAt(0)<=127){                        htmlTxt = codeArr.substr(0,1);                        htmlTxt = this.toHex(codeArr.substr(1));                        i=i+1;                  }                }            //处理多行注释的开始            } else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){                slash_star_comment_opened = true;                htmlTxt = this._commentOn;                i = i + this.getSkipLength(this._commentOn);            //处理单行注释            } else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){                slash_slash_comment_opened = true;                if(!this._deleteComment){                  htmlTxt =this._lineComment;                }                i = i + this.getSkipLength(this._lineComment);            //处理忽略词            } else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){                slash_slash_comment_opened = true;                htmlTxt = this._ignore;                i = i + this.getSkipLength(this._ignore);            //处理多行注释结束            } else if (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){                if (slash_star_comment_opened) {                  slash_star_comment_opened = false;                  if(!this._deleteComment){                        htmlTxt =this._commentOff;                  }                  i = i + this.getSkipLength(this._commentOff);                }            } else {                //不是在字符串中                if(!quote_opened){                  //如果不是在注释重                  if(!slash_slash_comment_opened && !slash_star_comment_opened){                        //不是在定义变量时                        if(!var_opened){                            if(this.translateVar(cur_var_map,codeArr)==""){                              htmlTxt = codeArr;                            }else{                              htmlTxt = this.translateVar(cur_var_map,codeArr);                            }                        }else{                            //不是在暂停变量定义时                            if(var_pause){                              if(this.translateVar(cur_var_map,codeArr)==""){                                    htmlTxt = codeArr;                              }else{                                    htmlTxt = this.translateVar(cur_var_map,codeArr);                              }                            }else{                              //变量符合命名规则,并且(变量前为空格或制表符或逗号如:var a;var    a;var a,b;,还有如果是函数参数,如:function(a,b,c)                              if(this.isVar(codeArr)&&(i>0&&codeArr==" "||codeArr=="\t"||codeArr==this._varContinue||cur_var_map.isParameter)){                                    var name = this.getRandName();                                    cur_var_map.add(codeArr,name);                                    htmlTxt = this.translateVar(cur_var_map,codeArr);                              }else{                                    htmlTxt = codeArr;                              }                            }                        }                  //注释中                  }else{                        if(!this._deleteComment){                            htmlTxt = codeArr;                        }                  }                }else{                  if(execute_opened){                        if(this.translateVar(cur_var_map,codeArr)==""){                            htmlTxt = codeArr;                        }else{                            htmlTxt = this.translateVar(cur_var_map,codeArr);                        }                  }else{                        htmlTxt = this.toHex(codeArr);                  }                }            }      }      return htmlTxt.join("");    }this.isStartWith = function(str,code,index){      if(typeof(str)!="undefined"&&str.length>0){            var cc = new Array();            for(var i=index;i<index+str.length;i++){                cc = code;            }            var c = cc.join("");            if(this._caseSensitive){                if(str.length>=code.length&&c.indexOf(str)==0){                  return true;                }            }else{                if(str.length>=code.length&&c.toLowerCase().indexOf(str.toLowerCase())==0){                  return true;                }            }            return false;      } else {            return false;      }    }    this.isFunction = function(val){      return this._function.contains(this._caseSensitive?val:val.toLowerCase());    }    this.isKeyword = function(val) {      return this._keywords.contains(this._caseSensitive?val:val.toLowerCase());    }    this.isWindow = function(val) {      return this._window.contains(this._caseSensitive?val:val.toLowerCase());    }    this.isCommonObject = function(val) {      return this._commonObjects.contains(this._caseSensitive?val:val.toLowerCase());    }    this.getSkipLength = function(val){      var count = 0;      for(var i=0;i<val.length;i++){            if(this._wordDelimiters.indexOf(val.charAt(i))>=0){                count++;            }      }      if(count>0){            count=count-1;      }      return count;    }    //字符串转换为16进制形式    this.toHex = function(val){      var str = new Array();      for(var i=0;i<val.length;i++){            var c = val.charCodeAt(i);            if(c>=0&&c<256){                str = "\\x" + val.charCodeAt(i).toString(16);            }else{                str = "\\u" + val.charCodeAt(i).toString(16);            }      }      return str.join("");    }    //获得变量随机名    this.getRandName = function(){      var style = parseInt(Math.random()*4);      var len = parseInt(Math.random()*9)+1;      var n = [];      this._varNum++;      var c = "abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$";      for(var i=0;i<len;i++){            n = c.charAt(parseInt(Math.random()*54));      }      return n.join("")+this._varNum;    }    //是否符合变量命名字首规则    this.isVar = function(val){      return /^.*$/.test(val);    }    //翻译变量,如果返回为空则不存在此变量    this.translateVar = function(node,key){      if(node.contains(key)){            return node.items(key);      }      var cn = node.parent;      while(cn!=null){            if(cn.contains(key)){                return cn.items(key);            }            cn = cn.parent;      }      return "";    }}function doConfusion(o){    var htmltxt = "";    if (o == null){      alert("domNode is null!");      return;    }    var _codetxt = "";    if(typeof(o)=="object"){      switch(o.tagName){            case "TEXTAREA":            case "INPUT":                _codetxt = o.value;                break;            case "DIV":            case "SPAN":                _codetxt = o.innerText;                break;            default:                _codetxt = o.innerHTML;                break;      }    }else{      _codetxt = o;    }    var _syn = new CLASS_CONFUSION(_codetxt);    htmltxt = _syn.confusion();    returnhtmltxt;}function go(){    var code    = document.getElementById("code").value;    var xx      = new CLASS_CONFUSION(code);    var a       = new Date();    document.getElementById("display").value = xx.confusion();    alert("共花:" + (new Date().getTime()-a.getTime()) + "ms");}//--></SCRIPT></body></html>
页: [1]
查看完整版本: [转载]JavaScript代码混淆器