Обфускация кода JavaScript с помощью Node.js

Как разработчик, вы проводите много времени, создавая, разрабатывая и отлаживая свой код. Последнее, чего вы хотите, это чтобы кто-то другой имел возможность украсть весь ваш труд и использовать его в другом месте. К счастью, существует распространенная практика под названием обфускация кода, которая может помочь защитить вашу работу от посторонних глаз.



Обфускация — это техника, которая намеренно затуманивает исходный код файла JavaScript, что затрудняет его понимание человеком. Это похоже на шифрование, но компьютерная программа все равно может понять код и выполнить его.

Анализ обфусцированного кода

function _0x33bc(_0x357a49, _0x4d043b) {
    var _0x3af57c = _0x3af5();
    return _0x33bc = function (_0x33bc59, _0x2d7f6b) {
        _0x33bc59 = _0x33bc59 - 0xac;
        var _0x433c74 = _0x3af57c[_0x33bc59];
        return _0x433c74;
    }, _0x33bc(_0x357a49, _0x4d043b);
}
var _0x5b0965 = _0x33bc;

function _0x3af5() {
    var _0x16d4f2 = ['2293120DDXwAC', '5tguhIh', 'ExpressJS', '32097acJbHr', '1234303tDdtZs', 'HTML', '51273EoArEE', 'CSS', 'JavaScript', '3214428qqnLuG', 'MongoDB', '40qdyzEo', 'Smith', '252346qcgJWs', '292cvJCiT', 'Anthony', 'PHP', '2392880xWQHuO', 'Fullx20Stackx20Developer'];
    _0x3af5 = function () {
        return _0x16d4f2;
    };
    return _0x3af5();
}(function (_0x36cba0, _0x8d74e1) {
    var _0x4b315b = _0x33bc,
        _0x589073 = _0x36cba0();
    while (!![]) {
        try {
            var _0x243a48 = -parseInt(_0x4b315b(0xb8)) / 0x1 * (-parseInt(_0x4b315b(0xb1)) / 0x2) + -parseInt(_0x4b315b(0xba)) / 0x3 * (parseInt(_0x4b315b(0xb2)) / 0x4) + parseInt(_0x4b315b(0xb5)) / 0x5 + parseInt(_0x4b315b(0xad)) / 0x6 + -parseInt(_0x4b315b(0xbb)) / 0x7 + -parseInt(_0x4b315b(0xaf)) / 0x8 * (parseInt(_0x4b315b(0xbd)) / 0x9) + -parseInt(_0x4b315b(0xb7)) / 0xa;
            if (_0x243a48 === _0x8d74e1) break;
            else _0x589073['push'](_0x589073['shift']());
        } catch (_0x513014) {
            _0x589073['push'](_0x589073['shift']());
        }
    }
}(_0x3af5, 0x68fca));
var person = {
    'first_name': _0x5b0965(0xb3),
    'last_name': _0x5b0965(0xb0),
    'occupation': _0x5b0965(0xb6),
    'languages': [_0x5b0965(0xac), _0x5b0965(0xbc), _0x5b0965(0xbe), 'React', _0x5b0965(0xb4), 'NodeJS', _0x5b0965(0xae), _0x5b0965(0xb9)]
};
Вход в полноэкранный режим Выход из полноэкранного режима

Это обфусцированный код. Довольно сложно понять, не так ли? Скорее всего, если вы не супер-гений программирования, вы не сможете его понять. Вам придется прочитать его очень внимательно, чтобы понять, что происходит.

Вот оригинальный код:

var person = {
    first_name : "Anthony",
    last_name : "Smith",
    occupation : "Full Stack Developer",
    languages: ["JavaScript", "HTML", "CSS", "React", "PHP","NodeJS", "MongoDB","ExpressJS"],
};
Вход в полноэкранный режим Выход из полноэкранного режима

Выглядит совсем по-другому, не так ли? Несмотря на то, что это всего лишь простой объект, он может быть легко украден и повторно использован в другом месте без вашего разрешения. Если это данные компании, которые вы не хотите, чтобы мир увидел, то обфускация — это то, что нужно. Это также полезно для людей, продающих код на таких платформах, как ThemeForest, Template Monster и т.д., где ваш код может быть легко скопирован из браузера и вставлен в текстовый редактор, однако с обфускатором он все равно может быть скопирован, но его будет очень трудно прочитать и расшифровать.

В этой статье я покажу вам, как можно обфусцировать ваш код с помощью библиотеки JavaScript Obfuscator в Node.js.

Когда и зачем нужно обфусцировать код JavaScript?

Одна из самых неприятных вещей в JavaScript заключается в том, что он прост для понимания большинством разработчиков, а это значит, что его можно украсть и использовать повторно в другом месте без разрешения разработчика. Последнее, чего вы хотите, это чтобы кто-то другой перехватил и повторно использовал весь код, который написали ВЫ.



Я думаю, что есть смысл в обфускации, чтобы затруднить, если не сделать невозможным, разборку кода. Также, я думаю, это имеет смысл для продуктов с большой клиентской базой, когда вы не хотите, чтобы ваши конкуренты знали много о ваших продуктах.

Как замаскировать код JavaScript?

Мы будем использовать Node.js и модуль JavaScript Obfuscator для обфускации нашего кода JavaScript. Модуль обфускатора javaScript — это бесплатный инструмент с открытым исходным кодом, обладающий большим количеством функций, которые могут защитить ваш код от кражи.

Основные возможности:

  • сглаживание потока управления
  • различные преобразования кода
  • опции CLI
  • Не имеет ограничений и лимитов
  • Может работать как на локальной машине, так и на удаленном сервере, поскольку не требует подключения к Интернету
  • переименование переменных
  • внедрение мёртвого кода

Установка:

npm install javascript-obfuscator
Войти в полноэкранный режим Выход из полноэкранного режима

После установки модуля вы можете потребовать его в своем коде, используя require("javascript-obfuscator").

Использование модуля:

Теперь мы можем приступить к использованию модуля обфускатора. Сначала мы должны создать экземпляр модуля obfuscator, после чего мы можем использовать метод obfuscate для обфускации нашего кода. Он принимает первый аргумент, который является кодом для обфускации, и второй аргумент, который является объектом, содержащим опции для использования.

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

// Obfuscate the code providen as first argument
var obfuscationResult = JavaScriptObfuscator.obfuscate(`
function myfunction() {
  console.log("function");
};

myfunction();

function calculate(x, y, op) {
  var answer;
  if ( op = "add" ) {
    answer = x + y;
  };
  else if ( op = "sub" ) {
    answer = x - y;
  };
  else if ( op = "multi" ) {
    answer = x * y;
  };
  else if ( op = "divide" ) {
    answer = x / y;
  };
  else {
    answer = "Error";
  };
  return answer;
};
`);

// 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
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Вам следует ознакомиться с официальной документацией библиотеки, чтобы увидеть все новые опции, которые доступны в настоящее время. Вы также можете посетить веб-сайт JavaScript Obfuscator, чтобы увидеть все доступные на данный момент опции. В настоящее время они предоставляют предустановки, которые включают в себя ощущение «низкого», «среднего», «высокого» и «наивысшего».

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!");
    });
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Как вы можете видеть, приведенный выше код теперь обфусцирован, что значительно усложняет его понимание человеком. Это отличный способ защитить свой код JavaScript от хакеров и посторонних глаз.

Обфускация — это отличный способ скрыть бизнес-логику от посторонних глаз, а также сделать размер вашего js-файла намного меньше, чтобы его можно было легче передать.

Оцените статью
devanswers.ru
Добавить комментарий