时间:2021-05-28
利用随机字符串代替变量等,混淆原代码,保护自己写的代码,不利于别人直接剽窃
复制代码 代码如下:
<SCRIPTlanguage=JavaScript>
<!--
/**
**
==============================================================
====================================
**类名:CLASS_CONFUSION
**功能:JS混淆
**示例:
---------------------------------------------------------
------------------------------------------
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=" ,.?!;:\\/<>(){}[]\"'\r\n\t=+-
|*%@#$^&";
//引用字符
this._quotation=this.str2hashtable("\",'");
//行注释字符
this._lineComment="//";
//转义字符
this._escape="\\";
//多行引用开始
this._commentOn="";
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]="\r\n";
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>
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Summary涉及到分类问题,我们经常需要通过可视化混淆矩阵来分析实验结果进而得出调参思路,本文介绍如何利用python绘制混淆矩阵(confusion_mat
例如:判断html节点的class是否有no-js。1.jquery的实现方式$("html").hasClass('no-js');jquery源码的实现方式
使用版本layui-v2.3.0修改:打开layui中table.js源码在Class.prototype.pullData这个方法定义内部//获得数据Clas
背景公司代码提供给第三方使用,为了不完全泄露源码,需要对给出的代码进行加密混淆,前端代码虽然无法做到完全加密混淆,但是通过使用webpack-obfuscato
鼠标移入添加class样式HTMLHTML绑定事件,加入或者移出class为active流量套餐JS这里除了active这个class需要动态添加或者减去,其他