ob · fus · cate

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

Давайте создадим один такой инструмент, который позже можно будет автоматизировать, для javascript.

Мы будем использовать пакет npm под названием «javascript-obfuscator». Это делает за нас всю сложную работу, которая сбивает нас с толку. Пример обфускации можно посмотреть на этом сайте (здесь также используется тот же пакет):



Примером этого может быть:

После обфускации он становится:

Когда вы запустите обе эти вещи в среде с nodejs, вы получите тот же результат. Таким образом, это в основном искажает код, но он будет работать таким же образом.

Начнем:

Создайте папку (назовите ее как хотите, я называю ее обфускатором). С помощью компакт-диска терминала войдите в эту папку и выполните в терминале следующие команды:

npm init
npm install javascript-obfuscator commander

Здесь скачиваются 2 пакета. Один из них - это основной пакет (javascript-obfuscator), который будет использоваться для обфускации кода. Другой - «командир». Это будет использоваться, чтобы мы могли сделать нашу функцию скриптом узла или скриптом оболочки.

Внутри папки я создал файл (я называю его obfuscator.js). Приступим к написанию кода:

const JavaScriptObfuscator = require('javascript-obfuscator');
data = "console.log('hello world')"
let obfuscationResult = JavaScriptObfuscator.obfuscate(data);
let uglyCode = obfuscationResult.getObfuscatedCode();
console.log(uglyCode);

Запустим этот файл (запустив node obfuscator.js в терминале), чтобы получить

var _0x1e07=['hello\x20world'];(function(_0x5b6203,_0x3cfa4a){var _0x2e8799=function(_0x4c8f70){while(--_0x4c8f70){_0x5b6203['push'](_0x5b6203['shift']());}};_0x2e8799(++_0x3cfa4a);}(_0x1e07,0x137));var _0x3844=function(_0x362391,_0x40d5a3){_0x362391=_0x362391-0x0;var _0xd11018=_0x1e07[_0x362391];return _0xd11018;};console['log'](_0x3844('0x0'));

Это console.log('hello world!'), вы можете проверить, правильно это или неправильно, скопировав вывод в другой файл и запустив этот файл в среде nodejs с помощью node <filename.js>.

Давайте создадим образец файла для обфускации, назовем его sample.js. Наполняем его этим.

console.log('Nice nice');

Теперь мы будем работать над obfuscator.js, в котором мы будем использовать модуль fs для чтения файла sample.js, после чего мы запутаем его. Код выглядит примерно так:

const JavaScriptObfuscator = require('javascript-obfuscator');
const fs = require('fs');
const obfuscate = () => {
   fs.readFile(sample.js,'utf8', function(err, data) {
      if (err) {console.log(err)};
      let obfuscationResult = JavaScriptObfuscator.obfuscate(data);
      let uglyCode = obfuscationResult.getObfuscatedCode();
      fs.writeFile('ugly.js', uglyCode, function (err) {
         if (err) throw err;
         console.log(`sample.js has been obfuscated at ugly.js`);
      });
    })
};
obfuscate();

Используя функцию fsmodules readFile, мы читаем sample.jsfile. Файлы .js закодированы в utf8, поэтому нам нужно указать его как параметр. После прочтения файла мы запутываем его, а затем записываем в ugly.js.

Запустив это, а затем запустив ugly.js (вновь созданный файл), мы получим:

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

const JavaScriptObfuscator = require('javascript-obfuscator');
const fs = require('fs');
const obfuscate = (fileName) => {
  fs.readFile(fileName,'utf8', function(err, data) {
    if (err) {console.log(err)};
    let obfuscationResult = JavaScriptObfuscator.obfuscate(data);
    let uglyCode = obfuscationResult.getObfuscatedCode();
    fs.writeFile('ugly.js', uglyCode, function (err) {
      if (err) throw err;
      console.log(`${fileName} has been obfuscated at ugly.js`);
      });
    })
};
module.exports = { obfuscate };

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



Обфускация завершена ... Что дальше?

Следующей частью будет преобразование его в скрипт, который можно будет запустить в оболочке с использованием библиотеки Commander.js. Это будет полезно, если вы захотите автоматизировать это в будущем. Создайте в той же папке файл с именем command.js, напишите в нем следующий код:

#!/usr/bin/env node
const program = require('commander');
const {obfuscate} = require('./obfuscator');
program.version('0.0.1').description('Command to obfuscate a nodejs file');
program
  .command('obfuscate <filename>')
  .alias('obf')
  .description('obfuscate filename')
  .action((filename) => obfuscate((filename)));
program.parse(process.argv);

Первая строка используется, чтобы сообщить оболочке, как выполнить этот файл. Чтобы изучить commander.js более глубоко, я бы рекомендовал прочитать:





После этого вы хотите добавить этот код в свой файл package.json:

"preferGlobal": true,
  "bin": "./contact.js",

Чтобы это выглядело примерно так:

Это сделано для того, чтобы оно стало приложением, которое следует установить глобально. После этого запуска:

yarn link

для создания символической ссылки между каталогом проекта и исполняемой командой.

Теперь вы можете попробовать использовать его в другой папке.

Структура папок в итоге будет выглядеть примерно так:

Ссылка на github для этого приложения: