JavaScript高手进阶:详解Eval加密

揭晓eval(function(p,a,c,k,e,r)js代码解密加密程序 最近大雄搜集站,在弄改一个wp网站侧边栏的小工具就发现了,JS的代码脚本很乱,不是常规写法,后来查阅发现是由于JS加密造成的,我对这种事情很不理解,有一些既然是选择开源了,为啥JS还加密。走你,那就一起一波骚操作解密它。 首先如果你发现你的JS是以eval(function(p,a,c,k,e,r){e=function©…等开头的,说明是加密了。我碰到加密的代码如图: 解密方法步骤如下: 1.打开编辑器新建html页面,将下面代码复制到网页中的body标签中间,代码如下: <script> 阅读详情

在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代码的不可逆加密。有兴趣的朋友,可以翻看那篇文章。

爬虫 Web Js 逆向:常用的混淆、编码、加密介绍 爬虫 Web Js 逆向:常用的混淆、编码、加密介绍注:代码混淆本质是对代码标识符和结果的调整,从而达到不可读不可调试的目的。注:参数加密方法有的可解密,有的不可解密。 阅读详情

相关推荐

PHP实现eval加密算法(附完整源码)

PHP实现eval加密算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 397

js函数eval()

eval() 是 JavaScript 中的一个全局函数,它可以将传入的字符串当作 JavaScript 代码来执行。其中,string 是要执行的 JavaScript 代码字符串。eval() 函数会返回最后一个表达式的结果。

温暖前端的博客 5121

JavaScript实现eval函数功能(附完整源码)

JavaScript实现eval函数功能(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 717

JavaScript 之 eval 详解

其实即便带有变量,JavaScript也是可以直接计算的,但是如果你现在只想声明一个带有变量的表达式,但是想稍后进行运算(你有可能在声明这个带有变量的运算式之后还有可能对里面的变量进行修改),就可以使用eval。比如,假如你有一个变量 x ,你可以通过一个字符串表达式来对涉及x的表达式延迟求值,将 “3 * x + 2”,存储为变量,然后在你的脚本后面的一个地方调用eval()。eval()的运行效率也普遍的比其他的替代方案慢,因为他会调用js解析器,即便现代的JS引擎中已经对此做了优化。

subsistent的博客 2178

JavaScript中的eval系列解密程序

在JavaScript中,eval函数和相关的eval系列函数是非常强大的工具,它们允许开发人员在运行时动态执行字符串中的代码。在本文中,我们将探讨eval系列函数的用法,并提供一些技巧和注意事项,以帮助您编写安全且高效的JavaScript代码。在JavaScript中,eval函数和相关的eval系列函数是非常强大的工具,可以在运行时执行动态代码。与eval函数不同,Function构造函数创建的函数在其自己的作用域中执行,而不是在调用它的作用域中执行。然后,我们调用该函数,输出了x和y的和。

CodeWhizZ的博客 221

JavaScript中eval函数解密与加密技术详解

在JavaScript中,eval()函数是一个强大且具有争议性的特性,它允许在运行时将字符串作为JavaScript代码进行动态执行。这种机制在早期Web开发中被广泛用于实现灵活的脚本加载、表达式求值以及插件系统构建。然而,随着Web应用安全意识的提升,eval()因其可能引入的代码注入风险和性能瓶颈而备受争议。在现代前端工程中,eval()常被用于加密与混淆JavaScript代码,以防止源码泄露或逆向工程。通过将原始代码转换为不可读字符串,并在运行时使用eval()

weixin_36369848的博客 1319

de4js JavaScript反混淆工具:从加密迷雾到清晰源码的实战指南

你是否曾经面对过一堆被混淆的JavaScript代码,感觉像是在看天书?那些经过Packer、JSFuck等工具加密的代码,不仅难以阅读,更让调试和维护变得异常困难。今天,让我们一起探索de4js这个开源工具,它将帮助你轻松解密各种混淆的JavaScript代码,恢复代码的可读性和可维护性。 ## 问题场景:当你遇到这些加密代码该怎么办? ### 场景一:eval加密的代码让你无从下手? 想

gitblog_00571的博客 752

MobileNet V3 图像分类

MobileNet V3

Henry的博客 1768

JavaScript奇技淫巧:反Eval调试

如何反eval调试、防止代码被eval执行? 我们可以在函数中抛出一个错误并捕获其堆栈跟踪,进而来检查调用栈中是否包含eval,便可识别是否是被eval调试,并可做出相应的操作。

w2sft的博客 1129

Hyper-V虚拟机 安装 银河麒麟V10桌面版

如何在windows 11 Hyper-V 虚拟机中 安装 银河麒麟V10桌面版。

m0_46756112的博客 3419

用Python turtle库 绘制皮卡丘

Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。 turtle基础知识参考: https://gitchat.blog.youkuaiyun.com/article/details/90696190 https://blog.csdn.ne...

qq_36295856的博客 2万+

在分析前端js中,Eval加密解密、js混淆概念及其破解

前端虽然开源, 但是由于前端代码量很多,也有一些特殊的保护代码的方法,其中Eval、js混淆是常用的方式,但是在大的互联网产品上用得很少,因为前端加密(RSA、AES、MD5等)是为了保证数据传输中的安全性,而非要让人难以模仿数据传输请求。 而前端中的js混淆、eval对于专业的人来说形同虚设,所以也没必要做混淆和eval,并且对于代码维护是及其不利的,所以在接触的百度、腾讯、京东的一些产品上没遇...

python之战 2122

【实战解析】SAP EWM与PP深度集成:从后台配置到前台物料流转的全链路设计

本文深入解析SAP EWM与PP深度集成的全链路设计,涵盖后台配置与前台物料流转的实战应用。通过两种集成模式(DPI与API)的选择策略、十二个关键后台配置步骤详解,以及PMR生成、PSA补货等前台演示,帮助企业实现生产计划与物料供应的高效协同,显著提升生产效率和库存周转率。

weixin_30723433的博客 421

JavaScript-前端加密(广义),防止js篡改

好久没有写博客了,不是没有在学习新东西,是最近比较忙,没有总结。 今天聊的话题是防止js篡改。javascript代码和需要编译的代码有一点不同是,网页上会直接请求js文件源码,而编译的语言运行时使用的是编译后的文件。即使这样,很多编译语言(比如java)都会做源码混淆(obfuscation),前端这样的纯文本应用,更需要做点什么保护我们的逻辑代码不被篡改和窥探。 防止js篡改的原理也很简单,

柒青衿的博客 2万+

数字孪生驱动的城市地下管网智能运维与应急处置决策支持系统

上海市城市数字化中心的数据实践显示,通过关联分析管网材质与故障率的关系,将铸铁管更换周期从15年优化至8年(李敏,2021)。环境效益方面,上海市通过优化管网运行参数,年减少碳排放1.8万吨,相当于种植36万棵乔木。数字孪生与物理设备的双向交互采用OPC UA协议实现,某次天津管网渗漏事件中,系统通过实时数据反馈,指导现场人员调整注浆方案,将修复时间从48小时压缩至16小时。虚拟指挥沙盘支持多视角协同,深圳水务系统的实践表明,通过AR可视化技术,跨部门会议效率提升60%,方案决策时间缩短40%。

2501_92431686的博客 1425

【AAAI 2025】轻量级特征增强新范式!FCM 模块助力小目标检测,即插即用提升模型泛化能力

本文介绍了AAAI 2025提出的轻量级特征增强新范式FCM模块,它通过显式分离并双向交互语义与空间特征,有效解决了小目标检测中特征信息失配的核心难题。该模块设计精巧,计算开销极低,能够即插即用式地嵌入YOLO等主流检测网络,显著提升模型对小目标的泛化检测能力,尤其适用于遥感、自动驾驶等对计算资源敏感的实际场景。

weixin_29056145的博客 287

JavaScript奇技淫巧:32进制加密

本书向您分享一系列新奇、有趣、有技术含量的,特别是很多侧重于代码安全、混淆加密的JavaScript编程技术,十分推荐JavaScript程序员阅读。这是使用toString(进制)方法将一个数字转换为指定进制的字符串表示,在上面的例子代码中,进制是32,这意味着数字会被转换成32进制的字符串。但eval本身字符串是个非常明显的特征,太容易被检索,然后替换成console.log、alert,从而实现逆向、得到eval执行的内容。扩展的思考,这个方法,除了可用于隐藏eval,当然也可以隐藏其它的方法。

w2sft的博客 963

android 如何分析应用的内存(十六)——使用AS查看Android堆

在前面,先介绍了如何使用jdb和VS code查看应用栈相关内容。本文将介绍,如何查看堆中的内容。

安仔的博客 4254

JS混淆加密:Eval的未公开用法

对JS代码混淆加密时,语法关键字是很难隐藏的,就如console.log,一般情况下可能变化为:console[“log”],或者console[“\x6c\x6f\x67”],log字符可以变化,但console作为语法关键字,是不可变的,这就容易被识别。 而eval的这种未公开用法,恰好可以解决这一问题。可以隐藏很多语法关键字。

w2sft的博客 443

Android/Linux驱动开发:使用dev_dbg进行设备驱动调试

在本文中,我们将介绍如何使用dev_dbg宏和相关的函数来进行设备驱动调试。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。的结构体指针,其中包含了我们定义的文件操作函数。的结构体指针,其中包含了我们定义的文件操作函数。在上面的示例中,我们首先通过调用。在上面的示例中,我们定义了。在上面的示例中,我们定义了。

ByteKnight的博客 372

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

前端面试必考:JS中eval()解析、为什么不要使用eval?

首先,eval函数的作用是在当前作用域中执行一段JavaScript代码字符串,如下代码段1://代码段1 varfoo=1; functiontest(){ varfoo=2; eval('foo=3'); returnfoo; } test();//3 foo;//1但是 eval 只在被直接调用并且调用函数就是 ev...

weixin_34138521的博客 1287

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

js混淆、eval解密

js中的eval()方法就是一个js语言的执行器,它能把其中的参数按照JavaScript语法进行解析并执行,简单来说就是把原本的js代码变成了eval的参数,变成参数后代码就成了字符串,其中的一些字符就会被按照特定格式“编码”,像下面: var showmsg="粘贴要加密/解密的javascript代码到这里";if(1==1){ alert(showmsg);} eval加密:...

weixin_33739646的博客 427

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

javascript eval加密和解密源码

javascript eval加密和解密源码

大鹏的专栏 4608

爬虫---js逆向解析中的eval包裹函数的处理

js破解中的eval包裹函数的处理首先描述问题现象第一种方式第二种方式想练手的还可以尝试这个网站 首先描述问题现象 解析网站 http://eip.chanfine.com/login.jsp 的 j_password 生成方式 很显现加密的函数就是 desEncrypt(),我们再搜索desEncrypt, 就发现加密的secunity.js,这个js是由eval()函数包裹着的,我们发现根...

it_is_arlon的博客 1757

EVAL在线加密解密JS工具

JS写的EVAL在线加密解密工具,可以为代码加密解密隐藏代码;能够快速破解网站EVAL加密的脚本,在自己的网站/博客作为一个款在线工具,方便自己以及方便其他需要的网友,这个本身就是用JS来写的,水平高的请自行修正。 eval解密/加密在线工具 a=62; function encode() { var code = document.getElementById('code')

1861

JavaScript Eval Encode/Decode JavaScript 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};wh.

mmz8的专栏 4767
上一篇: JavaScript黑暗技巧:变异的Eval
下一篇: JavaScript黑魔法:不可阻止的“自动下载”
w2sfot
博客等级 码龄7年 1173粉丝 466原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值