likes
comments
collection
share

js代码混淆(JavaScript Obfuscator)

作者站长头像
站长
· 阅读数 2

在项目中,有些关键的js代码需要保密,因此基于此项需要做一个js混淆,避免其他人员直接复制粘贴,尽量减少对代码的反向工程或破解尝试。本文主要介绍一种专门针对混淆代码插件(JavaScript Obfuscator)的介绍。

1、介绍

JavaScript Obfuscator(JavaScript混淆器)是一种专用于混淆和保护JavaScript代码的工具。主要目标是增加代码的保护性,使其更难以理解和破解。

优点:

  • 代码重命名:JavaScript Obfuscator将变量、函数和类名重命名为随机的、无意义的名称,使得代码难以理解。这使得阅读和理解代码的人很难推测出代码的意图和功能
  • 字符串加密:JavaScript Obfuscator可以加密和混淆JavaScript代码中的字符串。它使用算法将字符串转换为随机的字符序列,从而隐藏字符串的真实内容
  • 代码流程混淆:JavaScript Obfuscator通过改变代码的结构和流程来混淆代码。它可以插入无用的代码片段、重排代码的执行顺序,或者使用其他技术来使代码的流程变得更加复杂和难以理解。
  • 防止调试和反混淆:JavaScript Obfuscator提供了一些功能来防止代码的调试和反混淆。它可以在代码中插入检测代码是否在调试器中运行的逻辑,以及其他技术来防止对代码进行反向工程
  • 支持常见的JavaScript框架和库:JavaScript Obfuscator通常支持常见的JavaScript框架和库,如jQuery、Angular、React等。这使得您可以在保护这些框架和库的同时,继续使用它们的功能。
  • 可配置化,增加混淆难度

缺点:

  • 采用混淆的配置越复杂,混淆的难度就会越大,对应的代码量就会随之增加。

因此针对混淆以及压缩,需要做个对应的取舍

2、对比

  • UglifyJS是一个流行的JavaScript压缩和混淆工具,它可以将JavaScript代码压缩为更小的文件,消除空格和注释,并简化变量和函数名称,但是其主要功能侧重于压缩。
  • Terser:Terser是UglifyJS的改进版本,提供更好的压缩率和更高级的代码混淆功能。Terser支持更多的ES6+语法特性,并提供了更多的代码混淆选项。
  • Closure Compiler:Closure Compiler是由Google开发的JavaScript优化和混淆工具。它可以进行高级的代码压缩和混淆,并提供了一些高级优化功能。

3、基于express快速使用

源文件./views/partials/js/countAdXm.hbs

<script>
    // javascript-obfuscator:disable
    const categoryForAm = "test";
    const isOnGoogleAdForAm = false;
</script>
<script>
    console.log(categoryForAm, isOnGoogleAdForAm)
</script>

混淆代码

// 原理:设置需要读取的混淆的文件,通过读取对应的js代码转为字符串后,使用工具JavaScript Obfuscator进行混淆
const JavaScriptObfuscator = require('javascript-obfuscator');
const inputOptions={
    compact: true,//紧凑输出
    controlFlowFlattening: true,//启用代码控制流扁平化。控制流扁平化是源代码的结构转换,它阻碍了程序的理解
    controlFlowFlatteningThreshold: 1,
    numbersToExpressions: true,//支持将数字转换为表达式
    simplify: true,//简化
    stringArrayShuffle: true,//随机随机排列 stringArray 数组项
    splitStrings: true,//将文本字符串拆分为具有选项值长度的
    stringArrayThreshold: 1
};
const fs = require('fs');
const filePaths=['./views/partials/js/countAdXm.hbs','./views/partials/js/countAd.hbs'];
const regex = /<script>([\s\S]*?)<\/script>/g;

const getFilePathForMini=(str)=>{
    const lastDotIndex = str.lastIndexOf(".");
    if (lastDotIndex !== -1) {
       str = str.substring(0, lastDotIndex) + "-mini" + str.substring(lastDotIndex);
    }
    return str;
}

try {
  filePaths.forEach(filePath=>{ 
    const codeStr = fs.readFileSync(filePath, 'utf8');
    const obfuscatorStr = codeStr.replace(regex, (match, scriptContent) => {
        const obfuscationResult = JavaScriptObfuscator.obfuscate( scriptContent,inputOptions);
        return `<script>${obfuscationResult}</script>`;
      });
    fs.writeFileSync(getFilePathForMini(filePath), obfuscatorStr, 'utf8');
  })
} catch (err) {
  console.error('混淆文件时发生错误:', err);
}

发布时候,同时运行混淆代码

 node obfuscator.js 

最终转化,目标文件./views/partials/js/countAdXm-mini.hbs

<script>(function(_0x30e2be,_0x28f31a){const _0x1c6757=_0x5a14,_0x4ea2e0=_0x30e2be();while(!![]){try{const _0x577202=-parseInt(_0x1c6757(0x121))/(0xf55+-0x2f*-0xab+-0x1b*0x1bb)+-parseInt(_0x1c6757(0x126))/(-0x155*-0x5+-0x12f6+0xc4f)*(-parseInt(_0x1c6757(0x123))/(0x1c7c+0x79d+-0x1f*0x12a))+parseInt(_0x1c6757(0x11f))/(0xfca+-0x3e*0x14+-0x2*0x577)*(-parseInt(_0x1c6757(0x127))/(0x1cc9*-0x1+-0x1162+0x2e30))+-parseInt(_0x1c6757(0x11e))/(-0x7c0+0x1*-0x24bf+-0x1d*-0x189)+parseInt(_0x1c6757(0x120))/(-0x25a7+-0x1838+0x3de6)*(-parseInt(_0x1c6757(0x125))/(0x5cd+0x1cb9+-0x227e))+parseInt(_0x1c6757(0x122))/(0xc42+-0x228a+-0xc5*-0x1d)+-parseInt(_0x1c6757(0x124))/(-0x4*-0x675+0x10c3+-0x2a8d);if(_0x577202===_0x28f31a)break;else _0x4ea2e0['push'](_0x4ea2e0['shift']());}catch(_0x5ce2c5){_0x4ea2e0['push'](_0x4ea2e0['shift']());}}}(_0x164e,0x4f98+-0xe93f+-0x1*-0x53a0b));function _0x5a14(_0x72233,_0x7cc2b2){const _0x4768b5=_0x164e();return _0x5a14=function(_0x158a2a,_0x297cc8){_0x158a2a=_0x158a2a-(-0x1b7e+0x1*0x23d1+-0x1*0x735);let _0x52eefe=_0x4768b5[_0x158a2a];return _0x52eefe;},_0x5a14(_0x72233,_0x7cc2b2);}const categoryForAm='test';function _0x164e(){const _0x26dd78=['47186wRZeyK','75rNwWEq','927738rdOdBk','268wLtQtA','28rEiEti','78869TYRTHf','5014143JZlLpm','57hgSvtA','1874010SLReSp','560584zUPooT'];_0x164e=function(){return _0x26dd78;};return _0x164e();}const isOnGoogleAdForAm=false;</script>
<script>function _0x4ab8(){var _0x1e6218=['9269885DFObSB','9SvVrtv','1161oGjflo','8442210woAozX','524444MDFJKL','10939558ZGvhci','680924wTmOZu','242290HeGIsP','1376710rkXULw','8NBBEBh','log'];_0x4ab8=function(){return _0x1e6218;};return _0x4ab8();}function _0x4240(_0x3d7354,_0x9fd0d2){var _0x3e15ea=_0x4ab8();return _0x4240=function(_0x5ece48,_0x50aef2){_0x5ece48=_0x5ece48-(0x7*0x6b+0x23ba+-0x1*0x25d6);var _0x37d921=_0x3e15ea[_0x5ece48];return _0x37d921;},_0x4240(_0x3d7354,_0x9fd0d2);}var _0x206fa5=_0x4240;(function(_0x3faf2a,_0x14fb24){var _0x52a066=_0x4240,_0x379e4f=_0x3faf2a();while(!![]){try{var _0x49bda4=parseInt(_0x52a066(0xd5))/(-0x15*-0x29+0x16b1+-0x3*0x8af)+parseInt(_0x52a066(0xd3))/(-0x18e0+0x96*0xa+0x1306)+parseInt(_0x52a066(0xd9))/(0x21*0xe3+-0xff9+0xb*-0x135)*(parseInt(_0x52a066(0xd1))/(0x1*0x1e3d+0x1*0x23fe+-0x4237))+parseInt(_0x52a066(0xd8))/(0x1b9d*0x1+0x7ce+0x1*-0x2366)+-parseInt(_0x52a066(0xdb))/(-0x5*0x5a1+-0x1ee8+0x3b13)+-parseInt(_0x52a066(0xd2))/(-0x2b3+0x17ac+-0x2fe*0x7)*(-parseInt(_0x52a066(0xd6))/(-0x275*0xb+-0x11b8+0x3*0xeed))+parseInt(_0x52a066(0xda))/(0x265f+0x1311+-0x3967)*(-parseInt(_0x52a066(0xd4))/(-0x1597+0x1de6*0x1+0x1d*-0x49));if(_0x49bda4===_0x14fb24)break;else _0x379e4f['push'](_0x379e4f['shift']());}catch(_0x32a81b){_0x379e4f['push'](_0x379e4f['shift']());}}}(_0x4ab8,0xd58fe+-0x15dc65+0x17b0f3),console[_0x206fa5(0xd7)](categoryForAm,isOnGoogleAdForAm));</script>

5、参考