关于Function JS加密加密(仅于问题分析)

我来分析这种JavaScript代码加密方式。
下面是实际代码(看上去是加密其实很容易被识别源内容)
Function("lc6a3mv#me$w5 $cn&$rxuj!txezr#"["\162\145\160\154\141\143\145"](/[356cm#\$w&xj!z]/g,"")["\x73\x70\x6C\x69\x74"]("")["\u0072\u0065\u0076\u0065\u0072\u0073\u0065"]()[String["\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65"](106,111,105,110)](""))()(";)()}))(thgirypoc(gol_elosnoc;gol.elosnoc=gol_elosnoc rav;};niamod+\",\"+)(raeYlluFteg.)etaD wen(+\"-\"+raey_morf+\")c(\" nruter{)(noitcnuf=thgirypoc rav;7102=raey_morf rav;\"moc.namahsj\"=niamod rav{)( noitcnuf("["s51fpc7@lb^if$7t^0x"["\162\145\160\154\141\143\145"](/[0157fc@b\^\$x]/g,"")]("")["\u0072\u0065\u0076\u0065\u0072\u0073\u0065"]()["\x6A\x6F\x69\x6E"](""));
加密原理分析
这种加密方式的核心是使用Function构造函数来执行经过混淆的代码字符串。
基本结构
javascript
Function(obfuscated_code_string)()
通过
Function构造函数将字符串转换为可执行函数立即调用该函数执行解密后的代码
混淆技术分析
字符串混淆:
使用八进制:
\162\145\160\154\141\143\145→"replace"使用十六进制:
\x73\x70\x6C\x69\x74→"split"使用Unicode转义:
\u0072\u0065\u0076\u0065\u0072\u0073\u0065→"reverse"原始混淆字符串 → replace去除干扰字符 → split → reverse反转 → join组合
示例代码解密
第一个示例解密过程:
javascript
// 原始混淆字符串
"lc6a3mv#me$w5 $cn&$rxuj!txezr#"// 去除干扰字符 [356cm#\$w&xj!z]
.replace(/[356cm#\$w&xj!z]/g, "")
// 得到: "a v e r s e"// 分割成数组
.split("")
// ["a", " ", "v", " ", "e", " ", "r", " ", "s", " ", "e"]// 反转数组
.reverse()
// ["e", " ", "s", " ", "r", " ", "e", " ", "v", " ", "a"]// 组合成字符串
.join("")
// "e s r e v a"实际代码还原
从源代码示例中可以看到实际代码:
javascript
var domain = "moc.namahsj";
var from_year = 2017;
var copyright = function(){return "(c)"+from_year+"-"+ (new Date()).getFullYear()+","+domain;
};
var console_log = console.log;
console.log = console_log;
copyright();特点总结
作用域保持:加密前后全局变量和作用域完全一致
直接运行:无需额外解密工具,浏览器可直接执行
轻度混淆:主要目的是防止简单阅读,不是高强度加密
可逆性:通过分析字符串处理流程可以还原原始代码
这种加密方式适合需要简单代码保护但又不想影响执行效率的场景。
