个性化阅读
专注于IT技术分析

如何使用Node.js混淆JavaScript代码

本文概述

分析以下JavaScript代码:

(function(_0x1f87a3, _0x3799c5) {
    var _0x17ebae = function(_0x55b076) {
        while (--_0x55b076) {
            _0x1f87a3['push'](_0x1f87a3['shift']());
        }
    };
    _0x17ebae(++_0x3799c5);
}(_0xaec5, 0x67));
var _0x5aec = function(_0x3dd15e, _0x1f0015) {
    _0x3dd15e = _0x3dd15e - 0x0;
    var _0x231fd0 = _0xaec5[_0x3dd15e];
    return _0x231fd0;
};
(function() {
    var _0x1e950d = '5' - 0x3;
    var _0x137c62 = '5' + 0x3;
    var _0x277681 = '5' + -'2';
    var _0x531dc9 = ['10', '10', '10', '10', '10'][_0x5aec('0x0')](parseInt);
    var _0x1db9e4 = 'foo\x20' + 0x1 + 0x1;
    console[_0x5aec('0x1')](_0x1e950d);
    console[_0x5aec('0x1')](_0x137c62);
    console[_0x5aec('0x1')](_0x277681);
    console[_0x5aec('0x1')](_0x531dc9);
    console[_0x5aec('0x1')](_0x1db9e4);
}());

只是开个玩笑, 除非你是计算机或特权编程天才/计算机, 否则你将在一两秒钟之内无法理解以前的JS代码的含义或作用。好吧, 先前的总有效JavaScript代码是以下代码的混淆版本:

(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);
})();

看起来很不一样吗?对JavaScript代码的混淆可以帮助你避免在其他地方使用你的代码。这对于在诸如Themeforest之类的平台上出售代码的人来说非常有用, 在该平台上可以轻松地从浏览器复制你的代码, 但是使用混淆器可以复制但难以阅读(甚至比最小化还差)。在本文中, 我们将向你展示如何使用JavaScript模糊处理模块在Node.js中对代码进行模糊处理。

1.安装JavaScript Obfuscator模块

要使用Node.js进行任何JS代码(对于浏览器, node.js等)的混淆处理, 你将需要依赖JavaScript混淆器模块。 JavaScript混淆器是JavaScript和Node.js的强大免费混淆器, 具有多种功能, 可为你的源代码提供保护。该模块:

  • 没有限制或限制。
  • 在本地计算机上运行-不将数据发送到服务器。
  • 与es2015, es2016和部分es2017兼容。

你可以使用以下命令安装此模块:

npm install javascript-obfuscator

安装后, 你将可以使用require(” javascript-obfuscator”)在脚本中要求该模块。混淆器是免费且开放源代码(BSD-2-Clause许可), 并且使用TypeScript编写, 你可以在此处查看该模块的在线实现。有关此库的更多信息, 请访问Github上的官方存储库。

2.使用混淆器

使用模块混淆一些代码的逻辑非常简单。你创建模块的实例, 从该实例可以使用混淆方法, 该方法将要混淆的代码作为第一个参数。此方法同步返回混淆。通过一系列转换, 例如变量/函数/参数重命名, 字符串删除等, 你的源代码被转换为不可读的内容, 而工作方式与以前完全相同:

// Require the JavaScript obfuscator
var JavaScriptObfuscator = require('javascript-obfuscator');

// Obfuscate the code providen as first argument
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);
})();
`);

// Display obfuscated result
console.log(obfuscationResult.getObfuscatedCode());

混淆器选项

如果在混淆方法中将配置对象作为第二个参数提供, 则可以自定义混淆器。以下代码段显示了模块上所有可用的属性:

JavaScriptObfuscator.obfuscate(YourCode, {
    compact: true, controlFlowFlattening: false, controlFlowFlatteningThreshold: 0.75, deadCodeInjection: false, deadCodeInjectionThreshold: 0.4, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: false, domainLock: [], log: false, mangle: false, renameGlobals: false, reservedNames: [], rotateStringArray: true, seed: 0, selfDefending: false, sourceMap: false, sourceMapBaseUrl: '', sourceMapFileName: '', sourceMapMode: 'separate', stringArray: true, stringArrayEncoding: false, stringArrayThreshold: 0.75, target: 'browser', unicodeEscapeSequence: false
});

值得阅读该库的文档, 因为将来可能会出现新的选项。官方存储库提供了已经进行的预设, 以特殊的选项组合提供”低”, “中”或”高”混淆的感觉。请注意, 混淆效果越好, 处理步骤就越慢:

A.低混淆

{
	compact: true, controlFlowFlattening: false, deadCodeInjection: false, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: true, log: false, mangle: true, renameGlobals: false, rotateStringArray: true, selfDefending: true, stringArray: true, stringArrayEncoding: false, stringArrayThreshold: 0.75, unicodeEscapeSequence: false
}

B.中度混淆

{
	compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 0.75, deadCodeInjection: true, deadCodeInjectionThreshold: 0.4, debugProtection: false, debugProtectionInterval: false, disableConsoleOutput: true, log: false, mangle: false, renameGlobals: false, rotateStringArray: true, selfDefending: true, stringArray: true, stringArrayEncoding: 'base64', stringArrayThreshold: 0.75, unicodeEscapeSequence: false
}

C.高度混淆

{
	compact: true, controlFlowFlattening: true, controlFlowFlatteningThreshold: 1, deadCodeInjection: true, deadCodeInjectionThreshold: 1, debugProtection: true, debugProtectionInterval: true, disableConsoleOutput: true, log: false, mangle: false, renameGlobals: false, rotateStringArray: true, selfDefending: true, stringArray: true, stringArrayEncoding: 'rc4', stringArrayThreshold: 1, unicodeEscapeSequence: false
}

例子

在下面的示例中, 我们将读取一个JS文件的内容, 并将使用代码的混淆版本编写一个新文件:

// Require Filesystem module
var fs = require("fs");

// Require the Obfuscator Module
var JavaScriptObfuscator = require('javascript-obfuscator');

// Read the file of your original JavaScript Code as text
fs.readFile('./your-original-code.js', "UTF-8", function(err, data) {
    if (err) {
        throw err;
    }

    // Obfuscate content of the JS file
    var obfuscationResult = JavaScriptObfuscator.obfuscate(data);
    
    // Write the obfuscated code into a new file
    fs.writeFile('./your-code-obfuscated.js', obfuscationResult.getObfuscatedCode() , function(err) {
        if(err) {
            return console.log(err);
        }
    
        console.log("The file was saved!");
    });
});

请记住, 虽然几乎不可能从混淆后的版本中恢复确切的原始源代码, 但是有时间, 知识和耐心的人可以对其进行反向工程。该示例不使用特殊的混淆, 而是使用默认的混淆, 因此, 如果要自定义混淆, 请提供配置对象。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何使用Node.js混淆JavaScript代码

评论 抢沙发

评论前必须登录!