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加密 的相关文章

  • 检测单选按钮/复选框状态的变化

    我需要可靠地检测页面上单选按钮 复选框的状态变化 以便查看表单是否被修改 现在 这是一个完全独立的脚本 我无法修改任何控制表单的内容 目前 我只能看到两种方法 onchange事件处理程序 有助于处理文本框 文本区域和选择 但不会针对复选框
  • 当内部元素滚动位置到达顶部/底部时防止父元素滚动?

    我有一个小 浮动工具箱 一个带有position fixed overflow auto 效果很好 但是 当在该框内滚动 使用鼠标滚轮 并到达底部或顶部时 父元素 接管 滚动请求 工具框后面的文档滚动 这很烦人 而不是用户 要求的 我正在使
  • 我可以通过什么方式混合 jQuery 和 vanilla JavaScript

    我有一个用普通 JavaScript 编写的 Web 应用程序 我想用 jQuery 动画来增强它 并使用我在各种 jQuery 插件中找到的一些功能 例如上传 http www uploadify com 可以通过什么方式将 jQuery
  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • 如何将 Ajax.BeginForm MVC 助手与 JSON 结果一起使用?

    我正在尝试使用 ASP NET MVC Ajax BeginForm 帮助程序 但不想在调用完成时使用现有的内容插入选项 相反 我想使用自定义 JavaScript 函数作为回调 这可行 但我想要的结果应该以 JSON 形式返回 不幸的是
  • 将时间戳转换为一个数组

    在应用程序脚本 谷歌表中运行 我从 API 获取时间戳并返回此结果 1 6370611672429312E18 1 63706107263277082E18 我执行此代码并且工作正常 但问题不在数组中 我每次都需要它在数组中 const t
  • 更新存储在 chrome 扩展本地存储中的对象

    我正在开发一个 chrome 扩展 我将存储服务器发送的对象 例如 我将收到 命令 id 1 类型 A 大小 B 优先级 C 如果我有一个数据库 我会将其作为表中的一行插入commands 使用 chrome storage 我将这些对象的
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 如何通过setTimeout函数定期打印数字?

    var i 0 function counter for i i lt 100 i setTimeout gt console log i 2000 counter 我想以 2 秒的间隔打印 i 但它立即打印 每次打印调用只需要几微秒 为什
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • 通过 JavaScript 单击按钮/页面提交

    我想了解 asp net 框架如何知道何时单击了按钮 因此一旦收到请求 就会在服务器上触发其单击事件 我需要了解它是如何工作的 因为我想从 JavaScript 触发按钮的服务器单击事件 我能够从 JavaScript 执行页面提交 doc
  • jquery 中的函数返回未定义[重复]

    这个问题在这里已经有答案了 我在 jquery 中调用的函数返回未定义 我检查了该函数 当我对其进行调试时 它返回正确的数据 function addToPlaylist component type add to pl value pl
  • 如何知道 .keyup() 是否是字符键(jQuery)

    如何知道 keyup 是否是字符键 jQuery input keyup function if key is a character such as a b A b c 5 3 2 etc not enter key or shift o
  • ES6 模块范围

    我有代码 lib js var a a export var b b main js console log a a variable is not available in a global scope import b from lib
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • Google 地图 API - 地图未显示 - 没有错误

    我正在尝试将地图从 Google API 加载到 div 中 但是 地图未加载 并且没有输出任何错误 这是代码 google maps var geocoder map function codeAddress address geocod
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • 如何在 React Native 中使用相同的 Firebase 数据库在两个应用程序之间进行通信?

    我有两个不同的应用程序使用相同的实时数据库 在第一个应用程序中 我发送的订单包含一些要保存在数据库中的数据字段 在另一个应用程序中 我只添加一个侦听器 firebase database ref userOrder currentUser
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial

随机推荐

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

    在新一轮新冠疫情爆发后 大众宅在家的时候也变多起来 对于居家清洁的需求也越来越旺盛 人们希望可以从日常的繁琐的家务中解放出来 其中智能扫地机器人就占有一席之地 在市场需求持续走高的催生下 技术也在不断革新换代 根据数据显示 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加密效果例程 这是一种非常