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("解密代码执行结果:");
eval(js_code)
运行效果:
评论(0)