<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>
CONFUSION JS混淆 全源码
内容版权声明:除非注明,否则皆为本站原创文章。
