JavaScript高手进阶:详解Eval加密
字数 1186 2025-08-11 21:26:09
JavaScript Eval加密技术详解与解密方法
一、Eval加密概述
Eval加密是一种古老的JavaScript代码加密技术,最早由南非程序员Dean Edwards于2004年发明。这种加密技术的典型特征是以eval(function(p,a,c,k,e,r)开头的代码结构。
主要特点
- 通过Base62算法对代码进行编码
- 使用字典压缩技术减少重复标识符
- 最终通过eval函数执行解密后的代码
- 加密后的代码看起来复杂但实际破解相对容易
二、加密原理详解
1. 加密流程
完整的加密过程包含以下步骤:
-
预处理代码:
- 去除所有回车换行符
- 转义单引号
-
提取标识符:
- 使用正则表达式
/\b(\w+)\b/g匹配所有单词边界 - 对提取的标识符进行排序和去重
- 使用正则表达式
-
创建字典:
- 将去重后的标识符存入数组形成字典
-
Base62编码替换:
- 使用Base62算法将标识符替换为编码后的形式
-
构建eval结构:
- 将处理后的代码嵌入eval函数结构中
2. 核心加密函数
a=62;
function encode(js_code) {
var code = js_code;
code = code.replace(/[\r\n]+/g, '');
code = code.replace(/'/g, "\\'");
var tmp = code.match(/\b(\w+)\b/g);
tmp.sort();
var dict = [];
var i, t = '';
for(var i=0; i<tmp.length; i++) {
if(tmp[i] != t) dict.push(t = tmp[i]);
}
var len = dict.length;
var ch;
for(i=0; i<len; i++) {
ch = num(i);
code = code.replace(new RegExp('\\b'+dict[i]+'\\b','g'), ch);
if(ch == dict[i]) dict[i] = '';
}
return "eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('"+code+"',"+a+","+len+",'"+dict.join('|')+"'.split('|'),0,{}))";
}
function num(c) {
return(c<a?'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36));
}
3. Base62算法解析
num函数实现了Base62编码算法:
- 参数
a固定为62,表示使用62进制(0-9, a-z, A-Z) - 递归地将数字转换为62进制表示
- 当余数大于35时使用
String.fromCharCode(c+29)转换为字母
三、解密方法详解
1. 直接输出法
最简单的方法是将开头的eval替换为输出函数:
// 将
eval(function(p,a,c,k,e,r){...})
// 改为
console.log(function(p,a,c,k,e,r){...})
// 或
alert(function(p,a,c,k,e,r){...})
2. 代码美化分析法
通过美化加密代码并分析其结构:
-
美化代码结构:
eval( function(p,a,c,k,e,d) { e = function(c) { return (c<a ? '' : e(parseInt(c/a))) + ((c=c%a) > 35 ? String.fromCharCode(c+29) : c.toString(36)); }; if(!''.replace(/^/,String)) { while(c--) d[e(c)] = k[c] || e(c); k = [function(e) { return d[e] }]; e = function() { return '\\w+' }; c = 1; }; while(c--) if(k[c]) p = p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]); return p; }('加密后的代码',62,字典长度,'字典内容'.split('|'),0,{}) ) -
关键参数解析:
p: 加密后的Base62编码代码a: 基数,固定为62c: 字典长度k: 字典数组e: Base62解码函数d: 空对象,用于存储解码结果
3. 调试输出法
在加密函数中插入调试语句查看中间结果:
eval(
function(p,a,c,k,e,d) {
console.log("原始参数:");
console.log("p:", p);
console.log("a:", a);
console.log("c:", c);
console.log("k:", k);
console.log("e:", e);
console.log("d:", d);
e = function(c) {
return (c<a ? '' : e(parseInt(c/a))) +
((c=c%a) > 35 ? String.fromCharCode(c+29) : c.toString(36));
};
if(!''.replace(/^/,String)) {
while(c--) d[e(c)] = k[c] || e(c);
k = [function(e) { return d[e] }];
e = function() { return '\\w+' };
c = 1;
};
while(c--) if(k[c]) p = p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);
console.log("解密后代码:", p);
return p;
}('加密后的代码',62,字典长度,'字典内容'.split('|'),0,{})
)
四、加密强度分析与增强建议
1. 现有加密的弱点
- 直接暴露解密逻辑:eval结构容易被识别
- 静态替换:基于简单的字符串替换
- 可逆性强:通过简单修改即可解密
2. 增强加密的建议
-
变异eval名称:
// 将eval改为动态生成的名称 var _0xabc = ['eval'][0]; _0xabc(function(p,a,c,k,e,r){...}); -
二次混淆加密:
- 使用JShaman等工具对加密后的代码再次混淆
- 添加反调试、代码自修改等保护措施
-
结合其他加密技术:
- 与AAEncode、JJEncode等编码技术结合
- 添加代码完整性校验
五、完整示例
加密示例
原始代码:
var str ='jshaman.com'; console.log(str); var str ='jshaman.com'; console.log(str);
加密后代码:
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('5 4 =\'2.0\'; 1.3(4); 5 4 =\'2.0\'; 1.3(4);',62,6,'com|console|jshaman|log|str|var'.split('|'),0,{}))
解密示例
方法1:直接替换eval为console.log
console.log(function(p,a,c,k,e,d){...}('5 4 =\'2.0\'; 1.3(4); 5 4 =\'2.0\'; 1.3(4);',62,6,'com|console|jshaman|log|str|var'.split('|'),0,{}))
输出结果:
var str ='jshaman.com'; console.log(str); var str ='jshaman.com'; console.log(str);
六、总结
Eval加密作为一种历史悠久的JavaScript代码保护技术,其主要价值在于:
- 代码压缩:通过字典替换减少重复标识符
- 可读性降低:使代码难以直接阅读和理解
- 基础保护:防止简单的代码复制和重用
然而,其保护强度有限,容易被破解。在实际应用中,建议结合其他更先进的混淆和加密技术,构建多层次的代码保护体系。