js混淆加密,通过混淆Js代码让别人(很难)无法还原

article/2025/10/3 18:10:13


1、为什么需要js混淆

在web系统发展早期,js在web系统中承担的职责并不多,只是简单的提交表单,js文件非常简单,也不需要任何的保护。

随着js文件体积的增大,为了缩小js体积,加快http传输速度,开始出现了很多对js的压缩工具,比如 uglify、compressor、clouser。。。它们的工作主要是

    · 合并多个js文件

    · 去除js代码里面的空格和换行

    · 压缩js里面的变量名

    · 剔除掉注释

压缩后的代码


虽然压缩工具出发点都是为了减少js文件的体积,但是人们发现压缩替换后的代码已经比源代码可读性差了很多,间接起到了代码保护的作用,于是压缩js文件成为了前端发布的标配之一。但是后来市面上主流浏览器chrome、Firefox等都提供了js格式化的功能,能够很快的把压缩后的js美化,再加上现代浏览器强大的debug功能,单纯压缩过的js代码对于真正怀有恶意的人,已经不能起到很好的防御工作,出现了"防君子不防小人"的尴尬局面。


chrome开发者工具格式化之后的代码


而在web应用越来越丰富的今天,伴随着浏览器性能和网速的提高,js承载了更多的工作,不少后端逻辑都在向前端转移,与此同时也让更多的不法分子有机可乘。在web模型中,js往往是不法分子的第一个突破口。知晓了前端逻辑,不法分子可以模拟成一个正常的用户来实施自己的恶意行为。所以,在很多登录、注册、支付、交易等等页面中,关键业务和风控系统依赖的js都不希望被人轻易的破解,js混淆应运而生。


2、js混淆是不是纸老虎

这是一个老生常谈的问题。实际上,代码混淆早就不是一个新鲜的名词,在桌面软件时代,大多数的软件都会进行代码混淆、加壳等手段来保护自己的代码。Java和.NET都有对应的混淆器。黑客们对这个当然也不陌生,许多病毒程序为了反查杀,也会进行高度的混淆。只不过由于js是动态脚本语言,在http中传输的就是源代码,逆向起来要比打包编译后的软件简单很多,很多人因此觉得混淆是多此一举。

.NET混淆器dotFuscator


其实正是因为js传输的就是源代码,我们才需要进行混淆,暴露在外的代码没有绝对的安全,但是在对抗中,精心设计的混淆代码能够给破坏者带来不小的麻烦,也能够为防守者争取更多的时间,相对于破解来说,混淆器规则的更替成本要小得多,在高强度的攻防中,可以大大增加破解者的工作量,起到防御作用。从这个角度来讲,关键代码进行混淆是必不可少的步骤。


3、如何进行js混淆

js混淆器大致有两种:

· 通过正则替换实现的混淆器

· 通过语法树替换实现的混淆器

第一种实现成本低,但是效果也一般,适合对混淆要求不高的场景。第二种实现成本较高,但是更灵活,而且更安全,更适合对抗场景,我这里主要讲一下第二种。基于语法层面的混淆器其实类似于编译器,基本原理和编译器类似,我们先对编译器做一些基本的介绍。


名词解释

token: 词法单元,也有叫词法记号的,词法分析器的产物,文本流被分割后的最小单位。

AST: 抽象语法树,语法分析器的产物,是源代码的抽象语法结构的树状表现形式。

编译器VS混淆器


编译器工作流程

简单的说,当我们读入一段字符串文本(source code),词法分析器会把它拆成一个一个小的单位(token),比如数字1 是一个token, 字符串'abc'是一个token等等。接下来语法分析器会把这些单位组成一颗树状结构(AST),这个树状结构就代表了token们的组成关系。比如 1 + 2 就会展示成一棵加法树,左右子节点分别是token - 1 和token - 2 ,中间token表示加法。编译器根据生成的AST转换到中间代码,最终转换成机器代码。

对编译器更多细节感兴趣的同学可以移步龙书:编译原理


混淆器工作流程

编译器需要把源代码编译成中间代码或者机器码,而我们的混淆器输出其实还是js。所以我们从语法分析之后往下的步骤并不需要。想想我们的目标是什么,是修改原有的js代码结构,在这里面这个结构对应的是什么呢?就是AST。任何一段正确的js代码一定可以组成一颗AST,同样,因为AST表示了各个token的逻辑关系,我们也可以通过AST反过来生成一段js代码。所以,你只需要构造出一颗AST,就能生成任何js代码!混淆过程如上右图所示

通过修改AST生成一个新的AST,新的AST就可以对应新的JavaScript代码。


规则设计

知道了大致的混淆流程,最重要的环节就是设计规则。我们上面说了,我们需要生成新的AST结构意味着会生成和源代码不一样的js代码,但是我们的混淆是不能破坏原有代码的执行结果的,所以混淆规则必须保证是在不破坏代码执行结果的情况下,让代码变得更难以阅读。

具体的混淆规则各位可以自行根据需求设计,比如拆分字符串、拆分数组,增加废代码等等。

参考:提供商业混淆服务的jscramble的混淆规则


实现

很多人看到这里就望而却步,因为词法分析和文法分析对编译原理要求较高。其实这些现在都有工具可以帮助搞定了,借助工具,我们可以直接进行最后一步,对AST的修改。

市面上JavaScript词法和文法分析器有很多,比如其实v8就是一个,还有mozilla的SpiderMonkey, 知名的esprima等等,我这里要推荐的是uglify,一个基于nodejs的解析器。它具有以下功能:

    · parser,把 JavaScript 代码解析成抽象语法树

    · code generator,通过抽象语法树生成代码

    · scope analyzer,分析变量定义的工具

    · tree walker,遍历树节点

    · tree transformer,改变树节点

对比下我上面给出的混淆器设计的图,发现其实只需要修改语法树 这一步自己完成。


实例

说了这么多,可能很多人还是一头雾水,为了帮助各位理解,我准备了一个简单的例子,假设我们的混淆规则是想把 var a = 1; 中的数字1换成16进制,我们该如何设计混淆器呢。首先对源代码做词法分析和语法分析,uglify一个方法就搞定了,生成一颗语法树,我们需要做的就是找到语法树中的数字然后修改成16进制的结果,如下图所示:

实例代码:

var UglifyJS = require("uglify-js");

var code = "var a = 1;";

var toplevel = UglifyJS.parse(code); //toplevel就是语法树

var transformer = new UglifyJS.TreeTransformer(function (node) {

if (node instanceof UglifyJS.AST_Number) { //查找需要修改的叶子节点

        node.value = '0x' + Number(node.value).toString(16);

        return node; //返回一个新的叶子节点 替换原来的叶子节点

    };

});

toplevel.transform(transformer);  //遍历AST树

var ncode = toplevel.print_to_string(); //从AST还原成字符串

console.log(ncode); // var a = 0x1;


上面的代码很简单,首先通过parse方法构建语法树,然后通过TreeTransformer遍历语法树,当遇到节点属于UglifyJS.AST_Number类型(所有的AST类型见ast),这个token具有一个属性 value 保存着数字类型的具体值,我们将其改成16进制表示,然后 return node 就会用新的节点代替原来的节点。


效果展示

贴一个我自己设计的混淆器混淆前后代码:


4、混淆对性能的影响

由于增加了废代码,改变了原有的AST,混淆对性能肯定会造成一定的影响,但是我们可以通过规则来控制影响的大小。

    · 减少循环混淆,循环太多会直接影响代码执行效率

    · 避免过多的字符串拼接,因为字符串拼接在低版本IE下面会有性能问题

    · 控制代码体积,在插入废代码时应该控制插入比例,文件过大会给网络请求和代码执行都带来压力


我们通过一定的规则完全可以把性能影响控制在一个合理的范围内,实际上,有一些混淆规则反而会加快代码的执行,比如变量名和属性名的压缩混淆,会减小文件体积,比如对全局变量的复制,会减少作用域的查找等等。在现代浏览器中,混淆对代码的影响越来越小,我们只需要注意合理的混淆规则,完全可以放心的使用混淆。


5、混淆的安全性

混淆的目的是保护代码,但是如果因为混淆影响了正常功能就舍本逐末了。

由于混淆后的AST已经和原AST完全不同了,但是混淆后文件的和原文件执行结果必须一样,如何保证既兼顾了混淆强度,又不破坏代码执行呢?高覆盖的测试必不可少:

    · 对自己的混淆器写详尽的单元测试

    · 对混淆的目标代码做高覆盖的功能测试,保证混淆前后代码执行结果完全一样

    · 多样本测试,可以混淆单元测试已经完备了的类库,比如混淆 Jquery 、AngularJS 等,然后拿混淆后的代码去跑它们的单元测试,保证和混淆前执行结果完全一样


 总结


    · 可信web系统是我们的愿景

    · 可信web系统离不开可信的前端环境

    · js混淆在对抗中必不可少

    · 实现一款自己的混淆器并没有那么难

    · 混淆器对性能的影响是可控的

本文节选自文章可信前端之路-代码保护》,作者:莫念@阿里安全



http://chatgpt.dhexx.cn/article/1JqIxaMF.shtml

相关文章

某网站JS加密、OB混淆与CSS反爬实战分析

1. 写在前面 最近一段时间接触了一些小说网站的业务。发现很多的小说网站,甚至一些小站它们的安全防护措施做的都很到位!例如上次说到的的五秒盾也是存在于一个小说小站。今天要讲的这个网站它集JS加密、ob混淆、CSS反爬于一体 目标站点: aH…

前端JavaScript代码混淆加密原理介绍

因为JavaScript大都是运行在浏览器端,这就导致任何人都可以直接对网站的代码进行查看,如果代码没有进行任何处理就会导致直接暴露源码,他人便可轻而易举的复制你的劳动成果,但是由于没有纯粹的加密方案,所以能做的就是让代码变得更加的难以阅读,他人难以…

JS常见加密混淆一览

参考文章: https://www.cnblogs.com/guyouyin123/p/13804700.html 常见js混淆加密 JSFUCKAAEncodeJJEncode JSFUCK 特征为由[]{}()!组成的看不懂的代码 AAEncode 俗称aa混淆,特征为网络表情符号 JJEncode jj混淆,特点是特别多的$混淆 虽然…

JS常见加密混淆方式

目录 前端js常见混淆加密保护方式 eval方法等字符串参数emscriptenWebAssemblyjs混淆实现 JSFuckAAEncodeJJEncode代码压缩变量名混淆字符串混淆自我保护,比如卡死浏览器控制流平坦化僵尸代码注入对象键名替换禁用控制台输出调试保护,比如无限Debug,定时…

JS逆向之常见编码和混淆加密方式(一)

一般情况下,js的代码加密用来加密混淆代码,降低代码的可读性,如果一段没有经过任何加密混淆的代码,很容易被第三方或者脚本破解利用,引发许多的安全问题,本文将从以下多个角度讲解,代码加密的一…

最常用的js混淆加密解

JS混淆加密是一种用于保护JS代码的技术,它能够将代码变得难以理解和修改,从而提高代码的安全性。但是,当我们需要修改和维护这些代码时,我们就会面临困难。因此,在某些情况下,我们需要解这些JS代码。 下面…

PS操作小技巧

PS操作小技巧 如何查看psd文件指定图层图片的大小? 如何查看psd文件指定图层图片的大小? 首先你需要找到你的指定图层:点击小眼睛 然后再配合使用**Ctrl 左键 ** 这个时候图片会被选中,效果如下:

PS的简单操作!

PS的简单操作! ctrld:取消选择区域的线、 ctrlr:标尺线、 ctrlaltz:返回最初步骤、 ctrlz:返回上一步、 注:在有交叉线处,按alt键可以拖出以“交叉点”为中心的“矩形”或者“椭圆”如果想使矩形变正方形,椭圆变圆形则altshift键。…

PhotoShop 基本操作介绍, 附带图文解说

一篇适合小白学习的教程,主要介绍PS的界面和基本操作,及分享一些常用的快捷键。 首次打开PS首先需要修改PS内的预设值 ①打开常规面板(也可以在菜单栏里打开,windows电脑在“文件菜单”下点击“常规”快捷键ctrl+k) <点图片看大图>www.16xx8.com 性能一般设为70%,…

简单的ps

1、快捷键 command n 创建文档 f7 图层 M 选框工具 v 移动工具 Command j 提取图层 shift f5 填充颜色 Ctrl t 自由变换尺寸 Ctrl 选中多个图层一起移动 Shift 选中多个图层可以选择连接 Alt 可以单看蒙版 ctrl d 取消选择 ctrl i 反选 2、注意事项 1、蒙版…

PS(一)PS基础从0开始,感兴趣的可以来看看

目录 一、PS基础知识和操作 2、调整页面 界面是不是太繁琐了 在右上角有个小列表&#xff08;我已经给大家标出来了&#xff09;点开有个关闭选项卡组&#xff0c;点击一下界面就会简洁了 ​编辑 有的界面打开少了什么工具啊可以点击窗口-工作区-复位基本功能 3、认识基本的位…

PS~了解PS的第一步,基本操作

1、PS如何新建画布 ①选择文件—新建—修改参数—确定 ②CtrlN 新建的快捷键—修改参数—确定 名称&#xff1a;自己修改宽高&#xff1a;自己修改&#xff0c;我们通常使用像素来定义分辨率&#xff1a;72颜色模式&#xff1a;RGB背景&#xff1a;自己选择白色或者透明 2、在…

PS_01_基本操作

贺叶铭_PS公开课_笔记 ctrl shift u :去掉颜色,去色 ctrl i 直接填充该选区的颜色的补色 例如&#xff1a; 第一天&#xff1a; 界面构成 1 菜单栏 2 工具箱 3 工具属性栏 4 悬浮面板 5 画布 ctrl N 新建对话框&#xff08;针对画布进行设置&#xff09; 如果只说数…

PS基本操作介绍与下载

文章目录 学习视频教程pj版PS下载 以及 视频教程相关素材链接Photoshop基本使用PS界面组成&#xff1a;图层操作(重点)图层编组图层上下位置移动Photoshop 切图切片工具辅助线和切片使用及清除切图插件 学习视频教程 http://2565.replace.favo.tyouai.com/ pj版PS下载 以及 视…

photoShop日常操作教程、PS

目录 提亮 改背景色 替换颜色 智能抠图并更换背景色 提亮 打开或者拖入一张照片复制原图片&#xff1a;CommandJ&#xff08;MacOS上的快捷键&#xff0c;Windows是CtrlJ&#xff09;提取高亮&#xff1a;Commandalt2&#xff08;MacOS上的快捷键&#xff0c;Windows是Ctrla…

PS基础操作及常用快捷键

文章目录 1. PS界面2. PS基础操作3. 图层4. 填充颜色5. 选框工具6. 自由变化 ctrlT7. 常用快捷键 1. PS界面 窗口菜单&#xff1a;管理&#xff08;显示/隐藏&#xff09;工具栏、属性栏、面板 将ps界面恢复到初始状态&#xff1a;窗口——工作区——复位基本功能自定义窗口设…

PS-简单操作工具介绍

PS有历史记录&#xff0c;可以返回之前的操作 图像的放大缩小可以使用&#xff1a;Ctrl &#xff0c;ctrl - 选中图层后&#xff0c;按住“alt”&#xff0c;用鼠标拖动可以实现图层复制 目录 调整输出图像的尺寸 多图拼接 3D模式 选区工具 裁减工具 套索工具 钢笔工…

PS知识点大总结(一)——基础操作

PS的界面&#xff1a; 菜单栏、属性栏、工具栏、编辑区、活动面板 PS的功能&#xff1a; 图像处理&#xff08;影楼后期、人像修复美化&#xff09;&#xff1b;排版&#xff08;书籍、杂志、喷绘、广告&#xff09;&#xff1b;网页、APP版面设计。 PS版本&#xff…

PS基础概念和操作

PS基础概念和操作 1、基础概念(1) 色彩空间RGB --> HSB/HSVRGB --> HSL (2) 相邻色和互补色(3) 混合模式 2、基础操作&#xff08;1&#xff09;选区、通道和蒙版的相互转换&#xff08;2&#xff09;HSL面板调色 3、基础功能&#xff08;1&#xff09;皮肤美白调色&…

Photoshop(PS)基础操作

♥️作者&#xff1a;奇妙的大歪 ♥️个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01; ♥️个人简介&#xff1a;云计算网络运维专业人员 目录 &#xff08;一&#xff09;ps的基础操作 &#xff08;二&#xff09;画布操作 &#xff08;三&#xff09;图层基…