JavaScript奇淫技巧:利用数组加密并压缩代码

举报
JsJiaMi 发表于 2022/10/10 09:06:54 2022/10/10
【摘要】 在之前的文章中,介绍过JS代码加密为什么代码压缩的效果,比如长的变量名转化为短变量名、删除注释、删除回车换行等。 本文,再分享一种有代码压缩效果的加密手段:利用数组压缩代码,在JS加密工具中,比如JShaman平台,会称这种技术为“阵列化”。

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)

运行效果:


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。