JavaScript高手进阶:详解Eval加密

2023-11-01

在JavaScript编程中,涉及到代码加密,在混淆加密时代之前,用的最多的应该是种Eval加密。

加密后的特征是以:eval(function(p,a,c,k,e,r)为代码开始,相信很多人都见过这种代码。

Eval加密效果例程:

这是一种非常古老的技术。早在约2004年,一名南非的JavaScript程序员dean.edwards发明了这种加密技术。

本文将探索该加密技术的实现原理,并给出解密方法。

首先,直接上源码,该源码为Eval加密的变种,加密效果一样。

Eval加密完整源码示例:

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));

}

console.log(encode("var str ='jshaman.com'; console.log(str); var str ='jshaman.com'; console.log(str);"));

执行,看加密效果。

执行效果:

运行加密后的代码,以测试正确性:

在NodeJS环境中运行:

正确输出,与源代码“var str ='jshaman.com'; console.log(str); var str ='jshaman.com'; console.log(str);”实现的效果一至。

接下来,详解加密代码,剖析其加密原理。

Eval加密详细剖析:

用于测试的代码仅一行:

在之前展示的代码中增加console.log()用于调试分析:

用于去除回车换行,以及变单引号为斜杠加单引号的两句正则表达式:

此时输出:

Match用于在字符串中查找指定字符,返回为数组。

正则表达式中的\b匹配一个单词边界,也就是指单词和空格间的位置,或换行以后的起始位置。

\w匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。

运行到这里,输出:['var', 'str', 'jshaman', 'com', 'console', 'log', 'str', 'var', 'str', 'jshaman', 'com', 'console', 'log', 'str'],可以理解为将代码进行了分词。

接下来的for循环,用于除重,可以达到压缩代码的目的:

重点是dict.push,用的很精妙。

运行时输出:

可以看到,原本14个数组成员,去重后,缩减成了6个成员。

接下来,是加密的重点部分:

在for循环中,使用正则表达式,将原代码中的关键字替换。

替换的内容来自于num函数的返回值:

这个num函数,返回的是:空格或参数除以62的整数结果加参数除以62的除数大于35时数字编码对应的字符或以36为基数的toString()字符。这也就是:Base62算法!

接下来再用正则表达式,结合base62算法,替换代码中每个字符串部分为dict中的数组序号。

看这时输出,在循环中原始代码已逐渐变为加密形式:

最后,再与Eval语句拼接,实现解密并运行:

这便得到了最终形态:

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,{}))

到此,已经完成加密,生成了加密代码。

接下来,再对解密方法进行说明,将加密代码还原。

解密方法:

解密之前,先对加密代码进行美化,手动换行、增加缩进,增加代码可读性:

美化后的代码,可以看到大体分为几部分:

E函数,是base62的解码部分。

while循环是关键字替换,还原出原始代码。

最下方的字符是加密后的base62编码,以及字符串数组等,是做为参数传递给匿名function(p,a,c,k,e,d)。

为了理解的更清晰,如上图,增加console.log语句,打印出各参数。

执行这段代码,输出如下:

在图中可以看到,变量p中存储的便是原始代码。

到此,等于已经完成解密。

另有一个更简单的方法是,见到此类代码,将起始处的eval改为console.log或document.write或alert都可直接输出源始代码。

如下图,源码被输出:

可见此种加密方法,虽然看起来够吓人,但破解十分容易。

在之前的文章《JavaScript黑暗技巧:变异的Eval》中,曾讲过对这种eval加密增强的办法:采用变异eval名称、用JShaman对加密代码二次混淆加密,可以极大的提升保护强度,实现JS代码的不可逆加密。有兴趣的朋友,可以翻看那篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript高手进阶:详解Eval加密 的相关文章

随机推荐

  • 解析智能扫地机器人中蕴含的情感元素

    在新一轮新冠疫情爆发后 大众宅在家的时候也变多起来 对于居家清洁的需求也越来越旺盛 人们希望可以从日常的繁琐的家务中解放出来 其中智能扫地机器人就占有一席之地 在市场需求持续走高的催生下 技术也在不断革新换代 根据数据显示 2021年前11
  • js数组处理方法总结slice、join、filter、map、indexOf、reduce、reduceRight等

    归纳总结数组的处理方法如下 1 splice 功能 1 删除 从数组中删除元素 两个参数 第一个参数 要删除元素的起始位置 第二个参数 要删除的项数 2 添加 插入元素到数组中 三个参数 第一个参数 起始位置 第二个参数 0 第三个参数 插
  • 【论文速递】TPAMI2022 - 自蒸馏:迈向高效紧凑的神经网络

    论文速递 TPAMI2022 自蒸馏 迈向高效紧凑的神经网络 论文原文 Self Distillation Towards Efficient and Compact Neural Networks 获取地址 https ieeexplor
  • virsh help domain命令内容解析

    简介 这段时间学习热迁移 要不断的在qemu monitor和libvirt中调转使用命令 故整理virsh命令 这篇是第一篇 整理virsh help domain相关内容 span style color 656565 span sty
  • 相约清华!AI药物研发大赛总决赛明日开幕

    2022年 百度飞桨联合清华大学药学院 筹备建设 AI 药学 产学研融合创新基地 推出了一系列AI 生物计算前沿课程和人才培养计划 今年5月 百度飞桨联合清华大学药学院 百度智能云和临港实验室 共同发起了首届全球AI药物研发算法大赛 并得到
  • mac如何卸载python2.7_mac python环境的安装与卸载

    换电脑之前并没有了解很多mac 所以习惯性的安装软件都是官网或者appstore下载来安装的 so 我下载了python2 7 并安装了 后来学习的视频是3 6的版本 又下载的3 6的版本来安装 过程中知道自带python2 7版本 也看到
  • 踩坑系列—mybatis查询没有数据时返回的list是null还是空集合?

    场景 根据多个条件查询 返回list集合数据 代码 第1步 根据页面多个条件查询 List list userDao queryOrders queryParams if null list return null 第2步 有数据再追加其他
  • Photoshop 通道讲解

    我常常问我的学生 什么是Photoshop最重要 不可或缺的功能 很多人的回答是图层 Layer 其实在Photoshop3 0之前根本没有图层的功能 在Photoshop的领域中 最重要的功能是选取范围 正确的运用选取范围 才能够做出精准
  • 从CSV文件导入Hive出现中文乱码问题解决

    关于HIVE中文乱码问题的解决办法 网上有很多帖子 然而很多都是基于LINUX终端显示字符的修改 其实上对于一些条件下的HIVE中文乱码问题是无法解决的 如从CSV文件导入到HIVE中出现的中文乱码问题 大家都知道 HIVE原生的字符编码是
  • 区块链密码学之对称加密

    前言 对称加密 顾名思义就是公钥和私钥都是同一个 只有一把密钥 那么密钥的共享就需要特别注意 容易泄露 但是由于它的加密效率高 速度快 占用空间小 主要用在大量数据的加密 往往需要提前分发密钥 对称密码从实现上可以分为两种 分组密码和序列密
  • 查询Windows默认编码格式

    开始 gt cmd gt chcp 然后显示一个数字 如936 则代表是GBK简体中文
  • unity生成透明背景的截图,截图背景图透明,UGUI scrollview滑动的时候不能遮罩3d模型

    转载 Unity3D Unity3D 摄像机带透明截图 静茹 鱼 博客园 using System using UnityEngine using System IO public class CropPicture MonoBehavio
  • Sonarqube安装插件报错An error has occurred. Please contact your administrator

    报错信息 Sonarqube安装插件时提示 An error has occurred Please contact your administrator 解决方法 1 查询报错日志 使用docker logs查询Sonarqube日志 插
  • jpress代码审计分享

    声明 出品 先知社区 ID 1871162774168111 以下内容 来自先知社区的1871162774168111作者原创 由于传播 利用此文所提供的信息而造成的任何直接或间接的后果和损失 均由使用者本人负责 长白山攻防实验室以及文章作
  • 【转载】一些比较好的电子资源网站

    SkyEye Project SkyEye是一个开源软件 opensource software 项目 中文名字是 天目 SkyEye的目标是在通用的Linux和Windows平台实现一个模拟集成开发环境 模拟基于ARM的嵌入式计算机系统
  • 《Linux C++》线程池

    为什么使用线程池 线程池的出现正是着眼于减少线程本身带来的开销 避免 即时创建 即时销毁 线程池应用场合 像大多数网络服务器 包括Web服务器 Email服务器以及数据库服务器处理数目巨大的连接请求 但处理时间却相对较短 并且实时性要求比较
  • 硬见小百科」这些PCB布局布线规则,你了解多少?

    元器件布局的10条规则 遵照 先大后小 先难后易 的布置原则 即重要的单元电路 核心元器件应当优先布局 布局中应参考原理框图 根据单板的主信号流向规律安排主要元器件 元器件的排列要便于调试和维修 亦即小元件周围不能放置大元件 需调试的元 器
  • Java中的sort()

    sort的第一种格式 sort的第二种格式 sort函数中cmp函数的使用方法 自定义排序基本方法 sort的第一种格式 sort函数的基本格式 默认排序为升序排序 Arrays sort 数组名 起始下标 终止下标 例 import ja
  • 【机器学习】机器学习建模调参方法总结

    文章目录 一 前言 1 1 数据来源 1 2 理论简介 二 知识总结 2 1 回归分析 2 2 长尾分布 2 3 欠拟合与过拟合 2 4 正则化 2 5 调参方法 2 5 1 贪心调参 坐标下降 2 5 2 网格调参GridSearchCV
  • JavaScript高手进阶:详解Eval加密

    在JavaScript编程中 涉及到代码加密 在混淆加密时代之前 用的最多的应该是种Eval加密 加密后的特征是以 eval function p a c k e r 为代码开始 相信很多人都见过这种代码 Eval加密效果例程 这是一种非常