js混淆,js混淆反编译
UglifyJS怎么混淆js
如果你是全局安装的,可以直接在需要混淆文件的目录下,
按住shift键右击鼠标选择在此处打开命令窗口如图
2.打开窗口后直接在窗口执行
uglifyjs?main.js?demo.js?-o?foo.min.js?--source-map?foo.min.js.map?--source-map-root??-p?5?-c?-m?--wrap?--export-all
混淆文件main.js和demo.js生成foo.min.js和foo.min.js.map并指定map的来源网站
3.另一种使用方式是,把UglifyJS2包放到程序中,通过API对JS文件或JS代码进行压缩。首先,新建一个NPM项目文件package.json,然后在是下载UglifyJS2依赖包。
新建文件package.json
{
??"name":?"nodejs-uglifyjs2",
??"version":?"0.0.1",
??"description":?"uglifyjs2",
??"author":?"Conan?Zhang?",
??"dependencies":?{
??}
}
4.执行npm install uglify-js --save下载UglifyJS2依赖包
5.安装完成后
新建test.js开始测试
var?UglifyJS?=?require('uglify-js');
?
//代码压缩
var?result?=?UglifyJS.minify("var?b?=?function?()?{};",?{fromString:?true});
console.log("\n===========================");
console.log(result);
?
//文件压缩
result?=?UglifyJS.minify(["demo.js"]);
console.log("\n===========================");
console.log(result.code);
//多文件压缩,指定source?map和网站来源
result?=?UglifyJS.minify(["main.js","demo.js"],{
????outSourceMap:?"out.js.map",
????sourceRoot:?"",
????mangle:true
});
console.log("\n===========================");
console.log(result.code);
console.log(result.map);
js混淆后的代码如何解密?
混淆的作用就是用无意义的关键字符替代原来有意义的关键字符,让浏览者“看不懂”代码,不了解代码的运行逻辑,也就无法复用。
混淆不同于加密解密,因为原来有意义的字符已经被替换了,不存在算法上的反推,任何的技术不可能再得出原来的那些有意义的字符。
所以理论上,混淆后的代码无法解密。但因为它的整个运算逻辑关系链是完整的,与混淆前的代码关系链是完全一致的,所以非要“破解”,只能说摸清它的逻辑关系链,人为去做的话,烧脑又复杂。技术上需要一定的运算能力来做这个工作,比如云计算甚至超级计算机,但即便“破解”,它也是只能分析出一个函数大致是干什么用的,原来的关键字符名称还是不可能得出。
js 变量声明易混淆的几点知识
变量提升
变量与函数名提升优先级
js 作用域内有变量,这个很好理解,但有一些细节需要注意。
console.log(foo);??//?函数function?foo(){
????console.log("函数声明");
}
console.log(foo);?//?函数var?foo?=?"变量";
console.log(foo);?//?变量
当变量名与函数名同名,且都提升上去了,那最终结果是哪个声明起作用呢?
有两个知识点:?
1. var foo;并不会覆盖之前的变量?
2. 函数提升优先级比变量提升要高,且不会被变量声明覆盖,但是会被变量赋值覆盖,所以上面的代码实际上是
function?foo(){?//?优先级最高,提升到最前面
????console.log("函数声明");
}var?foo;?//?只提升声明,不提升赋值,且不能覆盖函数声明console.log(foo);?
console.log(foo);?
foo?=?"变量";?//?可以覆盖函数声明console.log(foo);
连等赋值的变量提升
var?num1?=?1;??function???fn(num3){??
????console.log(num1);????//output????undefined??
????console.log(num3);????//output??4??
????console.log(num4);????//throw?error??“num4?is?not?defined”??
????console.log(num2);????//throw?error??“num2?is?not?defined”??
????var?num1?=?num4?=?2;??//?js?连等赋值??num4?不会被提升
????num2?=?3;?????????????//?没有?var?会挂载到全局作用域,但不会提升,所以之前会报错
????var?num3=?5;??
}??
fn(4);
if 判断内变量提升
if?(true)?{??
????function?fn(){?return?1;?}??
}else?{??
?????if(false){??
???????function?fn(){?return?2;?}??
?????}??
}??
console.log(fn.toString());?
console.log(fn())
以下是从找到这个例子的原文中摘抄的内容:chrome和ie一均为function fn(){ return 2;},而firefox中依然报错。?
可见三者处理并不相同。ff中会提前变量的声明,但不会提前块级作用域中的函数声明。而chrome和ie下就会提前块级作用域中的函数声明,而且后面的声明会覆盖前面的声明。
函数的作用域内赋值
在js中,提到变量赋值,就要先说作用域,而作用域,在es6之前,只有函数才会形成独立的作用域,然后函数的嵌套形成了 js 的作用域链。子作用域内可以访问父级作用域内的元素。函数的作用域在函数确定的时候就已经确定,与调用无关。
//?test1var?x?=?1;function?foo(x)?{
??var?x?=?3;??var?y?=?function()?{?
????x?=?2;
????console.log(x)
??}
??y();
??console.log(x);??return?y
}var?z?=?foo()?//?2?2z()?//?2
这段函数会输出三个 2 ,指向同一个 x,甚至,将 x 改为对象,就更明显了
//?test2var?x?=?"abc";function?foo(x)?{
??var?x?=?c;??var?y?=?function()?{?
????return?x;
??}??return?y;
}var?c?=?{a:1}var?z?=?foo();?
var?b?=?z();
console.log(b?===?c);?//?true
上面例子中,foo 函数执行后,返回 y 函数并赋值给 z,z 指向 y 函数(函数体),此时,z 并不在 foo 函数的作用域内,在此作用域不能访问到 x,但 z 只是引用类型数据的一个指针,只是同 x 指向了同一个对象而已。而执行 z 函数,则会返回 x 的值,这个值是函数 y 作用域内访问到的 x 的值,是根据函数的书写位置确定的作用域,并不会因为调用位置不同,而改变变量的指向。
但是同时要注意,虽然函数作用域在函数写出来时就已经确定,但具体的值却跟调用的时机有关。
//?test3var?x?=?"abc";function?foo(x)?{
??var?x?=?c;??var?y?=?function()?{
????x.a++;????return?x;
??}??return?y
}var?c?=?{a:1}var?z?=?foo();?
console.log(z())?//?{a:?2}console.log(z())?//?{a:?3}console.log(z())?//?{a:?4}
这个例子中,输出的三次都是同一个对象,但输出的值不同,这是因为输出的时候的值不同,这就和调用时的实际值有关了。
什么是JavaScript混淆,什么时候使用
混淆是故意制造混淆代码的行为,即让人难以理解的源代码或机器码。它类似于加密,但机器能够理解代码并能够执行:它。
混淆可以用来隐藏来自外部世界的业务逻辑,它将大大减少文件的大小,因此服务器和客户机之间的数据传输速度会很快。
缩小化也是一种混淆,在这里清空空空间,并重新命名变量。
在JavaScript中,浏览器不能执行加密的代码,而浏览器会执行混淆代码。
加密的代码总是需要解密才能被执行。
混淆的代码不需要去混淆来执行。
总之,混淆JavaScript代码很好。
js代码混淆 以及 混淆后如何使用
js反混淆需要借助第三方工具:
1、在百度搜索js混淆还原
2、把要还原的代码放在第一个文本框,点击js解混淆就可以了。
结果在下面显示
JS代码混淆了,怎么反混淆回去?
这不是混淆,只是使用16进制表示的ASCII码~
单独提取出字符串,在后面加上.toString()进行调试即可看到原本字符串。
你的这句转码后如下:
window["document"]["write"]('sc')
相当于:window.document.write('sc')
很有可能是输出一个script标签的代码段的开始。