CLASS_CONFUSION JS混淆 全源码
CLASS_CONFUSION JS混淆 全源码
发布时间:2016-12-30 来源:查字典编辑
摘要:利用随机字符串代替变量等,混淆原代码,保护自己写的代码,不利于别人直接剽窃复制代码代码如下:

利用随机字符串代替变量等,混淆原代码,保护自己写的代码,不利于别人直接剽窃

复制代码 代码如下:

<SCRIPTlanguage=JavaScript>

<-------------------------------------------------------

------------------------------------------

varxx=newCLASS_CONFUSION(code);

document.getElementById("display").innerHTML=

xx.confusion();

---------------------------------------------------------

------------------------------------------

**作者:ttyp

**邮件:ttyp@21cn.com

**日期:2006-3-20

**版本:0.12

**

==============================================================

====================================

**/

functionCLASS_CONFUSION(code){

//哈希表类

functionHashtable(){

this._hash=newObject();

this.add=function(key,value){

if(typeof(key)!="undefined"){

if(this.contains(key)==false){

this._hash[key]=typeof

(value)=="undefined"?null:value;

returntrue;

}else{

returnfalse;

}

}else{

returnfalse;

}

}

this.remove=function(key){deletethis._hash

[key];}

this.count=function(){vari=0;for(varkin

this._hash){i++;}returni;}

this.items=function(key){returnthis._hash

[key];}

this.contains=function(key){returntypeof

(this._hash[key])!="undefined";}

this.clear=function(){for(varkin

this._hash){deletethis._hash[k];}}

}

functionVariableMap(parent){

this.table=newHashtable();

this.level=parent?parent.level+1:0;

this.parent=parent;

this.add=function(key,value){this.table.add

(key,value)};

this.items=function(key){returnthis.table.items

(key)};

this.count=function(){returnthis.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=newHashtable();

var_cs=true;

if(typeof(cs)=="undefined"||cs==null){

_cs=this._caseSensitive;

}else{

_cs=cs;

}

for(variin_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=",.?!;:/<>(){}[]"'rnt=+-

|*%@#$^&";

//引用字符

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(){

varcodeArr=newArray();

varword_index=0;

varhtmlTxt=newArray();

//得到分割字符数组(分词)

for(vari=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);

}

}

varquote_opened=false;//引用标记

varslash_star_comment_opened=false;//多行注

释标记

varslash_slash_comment_opened=false;//单行注

释标记

varline_num=1;//行号

varquote_char="";//引用

标记类型

varcall_opened=false;

varcall_string="";

varvar_opened=false;

varvar_pause=false;

varfunction_opened=false;

varparameter_opened=false;

varvar_map=newVariableMap

();

varcur_var_map=var_map;

varexecute_opened=false;

//按分割字,分块显示

for(vari=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;

}elseif(codeArr[i]==""){

htmlTxt[htmlTxt.length]="";

}elseif(codeArr[i]=="n"){

//处理换行

}elseif(codeArr[i]=="r"){

slash_slash_comment_opened=false;

quote_opened=false;

var_opened=false;

htmlTxt[htmlTxt.length]="rn";

line_num++;

//处理function里的参数标记

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&this.isFunction

(codeArr[i])){

htmlTxt[htmlTxt.length]=codeArr[i];

function_opened=true;

}elseif(!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=newVariableMap

(cur_var_map);

cur_var_map.isParameter=true;

}

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&codeArr[i]==")"){

htmlTxt[htmlTxt.length]=codeArr[i];

//处理vara=newClass(),b=newDate();类似的

问题

if(cur_var_map.isParameter){

var_opened=false;

var_pause=false;

}

}elseif(!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;

}

}elseif(!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;

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&codeArr[i]

==this._varPause){

htmlTxt[htmlTxt.length]=codeArr[i];

var_pause=true;

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&codeArr[i]

==this._varContinue){

htmlTxt[htmlTxt.length]=codeArr[i];

var_pause=false;

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&codeArr[i]

==this._beginBlock){

cur_var_map=newVariableMap(cur_var_map);

var_opened=false;

htmlTxt[htmlTxt.length]=codeArr[i];

}elseif(!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];

//处理引用调用

}elseif(!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;

}

//处理关键字

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&this.isKeyword

(codeArr[i])){

htmlTxt[htmlTxt.length]=codeArr[i];

//处理eval后的字符串

}elseif(!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内置对象

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&this.isWindow

(codeArr[i])){

htmlTxt[htmlTxt.length]="window[""+

this.toHex(codeArr[i])+""]";

//处理普通对象

}elseif(!slash_slash_comment_opened&&!

slash_star_comment_opened&&!quote_opened&&

this.isCommonObject(codeArr[i])){

htmlTxt[htmlTxt.length]="window[""+

this.toHex(codeArr[i])+""]";

//处理双引号(引号前不能为转义字符)

}elseif(!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];

}

//处理转义字符

}elseif(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;

}

}

//处理多行注释的开始

}elseif(!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);

//处理单行注释

}elseif(!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);

//处理忽略词

}elseif(!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);

//处理多行注释结束

}elseif(!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{

//变量符合命名规则,并且(变量

前为空格或制表符或逗号如:vara;vara;vara,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)){

varname=

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]);

}

}

}

}

returnhtmlTxt.join("");

}

this.isStartWith=function(str,code,index){

if(typeof(str)!="undefined"&&str.length>0){

varcc=newArray();

for(vari=index;i<index+str.length;i++){

cc[cc.length]=code[i];

}

varc=cc.join("");

if(this._caseSensitive){

if(str.length>=code[index].length&&c.indexOf

(str)==0){

returntrue;

}

}else{

if(str.length>=code

[index].length&&c.toLowerCase().indexOf(str.toLowerCase())

==0){

returntrue;

}

}

returnfalse;

}else{

returnfalse;

}

}

this.isFunction=function(val){

returnthis._function.contains(this._caseSensitive?

val:val.toLowerCase());

}

this.isKeyword=function(val){

returnthis._keywords.contains(this._caseSensitive?

val:val.toLowerCase());

}

this.isWindow=function(val){

returnthis._window.contains(this._caseSensitive?

val:val.toLowerCase());

}

this.isCommonObject=function(val){

returnthis._commonObjects.contains

(this._caseSensitive?val:val.toLowerCase());

}

this.getSkipLength=function(val){

varcount=0;

for(vari=0;i<val.length;i++){

if(this._wordDelimiters.indexOf(val.charAt(i))

>=0){

count++;

}

}

if(count>0){

count=count-1;

}

returncount;

}

//字符串转换为16进制形式

this.toHex=function(val){

varstr=newArray();

for(vari=0;i<val.length;i++){

varc=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);

}

}

returnstr.join("");

}

//获得变量随机名

this.getRandName=function(){

varstyle=parseInt(Math.random()*4);

varlen=parseInt(Math.random()*9)+1;

varn=[];

this._varNum++;

varc=

"abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$";

for(vari=0;i<len;i++){

n[n.length]=c.charAt(parseInt(Math.random()

*54));

}

returnn.join("")+this._varNum;

}

//是否符合变量命名字首规则

this.isVar=function(val){

return/^[a-zA-Z_$].*$/.test(val);

}

//翻译变量,如果返回为空则不存在此变量

this.translateVar=function(node,key){

if(node.contains(key)){

returnnode.items(key);

}

varcn=node.parent;

while(cn!=null){

if(cn.contains(key)){

returncn.items(key);

}

cn=cn.parent;

}

return"";

}

}

functiondoConfusion(o){

varhtmltxt="";

if(o==null){

alert("domNodeisnull!");

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=newCLASS_CONFUSION(_codetxt);

htmltxt=_syn.confusion();

returnhtmltxt;

}

functiongo()

{

varcode=document.getElementById("code").value;

varxx=newCLASS_CONFUSION(code);

vara=newDate();

document.getElementById("display").value=xx.confusion();

alert("共花:"+(newDate().getTime()-a.getTime())+

"ms");

}

//-->

</SCRIPT>

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类