Как запутать код JavaScript с помощью Node.js

Проанализируйте следующий код 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, где ваш код может быть легко скопирован из браузера, однако с помощью обфускатора его можно скопировать, но трудно читаемым (даже хуже, чем минификация). В этой статье мы покажем вам, как вы можете запутать свой код в Node.js с помощью модуля JavaScript obfuscator.

1. Установите модуль JavaScript Obfuscator

Чтобы продолжить обфускацию любого кода JS (для браузера, node.js и т. Д.) С помощью Node.js, вам нужно будет использовать модуль JavaScript obfuscator. JavaScript obfuscator — это мощный бесплатный обфускатор для JavaScript и Node.js с широким набором функций, который обеспечивает защиту вашего исходного кода. Этот модуль:

  • не имеет ограничений или ограничений.
  • работает на вашем локальном компьютере — не отправляет данные на сервер.
  • совместим с es2015, es2016 и частично es2017.

Вы можете установить этот модуль с помощью следующей команды:

npm install javascript-obfuscator

После установки вы сможете запрашивать модуль в ваших скриптах, используя require("javascript-obfuscator"), Обфускатор является бесплатным и открытым исходным кодом (BSD-2-Clause лицензирован) и написан на TypeScript, вы можете увидеть онлайн-реализация модуля здесь. Для получения дополнительной информации об этой библиотеке, пожалуйста, посетите официальный репозиторий на Github здесь.

2. Использование Обфускатора

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

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

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

А. Низкое запутывание

{
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!");
});
});

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

Ссылка на основную публикацию
Adblock
detector