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("解密代碼執行結果:");