源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

CLASS_CONFUSION JS混淆 全源码

  • 时间:2022-05-16 10:37 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:CLASS_CONFUSION JS混淆 全源码
利用随机字符串代替变量等,混淆原代码,保护自己写的代码,不利于别人直接剽窃
[u]复制代码[/u] 代码如下:
<SCRIPT language=JavaScript> <!-- /**//**//**//** **     ============================================================== ==================================== **    类名:CLASS_CONFUSION **    功能:JS混淆 **    示例:     --------------------------------------------------------- ------------------------------------------             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[key]=typeof (value)=="undefined"?null:value;                                     return true;                                 } else {                                     return false;                                 }                             } else {                                 return false;                             }                         }         this.remove        = function(key){delete this._hash [key];}         this.count        = function(){var i=0;for(var k in  this._hash){i++;} return i;}         this.items        = function(key){return this._hash [key];}         this.contains    = function(key){return typeof (this._hash[key])!="undefined";}         this.clear        = function(){for(var k in  this._hash){delete this._hash[k];}}     }     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[i]);             } else {                 _hash.add((_key[i]+"").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,el se,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,Gl obal");     //得到分割字符     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[word_index] == null || typeof (codeArr[word_index]) == 'undefined') {                     codeArr[word_index] = "";                 }                 codeArr[word_index] += this._codetxt.charAt (i);             } else {                 if (typeof(codeArr[word_index]) != 'undefined'  && codeArr[word_index].length > 0)                     word_index++;                 codeArr[word_index++] = 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[i])!="undefined"){                 if(call_string.length==0){                     if(this.isVar(codeArr[i])){                         call_string +=codeArr[i];                     }else{                         htmlTxt[htmlTxt.length] = "[\"" +  this.toHex(call_string) + "\"]";                         if(codeArr[i]!=this._call){                             htmlTxt[htmlTxt.length] = codeArr [i];                             call_opened = false;                         }                         call_string = "";                     }                 } else {                     if(!this.isVar(codeArr[i])){                         htmlTxt[htmlTxt.length] = "[\"" +  this.toHex(call_string) + "\"]";                         if(codeArr[i]!=this._call){                             htmlTxt[htmlTxt.length] = codeArr [i];                             call_opened = false;                         }                         call_string = "";                     }else{                         htmlTxt[htmlTxt.length] = "[\"" +  this.toHex(call_string) + "\"]";                     }                 }                 continue;             }             //处理空行(由于转义带来)             if(typeof(codeArr[i])=="undefined"||codeArr [i].length==0){                 continue;             } else if(codeArr[i]==" "){                 htmlTxt[htmlTxt.length] = " ";             } else if(codeArr[i]=="\n"){             //处理换行             } else if (codeArr[i] == "\r"){                 slash_slash_comment_opened = false;                 quote_opened = false;                 var_opened = false;                 htmlTxt[htmlTxt.length] = "\r\n";                 line_num++;             //处理function里的参数标记             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&this.isFunction (codeArr[i])){                 htmlTxt[htmlTxt.length] = codeArr[i];                 function_opened = true;             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){                 htmlTxt[htmlTxt.length] = codeArr[i];                 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[i]==")"){                 htmlTxt[htmlTxt.length] = codeArr[i];                 //处理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[i]==";"){                 htmlTxt[htmlTxt.length] = codeArr[i];                 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[i] ==this._var){                 htmlTxt[htmlTxt.length] = codeArr[i];                 var_opened = true;                 var_pause = false;             } else if(!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i] ==this._varPause){                 htmlTxt[htmlTxt.length] = codeArr[i];                 var_pause = true;             } else if(!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i] ==this._varContinue){                 htmlTxt[htmlTxt.length] = codeArr[i];                 var_pause = false;             } else if(!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i] ==this._beginBlock){                 cur_var_map = new VariableMap(cur_var_map);                 var_opened = false;                 htmlTxt[htmlTxt.length] = codeArr[i];             } else if(!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i] ==this._endBlock){                 cur_var_map = cur_var_map.parent;                 if(cur_var_map.isParameter){                     cur_var_map = cur_var_map.parent;                 }                 htmlTxt[htmlTxt.length] = codeArr[i];             //处理引用调用             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&codeArr[i] ==this._call){                 //判断引用(.)后面第一个是否为字母货_$                 if(i<word_index-1){                     if(this.isVar(codeArr[i+1])){                         if(call_opened){                             htmlTxt[htmlTxt.length] =  this.toHex(call_string);                         }                         call_opened = true;                     }else{                         htmlTxt[htmlTxt.length] = this._call;                     }                 }else{                     htmlTxt[htmlTxt.length] = this._call;                 }             //处理关键字             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened && this.isKeyword (codeArr[i])){               htmlTxt[htmlTxt.length] = codeArr[i];             //处理eval后的字符串             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened && codeArr[i] ==this._execute){               htmlTxt[htmlTxt.length] = "window[\"" +  this.toHex(codeArr[i]) + "\"]";               execute_opened = true;             //window内置对象             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened && this.isWindow (codeArr[i])){               htmlTxt[htmlTxt.length] = "window[\"" +  this.toHex(codeArr[i]) + "\"]";             //处理普通对象             } else if (!slash_slash_comment_opened&&! slash_star_comment_opened && !quote_opened &&  this.isCommonObject(codeArr[i])){                 htmlTxt[htmlTxt.length] =  "window[\"" +  this.toHex(codeArr[i]) + "\"]";             //处理双引号(引号前不能为转义字符)             } else if (!slash_star_comment_opened&&! slash_slash_comment_opened&&this._quotation.contains(codeArr [i])){                 if (quote_opened){                     //是相应的引号                     if(quote_char==codeArr[i]){                         htmlTxt[htmlTxt.length] = codeArr[i];                         quote_opened    = false;                         quote_char        = "";                     } else {                         htmlTxt[htmlTxt.length] = this.toHex (codeArr[i]);                     }                 } else {                     htmlTxt[htmlTxt.length] =  codeArr[i];                     quote_opened    = true;                     quote_char        = codeArr[i];                 }             //处理转义字符             } else if(codeArr[i] == this._escape){                 htmlTxt[htmlTxt.length] = codeArr[i];                 if(i<word_index-1){                     if(codeArr[i+1].charCodeAt(0) >=32&&codeArr[i+1].charCodeAt(0)<=127){                         htmlTxt[htmlTxt.length] = codeArr [i+1].substr(0,1);                         htmlTxt[htmlTxt.length] = this.toHex (codeArr[i+1].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[htmlTxt.length] = 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[htmlTxt.length] =   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[htmlTxt.length] = 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[htmlTxt.length] =   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[i])==""){                                 htmlTxt[htmlTxt.length] =  codeArr[i];                             }else{                                 htmlTxt[htmlTxt.length] =  this.translateVar(cur_var_map,codeArr[i]);                             }                         }else{                             //不是在暂停变量定义时                             if(var_pause){                                 if(this.translateVar (cur_var_map,codeArr[i])==""){                                     htmlTxt[htmlTxt.length] =  codeArr[i];                                 }else{                                     htmlTxt[htmlTxt.length] =  this.translateVar(cur_var_map,codeArr[i]);                                 }                             }else{                                 //变量符合命名规则,并且(变量 前为空格或制表符或逗号如:var a;var    a;var a,b;,还有如果是 函数参数,如:function(a,b,c)                                 if(this.isVar(codeArr[i])&& (i>0&&codeArr[i-1]==" "||codeArr[i-1]=="\t"||codeArr[i-1] ==this._varContinue||cur_var_map.isParameter)){                                     var name =  this.getRandName();                                     cur_var_map.add(codeArr [i],name);                                     htmlTxt[htmlTxt.length] =  this.translateVar(cur_var_map,codeArr[i]);                                 }else{                                     htmlTxt[htmlTxt.length] =  codeArr[i];                                 }                             }                         }                     //注释中                     }else{                         if(!this._deleteComment){                             htmlTxt[htmlTxt.length] = codeArr [i];                         }                     }                 }else{                     if(execute_opened){                         if(this.translateVar (cur_var_map,codeArr[i])==""){                             htmlTxt[htmlTxt.length] = codeArr [i];                         }else{                             htmlTxt[htmlTxt.length] =  this.translateVar(cur_var_map,codeArr[i]);                         }                     }else{                         htmlTxt[htmlTxt.length] = this.toHex (codeArr[i]);                     }                 }             }         }         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[cc.length] = code[i];             }             var c = cc.join("");             if(this._caseSensitive){                 if(str.length>=code[index].length&&c.indexOf (str)==0){                     return true;                 }             }else{                 if(str.length>=code [index].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[str.length] = "\\x" + val.charCodeAt (i).toString(16);             }else{                 str[str.length] = "\\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[n.length] = c.charAt(parseInt(Math.random() *54));         }         return n.join("")+this._varNum;     }     //是否符合变量命名字首规则     this.isVar = function(val){         return /^[a-zA-Z_\$].*$/.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();     return  htmltxt; } 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>
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部