一、概念
为什么要进行混淆
由于设计原因,前端的js代码是可以在浏览器访问到的,那么因为需要让代码不被分析和复制从而导致更多安全问题,所以我们要对js代码进行混淆。
JS混淆和反混淆常见思路
在了解了js代码的执行过程后,我们来看如何对js进行混淆。可以想到比如我们想实现一个js混淆器我们该怎么做呢,要不就是用正则替换,要不就是在AST阶段生成混淆代码,用正则替换实现简单但是效果也比较差,现在js混淆大多数都是在不改变AST的情况下去生成混淆后的代码,保证代码的功能不变又能够做到混淆的目的。
代码压缩
压缩js代码不用多说,就是去除空格,换行符等等,让代码变成一坨甚至一行。
代码混淆
这里我们抛砖引玉,讲一些比较常见的混淆方式,实际上混淆的办法非常的多。
Javascript 提供了将字符串当做代码执行(evaluate)的能力,可以通过 Function 构造器、eval、setTimeout、setInterval 将字符串传递给 js 引擎进行解析执行。
访问成员变量的方法
js中可以通过window.eval()访问windows对象的eval方法,也可以用window[‘eval’]来访问
变量名混淆(将变量名变成一些无意义的可以来较乱的字符串(16进制)降低代码的可读性`
// eval函数
function eval() {
[native code]
}
//使用eval.toString进行内容匹配”[native code]”,可以轻易饶过
window.eval = function(str){
/[native code]/
//[native code]
console.log(“[native code]”);
};
//对eval.toString进行全匹配,通过重写toString就可以绕过
window.eval = function(str){
//…
};
window.eval.toString = function(){
return function eval() { [native code] }
};
//检测eval.toString和eval的原型
function hijacked(fun){
return “prototype” in fun || fun.toString().replace(/\n|\s/g, “”) != “function”+fun.name+“(){[nativecode]}”;}