js混淆 webpack-obfuscator

article/2025/8/15 21:00:51

js混淆之webpack-obfuscator

混淆是什么

混淆是故意制造混淆代码的行为,即让人难以理解的源代码,类似于加密,但计算机能够识别理解代码并且执行它。混淆可以用来隐藏来自外部世界的业务逻辑,也可以实现压缩。

简单的原理:使用工具对JS进行一下AST(抽象语法树)分析、修改,再重新根据AST生成JS。

混淆的使用场景

1、第三方公司使用公司软件,使用这个插件可以保护源码,它会在源码中加入废代码段,字符编码转义使构建代码完全混淆,达到无法恢复源码甚至无法阅读的目的。

2、防止web攻击,很多web攻击都是通知直接debug业务逻辑找到漏洞进行攻击,通过进行代码混淆,源码达到无法阅读后,业务逻辑的代码就不会被破解。

混淆与压缩的区别

压缩:删除JavaScript代码中的注释、跳格符号、换行符号以及无用的空格,从而压缩JS文件大小,优化页面加载速度。

混淆:经过编码将变量和函数原命名改为毫无意义的命名,以防止他人窥视和窃取JavaScript源码,也有一定压缩效果。

举个例子…

上面代码经过webpack5自带的js压缩功能后生成的代码如下:

然后经过使用webpack-obfuscator插件混淆之后的代码如下:

从上面这个例子我们可以看出,经过使用混淆插件之后webpack打包生成的代码是跟源码不一样了的,它将源码编码成了我们难以阅读或者说是根本阅读不下去的代码,而且它也会对代码进行压缩,具有一定的压缩功能。

如何验证webpack-obfuscator对代码具有压缩功能?

可以将webpack的mode设置为development,当设置为开发模式的时候webpack对js的自动压缩功能(UglifyJS Webpack Plugin)就会被关闭,这个时候你再通过npm run build打包项目,你会发现代码还是被压缩过的。

webpack-obfuscator插件使用与loader使用的场景

根据官网的提示我们可以知道,我们最好只混淆我们自己写的代码,向第三方插件库的代码是不建议混淆的,因为混淆后的代码要比原来的要慢15-80%,而且第三方插件的文件非常大。

webpack-obfuscator插件的使用场景

当你计划将代码和第三方代码拆分为不同的捆绑包时可以使用webpack-obfuscator插件的形式。

// webpack plugin配置
plugins: [new JavaScriptObfuscator({rotateStringArray: true}, ['abc.js'])
]

webpack-obfuscator loader的使用场景

有时你需要输出单个js包,但仍需要混淆某个特定模块的源代码。在这些情况下,加载器可以做到这一点。在webpack配置中定义规则,并使用obfuscator-loader作为模块的最后一个加载器。你可以添加enforce: 'post'标志以确保在正常加载器之后调用obfuscator-loader。

var WebpackObfuscator = require('webpack-obfuscator')//...
// webpack 加载器配置
rules: [{test: /\.js$/,exclude: [ path.resolve(__dirname, 'excluded_file_name.js') ],enforce: 'post',use: { loader: WebpackObfuscator.loader, options: {rotateStringArray: true}}}
]

主要配置项

{// 压缩,无换行compact: true,// 是否启用控制流扁平化(降低1.5倍的运行速度)controlFlowFlattening: false,// 应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。controlFlowFlatteningThreshold: 0.75,// 随机的死代码块(增加了混淆代码的大小)deadCodeInjection: false,// 死代码块的影响概率deadCodeInjectionThreshold: 0.4,// 此选项几乎不可能使用开发者工具的控制台选项卡debugProtection: false,// 如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。debugProtectionInterval: false,// 通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试  器的使用更加困难。disableConsoleOutput: false,//锁定混淆的源代码,使其仅在特定域和/或子域上运行。这使得某人只需复制并粘贴您的源代码并在其他地方运行就变得非常困难。domainLock: [],//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)identifierNamesGenerator: 'hexadecimal',//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀identifiersPrefix: '',inputFileName: '',// 允许将信息记录到控制台。log: false,// 是否启用全局变量和函数名称的混淆renameGlobals: false,// 禁用模糊处理和生成标识符reservedNames: [],// 禁用字符串文字的转换reservedStrings: [],// 通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。rotateStringArray: true,// 混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;seed: 0,selfDefending: false,sourceMap: false,sourceMapBaseUrl: '',sourceMapFileName: '',sourceMapMode: 'separate',// 删除字符串文字并将它们放在一个特殊的数组中(多用于对密钥字符串的混淆)stringArray: true,// 编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。		      true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。stringArrayEncoding: false,// 调整字符串文字将插入stringArray的概率stringArrayThreshold: 0.75,// 您可以将混淆代码的目标环境设置为以下之一:Browser;Browser No Eval;Nodetarget: 'browser',// 是否启用混淆对象键transformObjectKeys: false,// 允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。unicodeEscapeSequence: false
}

使用的时候注意事项

安装 webpack-obfuscator 时要注意webpack-obfuscator的版本要与本地项目 webpack 版本相匹配,如果不匹配会报错无法使用。以及webpack-obfuscator在不同版本下的使用方式也会有所差异,需要注意不同版本下的配置方式。每个webpack适配的webpack-obfuscator版本详情,可去webpack-obfuscator git官网的tags的package.json上进行详细查看。

下面是一些常见webpack版本的安装方式:

webpack5的安装方式

npm install --save-dev javascript-obfuscator webpack-obfuscator

webpack4的安装方式

npm install --save-dev javascript-obfuscator webpack-obfuscator@2.6 

webpack3.4.1的安装方式

npm install --save-dev javascript-obfuscator@0.10.0 webpack-obfuscator@0.10.0

PS:webpack3.4.1使用webpack-obfuscator可能会报node版本太高的问题,需要降低node版本

如何验证混淆成功了

1、查看打包后的代码是否达到无法恢复源码甚至无法阅读的效果。

2、创建一个本地代理转发服务器,验证项目是否能正常运行,功能是否完整。


http://chatgpt.dhexx.cn/article/pRIrjdo7.shtml

相关文章

使用AST进行JavaScript反混淆(2022年增值税发票查验js)

背景 多年前学过龙书,一来当时本身也没看懂,二来时间也长也差不多都忘记了。直到最近有 deobfuscate 问题才看了下AST。 说实话,一旦稍微了解AST和熟悉了 Babel 接口,deobfuscate 实在不是啥难事。 反混淆总结放前面。 注意事…

html混淆压缩,JavaScript的压缩和混淆

JavaScript的压缩和混淆 我们都知道JavaScript是一种在客户端浏览器中执行的解释型语言。浏览器以纯文本的形式下载JavaScript,然后在需要的时候执行JavaScript代码。 通过使用浏览器的查看源代码功能,用户总是能够阅读JavaScript的源代码,该…

安卓混淆及反编译工具

目录 安卓混淆及反编译工具... 1 Eclipse编译混淆... 2 项目文件project.properties. 2 服务器编译混淆... 2 Android.mk. 2 混淆规则... 3 Java代码的混淆... 3 Proguard混淆规则汇总... 3 Native的混淆... 4 资源文件的混淆... 4 混淆的常见配置... 4 哪些不应该…

一款JavaScript 混淆(Obfuscator)工具(Tool)的研究(一)

1.研究使用的工具及网站 https://obfuscator.io 主要研究对象,主要是研究此网站的各种混淆方法及破解办法。 http://jsnice.org/ 用来格式化代码,方便调试。 notepad 编辑代码。 某浏览器 具有谷歌内…

stm32与sim900之GPRS通信(电脑串口与SIM900通信)

注意: 1 sim900在进行GPRS通信的时候最大电流可以到90MA.瞬间电流SIM900模块可能高达2A4V,即输入端电流瞬间值可能高达740mA12V,故给模块选择电源的时候,要能满足瞬间电流峰值。 以上这段话摘录自正点原子的SIM900用户手册,也就是说你在用SI…

GSM模块(SIM900)详解

GSM模块(SIM900) 0. GSM概述1. 常用的GSM模块2. SIM900系列3. STM32使用SIM900系列通信方法AT指令示例代码 0. GSM概述 GSM(全球系统移动通信)是一种数字移动通信技术,是世界上最常用的移动通信标准之一。它是由欧洲电…

常见的防火墙技术介绍

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt280 防火墙是一个系统或一组系统,它在内网与Internet间执行一定的安全策略。典型的防火墙应包含如下模块中的一个或多个:包过滤路由器、应用层网关(或代理服务器…

linux平台下防火墙iptables原理

转载自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html linux平台下防火墙iptables原理(转) iptables简介 netfilter/iptables(简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包…

简述防火墙

什么是防火墙? 在遭受入侵时,做内外网隔离的策略叫做防火墙。 防火墙分类 按物理特性划分:软件防火墙、硬件防火墙;按性能划分:百兆级防火墙、千兆级防火墙……按防火墙结构划分:单一主机防火墙、路由集…

【计算机基础】防火墙

工程师CCNAHCIA 资深工程师CCNPHCIP 技术专家CCIEHCIE IPS:入侵防御系统,发现攻击和入侵进行阻断IDS:入侵检测系统,检测有无攻击漏洞扫描:发现本地服务器/PC,存在哪些中高低危的风险,解决漏洞…

下一代防火墙概述

目录 1.防火墙概述 1.1定义 1.2防火墙分类 1.3防火墙功能 1.4防火墙的策略 2.防火墙发展史 2.1 包过滤防火墙:一个严格的规则表 2.2 应用代理防火墙:为每个应用添加代理 2.3 状态检测防火墙:建立会话表 2.4 入侵检测系统&#xff0…

上海交通大学考研复试模块小结——防火墙技术

既然上次开了这个系列,索性就把这个信息安全这一块的主流技术都介绍一遍好了。上篇博客讲了密码学,今天就来说说防火墙技术。 防火墙技术 防火墙技术是位于两个新人程度不同的网络之间的软件或者硬件设备的组合,实质上是一种控制隔离技术。…

防火墙入门实验

第一章 iptable的使用 一、实验原理 1.1 Iptables Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的。 可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配&#xf…

NAT和防火墙

网络地址翻译没文化的酒鬼 防火墙和NAT NAT路由器是安装了NAT软件的路由器,拥有至少一个全球通用的外部IP。 在计算机网络中,NAT最直接的作用是IP映射:将内网终端A的IP和端口号经过NAT映射后,转成公网服务器B的IP和新端口号&am…

快速了解防火墙

快速了解防火墙 防火墙是一种由计算机硬件和软件组成的系统,部署于网络边界,是连接内部网络和外部网络(或内部网络不同安全级别的部门)之间的桥梁,同时对进出网络边界的数据进行保护,防止恶意入侵、恶意代码的传播等,…

防火墙概述

AC是为了防御从内网到外网的攻击防火墙是为了防御从外网到内网的攻击 防火墙的定义 防火墙通常用于两个网络之间的隔离 主要用于保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为路由器与交换机的本质是转发,防火墙的本质是控制和防护 防火墙的工…

防火墙(firewall)

前言 计算机的安全性历来就是人们热衷的话题之一。而随着Internet的广泛应用,人们在扩展了获取和发布能力的同时也带来信息被污染和破坏的危险。这些安全问题主要是由网络的开放性、无边界性、自由性造成的,还包括以下一些因素。 1. 计算机操作系统本身…

华为防火墙的学习

防火墙 - 含义和定义 什么是防火墙? 防火墙的工作原理 防火墙的区域: 包过滤防火墙----访问控制列表技术---三层技术 代理防火墙----中间人技术---应用层 状态防火墙---会话追踪技术---三层、四层 UTM---深度包检查技术----应用层 下一代防火墙 防火墙的…

潘多拉 STM32L475 VE——开发板学习 (持续更新)

首先就是开发板的各个硬件的介绍: ◆ MCU : STM32L475VET6 , LQFP100 , SRAM : 128K , FLASH : 512K ◆ 外扩 SPI FLASH : W25Q128 , 16M 字节 ◆ 1 个电源指示灯…