【导语】:一个开源的代码混淆器,能将 JS 代码混淆成可读性低的代码。

简介

JavaScript Obfuscator 是一款功能强大的免费 JavaScript 混淆器,包含多种功能,能将代码混淆成可读性低的代码,看上去是难以阅读的代码,其实具备和之前代码一样的功能,从而起到保护代码的作用。

原代码:

function hi() {console.log("Hello World!");
}
hi();
复制代码

混淆后代码:

function _0x5737(){var _0x3de046=['13797910djQtgr','202NzEpzv','2273TLhUKk','6976590XeTkcs','4633335tPFIvf','460SzVdaa','1260225mbbZER','49056QtXjli','1736NJoeHX','42116DYgHBM'];_0x5737=function(){return _0x3de046;};return _0x5737();}function _0x5e71(_0x1e04fb,_0x168fdd){var _0x57378a=_0x5737();return _0x5e71=function(_0x5e7194,_0x30106f){_0x5e7194=_0x5e7194-0xb6;var _0x3c5c20=_0x57378a[_0x5e7194];return _0x3c5c20;},_0x5e71(_0x1e04fb,_0x168fdd);}(function(_0x41d572,_0x45db5e){var _0x306ede=_0x5e71,_0x408f15=_0x41d572();while(!![]){try{var _0x4c3c37=-parseInt(_0x306ede(0xbb))/0x1*(parseInt(_0x306ede(0xba))/0x2)+-parseInt(_0x306ede(0xbd))/0x3+parseInt(_0x306ede(0xb8))/0x4*(parseInt(_0x306ede(0xbe))/0x5)+-parseInt(_0x306ede(0xbc))/0x6+-parseInt(_0x306ede(0xb6))/0x7*(-parseInt(_0x306ede(0xb7))/0x8)+-parseInt(_0x306ede(0xbf))/0x9+parseInt(_0x306ede(0xb9))/0xa;if(_0x4c3c37===_0x45db5e)break;else _0x408f15['push'](_0x408f15['shift']());}catch(_0x8596b2){_0x408f15['push'](_0x408f15['shift']());}}}(_0x5737,0xc1743));function hi(){console['log']('Hello\x20World!');}hi();
复制代码

主要特点:

  • 变量重命名
  • 字符串提取和加密
  • 随机添加无用代码进行混淆
  • 控制流扁平化
  • 各种代码转换 ...

支持的插件:

  • Webpack 插件: webpack-obfuscator
  • Webpack loader: obfuscator-loader
  • Gulp: gulp-javascript-obfuscator
  • Grunt: grunt-contrib-obfuscator
  • Rollup: rollup-plugin-javascript-obfuscator
  • Weex: weex-devtool
  • Malta: malta-js-obfuscator
  • Netlify 插件: netlify-plugin-js-obfuscator

项目地址是:

github.com/javascript-…

安装使用

使用 Yarn 或 Npm 安装

// yarn 安装
$ yarn add --dev javascript-obfuscator
// npm 安装
$ npm install --save-dev javascript-obfuscator
复制代码

CDN 引入

<script src="https://cdn.jsdelivr.net/npm/javascript-obfuscator/dist/index.browser.js"></script>
复制代码

用法

简单示例

var JavaScriptObfuscator = require('javascript-obfuscator');var obfuscationResult = JavaScriptObfuscator.obfuscate(`(function(){var variable1 = '5' - 3;var variable2 = '5' + 3;var variable3 = '5' + - '2';var variable4 = ['10','10','10','10','10'].map(parseInt);var variable5 = 'foo ' + 1 + 1;console.log(variable1);console.log(variable2);console.log(variable3);console.log(variable4);console.log(variable5);})();`,{compact: false,controlFlowFlattening: true,controlFlowFlatteningThreshold: 1,numbersToExpressions: true,simplify: true,stringArrayShuffle: true,splitStrings: true,stringArrayThreshold: 1}
);console.log(obfuscationResult.getObfuscatedCode());
复制代码

输出结果:

var _0x9947 = ['map','log','foo\x20','bvmqO','133039ViRMWR','xPfLC','ytpdx','1243717qSZCyh','2|7|4|6|9|','1ErtbCr','1608314VKvthn','1ZRaFKN','XBoAA','423266kQOYHV','3|0|5|8|1','235064xPNdKe','13RUDZfG','157gNPQGm','1639212MvnHZL','rDjOa','iBHph','9926iRHoRl','split'
];
function _0x33e4(_0x1809b5, _0x37ef6e) {return _0x33e4 = function (_0x338a69, _0x39ad79) {_0x338a69 = _0x338a69 - (0x1939 + -0xf * 0x1f3 + 0x1 * 0x469);var _0x2b223a = _0x9947[_0x338a69];return _0x2b223a;}, _0x33e4(_0x1809b5, _0x37ef6e);
}
(function (_0x431d87, _0x156c7f) {var _0x10cf6e = _0x33e4;while (!![]) {try {var _0x330ad1 = -parseInt(_0x10cf6e(0x6c)) * -parseInt(_0x10cf6e(0x6d)) + -parseInt(_0x10cf6e(0x74)) * -parseInt(_0x10cf6e(0x78)) + parseInt(_0x10cf6e(0x6a)) + -parseInt(_0x10cf6e(0x70)) + parseInt(_0x10cf6e(0x6e)) * -parseInt(_0x10cf6e(0x75)) + parseInt(_0x10cf6e(0x72)) + -parseInt(_0x10cf6e(0x67)) * parseInt(_0x10cf6e(0x73));if (_0x330ad1 === _0x156c7f)break;else_0x431d87['push'](_0x431d87['shift']());} catch (_0x9f878) {_0x431d87['push'](_0x431d87['shift']());}}
}(_0x9947, -0xb6270 + 0x4dfd2 * 0x2 + 0x75460 * 0x2), function () {var _0x1f346d = _0x33e4, _0x860db8 = {'ytpdx': _0x1f346d(0x6b) + _0x1f346d(0x71),'bvmqO': function (_0x560787, _0x519b9e) {return _0x560787 - _0x519b9e;},'rDjOa': function (_0x4501fe, _0x2b07a3) {return _0x4501fe + _0x2b07a3;},'xPfLC': function (_0x5f3c9b, _0x434936) {return _0x5f3c9b + _0x434936;},'XBoAA': function (_0x535b8a, _0x42eef4) {return _0x535b8a + _0x42eef4;},'iBHph': _0x1f346d(0x65)}, _0x346c55 = _0x860db8[_0x1f346d(0x69)][_0x1f346d(0x79)]('|'), _0x3bf817 = 0x4bb * 0x1 + 0x801 + -0xcbc;while (!![]) {switch (_0x346c55[_0x3bf817++]) {case '0':console[_0x1f346d(0x7b)](_0x4c96d8);continue;case '1':console[_0x1f346d(0x7b)](_0x101028);continue;case '2':var _0x65977d = _0x860db8[_0x1f346d(0x66)]('5', -0x586 + -0x2195 + -0x6 * -0x685);continue;case '3':console[_0x1f346d(0x7b)](_0x65977d);continue;case '4':var _0x56d39b = _0x860db8[_0x1f346d(0x76)]('5', -'2');continue;case '5':console[_0x1f346d(0x7b)](_0x56d39b);continue;case '6':var _0x544285 = ['10','10','10','10','10'][_0x1f346d(0x7a)](parseInt);continue;case '7':var _0x4c96d8 = _0x860db8[_0x1f346d(0x68)]('5', 0x622 * -0x6 + 0x4a * 0x3 + 0x1 * 0x23f1);continue;case '8':console[_0x1f346d(0x7b)](_0x544285);continue;case '9':var _0x101028 = _0x860db8[_0x1f346d(0x6f)](_0x860db8[_0x1f346d(0x6f)](_0x860db8[_0x1f346d(0x77)], 0x6fb * 0x5 + 0x1ebf * 0x1 + -0x41a5), 0x209 * 0xa + 0x1314 + -0x276d);continue;}break;}
}());
复制代码

obfuscate(sourceCode, options) 方法

该方法返回的对象 ObfuscationResult 包含以下公共方法:

  • getObfuscatedCode()- 返回混淆后的代码字符串(对 ObfuscationResult 对象调用 toString() 方法也将返回混淆代码);
  • getSourceMap()- 如果 sourceMapMode 选项设置为 inline,则返回原代码或空字符串;
  • getIdentifierNamesCache()- 如果 identifierNamesCache 选项为启用,则返回带有标识符名称的缓存对象,否则返回 null。

该方法包含两个参数:

  • sourceCode(string, default:null) – 字符串原代码;
  • options(Object, default:null) – 可选的设置选项 options 对象,具体有:
{compact: true,controlFlowFlattening: false,controlFlowFlatteningThreshold: 0.75,deadCodeInjection: false,deadCodeInjectionThreshold: 0.4,debugProtection: false,debugProtectionInterval: false,disableConsoleOutput: false,domainLock: [],domainLockRedirectUrl: 'about:blank',forceTransformStrings: [],identifierNamesCache: null,identifierNamesGenerator: 'hexadecimal',identifiersDictionary: [],identifiersPrefix: '',ignoreRequireImports: false,inputFileName: '',log: false,numbersToExpressions: false,optionsPreset: 'default',renameGlobals: false,renameProperties: false,renamePropertiesMode: 'safe',reservedNames: [],reservedStrings: [],seed: 0,selfDefending: false,simplify: true,sourceMap: false,sourceMapBaseUrl: '',sourceMapFileName: '',sourceMapMode: 'separate',sourceMapSourcesMode: 'sources-content',splitStrings: false,splitStringsChunkLength: 10,stringArray: true,stringArrayIndexesType: ['hexadecimal-number'],stringArrayEncoding: [],stringArrayIndexShift: true,stringArrayRotate: true,stringArrayShuffle: true,stringArrayWrappersCount: 1,stringArrayWrappersChainedCalls: true,stringArrayWrappersParametersMaxCount: 2,stringArrayWrappersType: 'variable',stringArrayThreshold: 0.75,target: 'browser',transformObjectKeys: false,unicodeEscapeSequence: false
}
复制代码

obfuscateMultiple(sourceCodesObject, options) 方法

sourceCodesObject 是字典键值对象,其中键是源代码的标识符,值是原代码:

{foo: 'var foo = 1;',bar: 'var bar = 2;'
}
复制代码

该方法也返回一个字典键值对象,其键是原代码的标识符,值是 ObfuscationResult对象。

命令行使用

混淆单个文件

带有 .js 扩展名的单个文件的混淆:

javascript-obfuscator input_file_name.js [options]
javascript-obfuscator input_file_name.js --output output_file_name.js [options]
javascript-obfuscator input_file_name.js --output output_folder_name [options]
javascript-obfuscator input_folder_name --output output_folder_name [options]
复制代码

如果没有使用 --output 指定输出路径,则混淆后的结果文件将存放到输入文件的目录中:

// 这会创建一个新文件 samples/sample-obfuscated.js
javascript-obfuscator samples/sample.js --compact true --self-defending false// 这会创建一个新文件 output/output.js
javascript-obfuscator samples/sample.js --output output/output.js --compact true --self-defending false
复制代码

递归混淆目录下的文件

http://www.360doc.com/content/21/1104/07/46403850_1002672849.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003191175.shtml
http://www.360doc.com/content/21/1107/21/46403850_1003190908.shtml

https://gitee.com/numerical-control-system
https://www.thinksaas.cn/user/space/50002/
https://zhuanlan.zhihu.com/p/430534517
https://zhuanlan.zhihu.com/p/430536898
https://zhuanlan.zhihu.com/p/430537972

混淆输入目录下的所有 .js 文件。如果目录中包含已经带有 -obfuscated 后缀的混淆文件,则忽略这些文件。

// 输出结果到 ./dist 同级目录下带有 obfuscated 后缀的目录中
javascript-obfuscator ./dist [options]// 输出结果到 ./dist/obfuscated 目录中
javascript-obfuscator ./dist --output ./dist/obfuscated [options]
// creates a folder structure with obfuscated files under `./dist/obfuscated` path
复制代码

开源前哨 日常分享热门、有趣和实用的开源项目。参与维护 10万+ Star 的开源技术资源库,包括:Python、Java、C/C++、Go、JS、CSS、Node.js、PHP、.NET 等。

一个强大的 JS 代码混淆工具相关推荐

  1. android js 代码混淆工具,好用的JS(Javascript)混淆加密工具-HDS JSObfuscator 2.14版

    好用的JS(Javascript)混淆加密工具-HDS JSObfuscator 2.14版 书法字体2017.06.23css压缩 分享一款好用的JS混淆加密工具:HDS JSObfuscator ...

  2. 你知道吗?JS代码混淆加密,很有用!

    JS代码为什么要进行混淆加密? 因为:JS代码是明文. JS是种开放源码的编程语言, 无论是前端浏览器中的JS代码,还是在后端使用,如nodejs,js代码都是明文, 明文代码,他人可以随意查看.复制 ...

  3. android 打包 混淆配置_玩转代码混淆工具:ProGuard

    维基百科对ProGuard的介绍是:ProGuard是一个压缩(shrink),优化(optimize)与混淆(Obfuscate)Java代码的开源命令行工具.也就是说混淆只是ProGuard的其中 ...

  4. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

  5. Android代码混淆工具Proguard学习

    概述 Proguard代码混淆工具:可以对代码进行去冗余压缩,代码优化,代码混淆等.在Android中的主要应用就是对代码混淆:就是将类名,方法名,Field名变成如a,b,c或者1,2,3等难以阅读 ...

  6. 万万没想到:对JS代码混淆,竟造成这样的性能损失?

    我们知道,如果要对JS代码进行保护,最普遍的做法是进行混淆加密. 很多人会有担忧:混淆加密后,会不会造成性能影响?JS混淆会带来多少性能损失? 理论而言,混淆加密会使JS 代码量增加,那么执行时理应有 ...

  7. Wikileaks公布CIA的代码混淆工具Marble

    Wikileaks 释出了第三批 CIA 机密文件,曝光了情报机构的代码混淆框架 Marble.代码混淆工具被设计用于隐藏代码的真正来源,将 CIA 开发的恶意程序伪装成来自其它国家.该框架对于开发者 ...

  8. 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研

    想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研 http://blog.csdn.net/testing_is_believing/article/details/22 ...

  9. APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件

    概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...

  10. 记录一个在线压缩和还原压缩js代码的工具

    packer – javascript 压缩工具 http://dean.edwards.name/packer/ Javascript Beautifier ---可以恢复某些压缩工具压缩的js代码 ...

最新文章

  1. python中的路径问题汇总
  2. TIP 2019开源论文:基于深度学习的HEVC多帧环路滤波方法
  3. 19行代码AC——习题3-4 周期串(UVa-455)_解题报告
  4. 三年经验前端社招——有赞
  5. STM32H743+CubeMX-QSPI+DMA读取外部FLASH(W25Q128JVSQ)
  6. Win7下安装配置OpenCV2.3+Visual Studio 2008
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的图书馆座位预约系统
  8. java 线程的理解_Java多线程基础理解
  9. 给 22 岁的自己六点建议
  10. rspec Could not find table
  11. soopn用一张表更新另一张表_kettle教程之单表读取
  12. Java 分页计算公式
  13. IDM6.31注册机
  14. 做软件测试学编程的十大误区
  15. 回文联对联大全_回文对联大全
  16. 解决制作FAT32格式的重装U盘中文件过大问题
  17. 说说各种手机输入法的体验
  18. 美国国防部机密文件销毁算法
  19. A story about life
  20. MyBatis之如何解决数据库数据加密解密

热门文章

  1. 1992-2021合集 全国大学生数学建模竞赛(历年赛题题目+定位分析)
  2. 2022美国大学生数学建模竞赛
  3. MATLAB--四种取整函数
  4. 计算机用户怎么去掉中文,电脑英文系统怎么设置回中文
  5. 粒子群优化算法及MATLAB实现
  6. Ubuntu 20.04 nvtop 编译安装
  7. 软件体系结构期末复习题
  8. mysql key语句_mysql建表语句key的含义
  9. 算法引论:一种创造性方法(书)
  10. Photoshop cc 2019安装与破解(附资源)