天天看點

JavaScript奇淫技巧:利用數組加密并壓縮代碼

JavaScript奇淫技巧:利用數組加密并壓縮代碼

作者:JShaman.com w2sft

在之前的文章中,介紹過JS代碼加密為什麼代碼壓縮的效果,比如長的變量名轉化為短變量名、删除注釋、删除回車換行等。

本文,再分享一種有代碼壓縮效果的加密手段:利用數組壓縮代碼,在JS加密工具中,比如JShaman平台,會稱這種技術為“陣列化”。

其原理,是将JS代碼中的某些内容,如字元或代碼段,或關鍵字,放到一個數組中,再通過調用數組下标的方式擷取原内容。

為何這種方式有壓縮效果呢?是因為,代碼中重複的關鍵字或内容通常會有很多,假如一個10個字元的内容,反複出現10次,所占長度為100個字元,當把它放到數組A中,A[?]是4個字元,10次使用所占長度為40個字元長度。如此,便起到了壓縮代碼的效果。

例如一段代碼:

console.log();

var abcdefg;

abcdefg = "jshaman.com"

abcdefg = "jshaman團隊專注于JS混淆加密"

abcdefg = "jshaman.com" + " " + "jshaman團隊專注于JS混淆加密"

console.log(abcdefg);

console.log();

用上述思路,将代碼以空格分隔,分隔後的内容放入一個數組:

_=[

'`console.log();`',

'`var`',

'`abcdefg;`',

'`abcdefg`',

'`"jshaman.com"`',

'`"jshaman團隊專注于JS混淆加密"`',

'`console.log(abcdefg);`'

]

用數組對應的下标替換後得到加密代碼:

_[0]

_[1] _[2]

_[3] = _[5]

_[3] = _[8]

_[3] = _[5] + " " + _[8]

_[17]

_[0]

如此,顯然代碼長度比之前縮短了許多。

注:此處僅做原理示範,尚未提供解密還原及執行功能。

最後,提供完整示範代碼:

//要加密的JS代碼

var js_code =`

console.log();

var abcdefg;

abcdefg = "jshaman.com"

abcdefg = "jshaman團隊專注于JS混淆加密"

abcdefg = "jshaman.com" + " " + "jshaman團隊專注于JS混淆加密"

console.log(abcdefg);

console.log();

`;

console.log();

console.log("原始代碼:\n", js_code);

console.log();

//把代碼以空格分割,放入數組

var str_arr = js_code.trim().split(/\s+/);

var str_obj = {};

var min_str_arr = [];

var min_str_arr_index = [];

var index = 0;

//周遊代碼數組

for(i=0; i<str_arr.length; i++){

    //長度大于3的數組内容

    if(str_arr[i].length >= 3){

像中是否存在,用對像不用數組是因為效率更高

        if(str_obj[str_arr[i]] == null){

            index = i;

            str_obj[str_arr[i]] = i;

            //縮小的數組

            min_str_arr.push("`" + str_arr[i] + "`");

            //縮小的數組索引,解密用

            min_str_arr_index.push(index);

        }else{

            //索引,解密用

            index = str_obj[str_arr[i]];

        }

        //将代碼進行替換加密

        js_code = js_code.replace(str_arr[i],"_["+ index +"]");

    }

}

console.log()

console.log("數組:\n")

console.log(min_str_arr)

console.log("數組索引:\n")

console.log(min_str_arr_index)

console.log()

console.log("加密代碼:\n\n",js_code);

console.log();

for(i=0; i<min_str_arr.length; i++){

    js_code = js_code.replace(new RegExp("_\\["+min_str_arr_index[i]+"\\]","g"), min_str_arr[i].replace("`","").replace("`",""));

}

console.log("解密代碼:\n",js_code);

console.log()

console.log("解密代碼執行結果:");