<!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[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,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[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>
</body>
</html>
分享到:
相关推荐
在Web开发中,尤其对于那些包含商业逻辑或者敏感信息的JavaScript代码,使用代码混淆是非常重要的安全措施。 混淆(Obfuscation)这个术语来源于拉丁语,意味着“使迷惑”。在编程领域,它指的是将源代码转化为一种...
JavaScript脚本混淆器是一种工具,它的主要目的是保护JavaScript代码的安全性,防止未经授权的用户阅读、复制或篡改代码。在Web开发中,由于JavaScript代码通常是以明文形式发送到客户端,这使得它容易受到诸如代码...
代码混淆器 简介 JavaScript JavaScript 最初被设计用来作为简单的前端脚本 随着前端技术的不断发展,JavaScript 承担了越来越多的功能。它天生安全性不足的缺点得到了充分暴露 JavaScript 程序解释执行,整个源代码...
一个简单好用的javascript加密混淆工具,只有执行文件超好用
JavaScript代码混淆器是一种用于保护JavaScript源代码的技术,它通过改变代码的可读性来提高代码的安全性。在互联网上发布JavaScript代码时,由于其是解释执行的语言,源代码默认是暴露给用户的,这可能导致恶意用户...
混淆JavaScript代码的主要目的是为了增加攻击者逆向工程的难度,防止代码被轻易理解和篡改。混淆可以通过多种方式实现,比如改变变量和函数名称,使用无意义的字符,以及打乱代码结构。这使得阅读混淆后的代码变得...
"JS代码混淆软件"是一个小巧而实用的工具,它可以帮助开发者快速地对JavaScript代码进行混淆。以下是一些常见的JS代码混淆工具: 1. UglifyJS:一个流行的JavaScript压缩和混淆工具,可以删除未使用的变量、函数,...
JavaScript混淆器是一种工具,主要用于对JavaScript代码进行加密和变形处理,以提高代码的保密性和防止他人轻易理解或篡改代码。在Web开发中,源代码的公开性有时会导致知识产权的泄露,恶意用户可能会分析并利用...
我们知道javascrip的代码是裸露在html中我们很容易得到它的源码。如果紧紧是一个弹出窗体来说,也无所谓,但若是一个隐私的呢,怎么办?...我们必须使用混淆器来掩人耳目。所以这就不至终别人容易的得到我们的代码。
**混淆JavaScript代码** JavaScript混淆是一种通过改变原始代码的可读性来增加其保密性的技术。这通常涉及到变量名和函数名的重命名,以及代码结构的打乱。例如,Proguard是一款常用的Java混淆工具,虽然它主要用在...
JavaScript代码生成器就是一种能够帮助开发者快速生成JavaScript代码的工具,它可以极大提高开发效率,减少手动编写重复性代码的工作量。 JavaScript代码生成器通常具备以下功能: 1. 自动化模板:这些工具提供了...
5. 控制流混淆:通过创建虚假的控制流图,混淆器可以误导分析工具,使其无法准确理解代码的实际执行路径。 使用JavaScript Obfuscator,开发者可以在不改变代码行为的前提下,有效地保护其知识产权和防止代码被滥用...
在哪里放置 JavaScript 代码? 通常情况下,JavaScript 代码是和 HTML 代码一起使用的,可以将 JavaScript 代码放置在 HTML 文档的任何地方。但放置的地方,会对 JavaScript 代码的正常执行会有一定影响,具体如下所...
JavaScript代码加密器是一种工具,主要用于保护Web应用中的源代码,防止未经授权的访问、复制或篡改。在Web环境中,由于JavaScript代码通常是明文传输的,所以对于敏感的业务逻辑或者防止竞争对手抄袭,代码加密显得...
敏创Javascript混淆加密器是广州市敏创信息科技有限公司在保护自己的javascript源代码过程中积累的一套实用工具,可以有效地对javascript代码进行混淆加密,达到保护自己知识产权的目的。 工具可以去除空格,回车,...
在标题和描述中提到的"混淆js代码,把javascript代码变成()[]!这种乱七八糟的字符",实际上指的是JavaScript代码经过混淆处理后呈现出的形式。混淆后的代码虽然看起来难以理解,但其功能与混淆前保持一致,仍能正常...
JavaScript混淆器与DWZ富客户端框架结合使用,可以在开发完成后对框架中的JavaScript代码进行混淆,确保代码的不被轻易破解。混淆过程可能会包括变量名和函数名的替换、代码结构的打乱、注释的删除等步骤,这样即使...
《Effective JavaScript:编写高质量JavaScript代码的68个有效方法》是David Herman撰写的一本JavaScript编程指南,该书基于作者在Ecma的JavaScript标准化委员会的工作经验,深入探讨了JavaScript的内部工作机制、...
此工具为工具产品!加密会形成乱码!让人看不懂的意思!
JavaScript引擎JIT代码的类型混淆缺陷检测器 JavaScript引擎JIT代码的类型混淆缺陷检测器是一种用于检测JavaScript引擎JIT代码中的类型混淆缺陷的检测器。该检测器基于对JavaScript引擎JIT编译器设计机制的剖析,...