Як написати хороший обфускатор

Для тих хто не в темі,обфускація - це коли у нас є код програми, і ми хочемо зробити цей код нечитаним. Зазвичай, обфусцировать (чи все-таки обфускувати?) пробують різні скрипти (javascript, php і тд), оскільки якщо програма написана компилюваному мові, можна перекручуватися і поширювати лише бінарники.
Створювати обфускацію руками довго і неприємно, тому пишуться спеціальні програми - обфускатори. Далі йтиметься про те, як їх фактично роблять.
У «нормальному» обфускаторі, який на виході видає в 99% випадків робочий код, має бути реалізований справжній синтаксичний аналізатор відповідної мови програмування. Завдання це не те щоб нерозв'язна, але можна піти і більш короткою дорогою, скориставшись постійними висловлюваннями. Це зажадає від нас будь-якої дисципліни під час написання коду шифруемого додатка, зате весь обфускатор укладеться в 20 рядків.
# видаляємо зайві прогалини та переноси рядків $str =
s/(varfunctionreturnnew) /$1%space;/g; $str =
sub hide_spaces my ($str) = @_; $str =
По-друге, вони можуть зустрічатися в рядках, звідки їх висмикувати не слід.
Тому ми чинимо наступним чином. Спочатку знаходимо у коді всі знаки відсотка та замінюємо їх на рядки «%percent;». Потім знаходимо прогалини усюди, де вони повинні знаходитися - після слів var або function, в рядках і т.д.
Ці пробіли замінюються на %space;. Потім ми видираємо всі прогалини, що залишилися, після цього замінюємо всі рядки «%space;» на прогалини, а "%%;" на відсотки. Сподіваюся, не треба пояснювати, для чого потрібні такі проблеми з тимчасовим кодуванням пробілів і відсоткового знака.
Крім того, як якісь змінні або функції ми немаємо права перейменовувати? Наприклад, вони можуть використовуватися в коді, який писав інший програміст. Або зовсім знаходиться не в js-файлі, а в html-сторінці.
Вирішити цю проблему можна, даючи функцій і змінним, що підлягають обфускації, імена, що починаються з певного префікса. Наприклад, «obf_» чи «». Так, на плечі бідного програміста лягатиме додаткова робота, зате, повторюся, не треба писати синтаксичний аналізатор, та й обфускатор виходить більш гнучким.
З огляду на вищезгадане, код обфускатора буде наступним:
use strict; use List::Util qw/shuffle/; use List::MoreUtils qw/uniq/; use constant DEBUG => 0;
s/(\/\*\*\* $js_compress_begin \*\*\*\/.*?\/\*\*\* $js_compress_end \*\*\*\/)/js_quick_compress($1)/gsieo ;

/(\[a-zA-Z0-9\_]+)/g; @vars = shuffle uniq @ vars; my $new_name = "aa"; for my $i(0..$#vars)
Все інше я, здається, вже сказав.
З програмками іншими мовами програмування, я сподіваюся, ви розберетеся самотужки. Так як більшість з них успадкували свій синтаксис у мови Сі (ось не міг Python не понтонуться, так?), принцип буде той же. Бажаю звернути вашу увагу на те, що на відміну від «нормального» обфускатора, описаний трохи вище не може нормально обробляти код на кшталт такого:
var mystr = "abc / * def * / cba"; // рядок def буде вирізаний
Загалом, головне — стежити за іменами змінних і пам'ятати про моменти, наведені вище. До речі, приємний побічний ефект від застосування обфускатора полягає в тому, що коду стає менше.
Якщо у вас є бажання доопрацювати наведений скрипт, зможете додати до нього шифрування рядкових та числових даних. Числа шифрувати просто - замість 100 20 трипишемо 321-198, замість Четириста 50 6 підставляємо (1806% 789) * 2 і т.д.. Чим більше операцій, тим краще.
З рядками трохи цікавіше. Необхідно написати генератор функцій шифрування та дешифрування рядків. Генеруємо штук 100 таких функцій і робимо в коді підміну "aaa" на obf_decrypt01('9fa341?), "bbb" на obf_decrypt34(2182,6335,19354) і т.д.
він перетворює ось на таку тарабарщину:
Додаток: Зверніть також увагу на Closure Compiler - додаток та онлайн-версію.
Схожі статті
Нещодавно мені знадобилося знайти load average системи з Erlang. Готового рішення знайти не вдалося. У результаті було написано невелика NIF-бібліотека на вирішення цього завдання.
У цій статті ви знайдете мої ескізи пошукового робота, тобто набір скриптів, призначений для обходу сайтів ... в будь-яких цілях. Це може бути індексація сторінок пошуковою машиною, пошук.
У статті про 12-ти ефективних методах оптимізації програм мемоізація була названа як один з ефективних методів. Зараз спільними зусиллями ми напишемо маленьку бібліотеку Er.
Що не кажи, а вивчення нових мов програмування зрідка виявляється марною витратою часу. Навіть якщо мова, що вивчається, не доведеться використовувати на практиці, в процесі дослідження ви найімовірніше.