js代码混淆压缩的原理解析

js代码混淆压缩的原理解析


今天给大家来讲解js的代码混淆压缩原理解密,我们先看一段js的源码

alter("hello, world");

我们使用最基本的压缩工具来压缩混淆一下

eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('0("1, 2");',3,3,'alter|hello|world'.split('|'),0,{}))

我去,代码好长,看不明白吧,我们来格式化一下

eval(function (p, a, c, k, e, r) {
    e = String;
    if (!''.replace(/^/, String)) {
        while (c--) r[c] = k[c] || c;
        k = [function (e) {
            return r[e]
        }];
        e = function () {
            return '\\w+'
        };
        c = 1
    }
    ;
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
    return p
}('0("1, 2");', 3, 3, 'alter|hello|world'.split('|'), 0, {}))

现在我们看到其实就是个函数将你的源码拆分了一下,然后将所有的变量及字符串放入一个自己的词典,这样可以减少重复的名字,提高压缩率,是不是很简单,它将函数名、变量名、字符串等全部拆成单个放入无重复的字典中,然后动态去取,那么这样压缩混淆后的代码能还原吗?

答案是可以的,下面我们附上解压得代码

// p 将原始内容中所有单词替换为字典下标后的压缩内容
// a 词典大小,暂时用不到
// c 词典大小,在解压时用来关联压缩内容和词典
// k 词典
// e 在解压时,当replace第二个参数支持function时,为\w+,否则为与下标对应的字符串
// r 当加速解压时用来保存词典
eval(function(p, a, c, k, e, r) {
    e = String;
 
    // 检测当前的浏览器是否支持replace(regex, function),如果支持的话就能够加快解压速度
    // 如果不支持的话可以把这一块直接忽略掉
    if (!''.replace(/^/, String)) {
 
        // 把被压缩的单词拷贝一份,因为k还有别的用处
        while (c--) r[c] = k[c] || c;
 
        // k[0]后面用来对每个匹配到的下标寻找替换字符串
        k = [function(e) {
            return r[e]
        }];
 
        // 用来分割原始内容
        e = function() {
            return '\\w+'
        };
 
        // 加速解压的时候,相当于把while变成了if
        c = 1
    };
 
    // 使用词典将压缩后的下标代码扩展,如果没有上面的加速的话,c等于词典单词数,要一个一个替换了
    // 如果支持replace(string, function)的话,会将匹配到的每一个数字都传递给k[c]来得到其应该被替换为的字符串
    while (c--) if (k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]);
 
    // 完成解压
    return p
} ('0.1("2");0.1("2");0.1("3");', 4, 4, 'console|log|aaaaa|bbbb'.split('|'), 0, {}))

ok,今天就讲到这了

{{collectdata}}

网友评论0