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. 加密流程

完整的加密过程包含以下步骤:

  1. 预处理代码

    • 去除所有回车换行符
    • 转义单引号
  2. 提取标识符

    • 使用正则表达式/\b(\w+)\b/g匹配所有单词边界
    • 对提取的标识符进行排序和去重
  3. 创建字典

    • 将去重后的标识符存入数组形成字典
  4. Base62编码替换

    • 使用Base62算法将标识符替换为编码后的形式
  5. 构建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. 代码美化分析法

通过美化加密代码并分析其结构:

  1. 美化代码结构

    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,{})
    )
    
  2. 关键参数解析

    • p: 加密后的Base62编码代码
    • a: 基数,固定为62
    • c: 字典长度
    • 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. 增强加密的建议

  1. 变异eval名称

    // 将eval改为动态生成的名称
    var _0xabc = ['eval'][0];
    _0xabc(function(p,a,c,k,e,r){...});
    
  2. 二次混淆加密

    • 使用JShaman等工具对加密后的代码再次混淆
    • 添加反调试、代码自修改等保护措施
  3. 结合其他加密技术

    • 与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代码保护技术,其主要价值在于:

  1. 代码压缩:通过字典替换减少重复标识符
  2. 可读性降低:使代码难以直接阅读和理解
  3. 基础保护:防止简单的代码复制和重用

然而,其保护强度有限,容易被破解。在实际应用中,建议结合其他更先进的混淆和加密技术,构建多层次的代码保护体系。

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. 核心加密函数 3. Base62算法解析 num 函数实现了Base62编码算法: 参数 a 固定为62,表示使用62进制(0-9, a-z, A-Z) 递归地将数字转换为62进制表示 当余数大于35时使用 String.fromCharCode(c+29) 转换为字母 三、解密方法详解 1. 直接输出法 最简单的方法是将开头的 eval 替换为输出函数: 2. 代码美化分析法 通过美化加密代码并分析其结构: 美化代码结构 : 关键参数解析 : p : 加密后的Base62编码代码 a : 基数,固定为62 c : 字典长度 k : 字典数组 e : Base62解码函数 d : 空对象,用于存储解码结果 3. 调试输出法 在加密函数中插入调试语句查看中间结果: 四、加密强度分析与增强建议 1. 现有加密的弱点 直接暴露解密逻辑 :eval结构容易被识别 静态替换 :基于简单的字符串替换 可逆性强 :通过简单修改即可解密 2. 增强加密的建议 变异eval名称 : 二次混淆加密 : 使用JShaman等工具对加密后的代码再次混淆 添加反调试、代码自修改等保护措施 结合其他加密技术 : 与AAEncode、JJEncode等编码技术结合 添加代码完整性校验 五、完整示例 加密示例 原始代码: 加密后代码: 解密示例 方法1:直接替换eval为console.log 输出结果: 六、总结 Eval加密作为一种历史悠久的JavaScript代码保护技术,其主要价值在于: 代码压缩 :通过字典替换减少重复标识符 可读性降低 :使代码难以直接阅读和理解 基础保护 :防止简单的代码复制和重用 然而,其保护强度有限,容易被破解。在实际应用中,建议结合其他更先进的混淆和加密技术,构建多层次的代码保护体系。