HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Обход запрета показа исходного HTML кода, обход социальных блокировщиков и других мер противодействия сбору информации о сайте
Можно ли надёжно защитить HTML код веб-страницы
Исходный код веб-страницы невозможно защитить от просмотра. Это факт. Но можно в некоторой степени усложнить задачу анализа кода. К совершенно пустым, неэффективным способам можно отнести блокировку правой кнопки мыши. К более эффективным средствам можно отнести обфускацию кода. Особенно если код не присутствует в исходном тексте страницы, а подгружается из разных файлов с помощью JavaScript и если на разных этапах (сам JavaScript и HTML) также обфусцированны. В этом случае всё становится намного труднее. Но такие случае довольно редки — чаще встречаются на веб-сайтах очень крупных компаний. Мы же рассмотрим более простые варианты.
Как просмотреть исходный HTML код веб страницы, если заблокирована правая кнопка мыши и сочетание клавиш CTRL+u
Если правая кнопка мыши не работает, то просто нажмите CTRL+u. Мне попался сайт, в котором CTRL+u также отказалась работать:
CTRL+u можно отключить с помощью JavaScript и именно эта техника используется на том сайте. То есть первый вариант очевиден — с выключенным JavaScript исходный код не будет «заблокирован».
Другой вариант — это в меню браузера найти опцию «Показать исходный код». В Firefox эта опция есть, но лично у меня всегда уходит много времени, чтобы её найти ))) В Chrome я эту опцию вообще не могу найти в меню браузера, поэтому запомните строку
Если эту строку добавить перед любым адресом сайта и всё это вставить во вкладку веб-браузера, то будет открыт исходный код данной страницы.
Например, я хочу посмотреть HTML страницы https://suip.biz/ru/?act=view-source, тогда я вставляю строку view-source:https://suip.biz/ru/?act=view-source во вкладку веб-браузера и получаю в ней исходный код.
Кстати, если вам трудно запомнить view-source, то вот здесь соответствующий сервис: https://suip.biz/ru/?act=view-source (только не надо смеяться над его «сложностью» — всего в жизни не запомнишь, и иногда реально проще открыть такую страницу и с помощью неё получить нужную для просмотра исходного кода строку).
Кстати по поводу отключения JavaScript — необязательно лазить в «глубинные» настройки браузера и искать где эта опция. Можно даже не отключать JavaScript, а приостановить выполнение скриптов для конкретной страницы.
Для этого нажмите F12, затем в инструментах разработчика перейдите во вкладку Sources и нажмите там F8:
Теперь на странице сайта будет работать сочетание клавиш CTRL+u, как будто бы его никогда не отключали.
Обход социальных блокировщиков
Социальный блокировщик выглядит примерно так:
Суть в следующем, чтобы просмотреть содержимое, нужно «лайкнуть» эту статью в социальной сети.
«Под капотом» там всё (обычно) так: «скрываемый» текст уже присутствует в HTML странице, но спрятан с помощью свойства стиля style="display: none;". Поэтому достаточно:
- открыть HTML страницы, защищённой социальным блокировщиком
- найти там все вхождения style="display: none;" — обычно их не очень много.
Пример «взлома» социального блокировщика:
Но каждый раз лазить в исходный код не очень удобно и я… сделал онлайн сервис, который сам извлекает для вас данные, скрываемые социальными блокировщиками, его адрес: https://suip.biz/ru/?act=social-locker-cracker
Там я реализовал обход четырёх социальных блокировщиков и добавил «эвристический» анализ — он включается если никакой из этих 4 х блокировщиков не подошёл, то тогда просто выводится содержимое всех блоков с style="display: none;".
Кстати, если вам попались страницы, которые этот сервис не может обойти — просто напишите в комментариях ссылку на проблемную страницу — я добавлю соответствующий «обработчик».
Тот сайт, который я показываю на скриншотах, как будто бы распространяет пиратское ПО. Я посмотрел ссылки с помощью обходчика социальных блокировщиков — оказалось, что все скрытые ссылки абсолютно беспонтовые: ведут на демо версии программ или вообще на официальный сайт. В некоторых статьях ссылок вообще нет. Такой «маркетинг» меня заинтересовал и я решил поискать другие сайты этого же автора.
Поиск сетки фальшивых пиратских сайтов
Этот сайт за CloudFlare — Ha ha, classic!
- Cloudflare, Inc. — это сегодняшние IP адреса
- GoDaddy.com, LLC — аукцион, парковщик доменов и тому подобное
- Contabo GmbH — вполне возможно реальный хостинг, где размещён этот сайт
Итак, вероятно, что IP этого сайта 173.249.15.230. На securitytrails на настоящее время по этому IP информации о связанных с ним сайтов нет.
Поэтому идём на сервис «Список сайтов на одной IP», в качестве исходных данных вводим 173.249.15.230 и получаем там:
- haxsofts.com
- crackways.com
- crackmafia.org
Все сайты схожей тематики, везде есть социальный блокировщик, везде вместо вареза ссылки на демо версии, ссылки на официальные сайты, либо просто ничего нет под закрытым контентом.
Верификация IP сайта с помощью cURL
Для верификации IP обычно я использую следующую команду:
Или так, если нужно проверить сайт на HTTPS протоколе:
Но сервер 173.249.15.230 настроен так, что абсолютно любой хост, хоть даже если туда написать «dfkgjdfgdfgfd» он перенаправляет на адрес с HTTPS, то есть на «https://dfkgjdfgdfgfd». А запросы по HTTPS сам сервер не принимает вовсе — там веб-сервер не настроен на их обработку и 443 порт даже не октрыт.
В принципе, доказать, что данный сервер настроен на обработку хоста macwinsofts.com можно косвенно, например, данный запрос практически мгновенно вызовет ошибку 503:
А вот данный запрос хотя в конечном счёте также вызовет ошибку 503, но заставит сервер надолго «задуматься»:
Видимо, там из-за особенностей настройки происходят бесконечный редиректы и в конце концов соединение сбрасывается по таймауту.
Это способ позволяет в том числе брутфорсить файлы и папки:
И совсем интересный результат вызывает вот такой запрос:
Заключение
В чём смысл этих сайтов? На некоторых из них имеются для скачивания .exe файлы — возможно вирусы или какая-то сомнительная монетизация. Хотя я проверил по virustotal — вроде бы, файл не вредоносный. Те сайты, у которых нет исполнимых файлов для скачивания, видимо, дожидаются роста посещаемости, чтобы затем начать распространять этот исполнимый файл.
Возможно владелец ожидает роста посещаемости для включения настоящей монетизации или распространения вирусов.
Как спрятать JavaScript-код
Язык программирования JS пользуется неплохим спросом у разработчиков. Это способ создания контента, базирующийся на основе скриптов. JavaScript обладает простым синтаксисом. За счет этого читаемость кода значительно повышается.
Но JS не отличается «стандартной» безопасностью. Разработчикам приходится думать над тем, как защитить приложение от посторонних. Шифровка здесь осуществляется несколькими способами. Далее будет рассмотрена обфускация и иные методы «сокрытия» кода.
Как можно прятать данные в JS
Основная работа софта, написанного на Java Script, базируется непосредственно в браузере. Для того, чтобы провести сокрытие информации, можно использовать несколько подходов:
- работа с сокетами;
- использование крипторов;
- обфускация.
Это – основные методы «шифрования». Каждый вариант предусматривает свои собственные нюансы.
Несколько слов о крипторах
Крипторы помогают приводить код в нечитаемую форму. Для этого используется base64. Далее происходит прибавка так называемой «соли»: некоторого символьного набора, который при создании ПО функцией-дешифровщиком применяется в виде ключа. Завершающий этап – это выполнение строчки кода через eval().
Крипторы имеют одну проблему – достаточно низкий уровень безопасности. Если человек смог понять «соль» и принцип функционирования «шифровальщика», взломать приложение не составит никакого труда.
Обфускация
Obfuscation – метод, который используется, если нужно преобразовать простой код утилиты в новую версию. Итоговый результат станет очень тяжелым для понимания со стороны пользователя. После шифровки возможны трудности с проектированием. Это относится и к устройствам, и к программистам.
Обфускатор – специальное средство защиты утилит, написанных на JS. Работает так:
- Обрабатывает весь код.
- Вставляет to текст между операторами символы, которые не читаются and заменяет имена переменных и функций.
- Корректировки здесь производятся to визуально непонятным символам.
- Некоторые элементы заменяются to hex and hex-значения.
Obfuscating – необратимый процесс. Он приводит to увеличение исходного кода утилиты. Иногда процедура отражается на работоспособности утилиты.
Когда требуется
Obfuscator – метод шифрования и сокрытия «внутренностей» программного обеспечения, который применяется не всегда. Он относится to ситуации, при которых софт должен стать нечитаемым and трудно распознаваемым даже для компьютеров. Существуют некоторые стандартные обстоятельства, при которых рекомендуется прибегнуть to obfuscated code.
Шаблоны страниц
Работа в сфере создания веб-страничек должна находиться под надежной защитой. В этом случае на помощь приходит обфускатор.
Пример – переход to Themeforest. Здесь клиенты смогут перед покупкой воспользоваться предварительным просмотром шаблонов. Это значит, что при работе человеку придется использовать:
- HTML;
- CSS;
- JS.
Если использовать not obfuscate code, каждый сможет загрузить and задействовать ресурсы, залитые остальными, не приобретая непосредственный шаблон.
Браузерные игры
Если клиент plays to browser games, написанные на JavaScript, он тоже должен использовать обфускатор. Это поможет обеспечить надежную защиту codes от других разработчиков and потенциальных нарушителей правил.
За счет такого компонента как obfuscator понять «внутренности» игрушки будет крайне проблематично. Если постараться – удастся добиться результата, при котором утилита окажется максимально безопасной.
Как быть с минимизацией
Изучая obfuscates and шифрование в Джаве, стоит помнить о минимизации. Упомянутый ранее процесс может напоминать minimizing. Но путать их не нужно. Это – два отдельных процесса:
- Минимизация – сжатие code для того, чтобы сэкономить память. Достигается результат за счет уменьшения количества символов and пробелов.
- Обфускация – предусматривает применение инструмента, который относится to final code. Шифрование, позволяющее провести дешифровку только конкретным «софтом».
Минимизированный записи контента с легкостью приводятся to start form. Для этого применяются всевозможные инструменты, улучшающие codes.
Простая обфускация
Если для шифрования прибегнуть to obfuscating, можно задействовать различные инструменты. Первый вариант – простой. Здесь чаще всего применяют:
- JSmin;
- YUI Compressor;
- JS Packer;
- Closure Compiler.
Это – онлайн средства, которые приводят код to special form. Вот пример первоначальной утилиты and преобразования:
Сложный вариант
Но есть and more difficult подход к решению поставленной задачи. Обычно он реализовывается через онлайн средства. Вот плагины, которые придут на помощь:
- webpack-obfuscator;
- gulp-javascript;
- grunt-contrib.
Вот пример исходного приложения:
And форма, к которой приведет сложное шифрование:
В представленном фрагменте отсутствует буквенно-цифровая обфускация. Если пропустить итог to online obfuscator или инструмента обратного проектирования, он станет хорошо читаемым пользователями.
Для того, чтобы лучше освоиться в программировании и разработке, а также защите информации, рекомендуется отправиться to special courses. Проводятся занятия дистанционно. Обучают как основам программирования, так и иным особенностям IT-сферы. Предложения есть для новичков и опытных клиентов. В конце гарантируется не только богатый практический опыт. Подтвердить навыки and знания удастся при помощи электронного сертификата.
Прячем, обфусцируем и криптуем клиентскую часть веб-приложений
Обфускация — это приведение исходного текста программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. Применительно к JavaScript данная технология используется в таких видах теневого онлайн-бизнеса, как загрузки (iframe), спам и SEO. Наша задача на сегодня — изучить все методы скрытия JS-кода, которые, я надеюсь, ты будешь использовать только во благо.
Обфусцированный скрипт
Теория
- HTML-код страницы;
- JavaScript-код/JS-файлы страницы;
- CSS-код/CSS-файлы страницы;
- Изображения и другую информацию (только в браузерах, поддерживающих протокол «data»).
- антивирусов (если речь идет об iframe или других вредоносных скриптах);
- других людей (например, если ты написал чудесный скрипт на JavaScript и не хочешь, чтобы кто-то его «содрал» себе).
Работа JJEncode
Базовое шифрование HTML/CSS
Что делать, если нам нужно зашифровать HTML или CSS код? Все просто: зашифровать на JavaScript, а после расшифровки вставить как HTML код.
Пример вставки (без шифровки/крипта/обфускации):
Точно так же мы поступим и с CSS-стилями:
Теперь постараемся абстрагироваться от HTML и CSS и поговорить только о самой сути — сначала скрытии, а затем и криптовке JavaScript.
Прежде, чем кто-либо захочет посмотреть и расшифровать наш код, он постарается его найти. Ниже ты найдешь несколько действенных методов сокрытия кода от глаз любопытных пользователей.
Прячем слово «][akep» в теле документа
Замена атрибутов тега <script>
Все очень просто, но это нельзя считать хорошей или даже средней защитой, так как она ориентирована на невнимательность пользователей.
Сам принцип донельзя прост. Мы имеем страничку («index.html») и JavaScript-файл, код которого мы хотим скрыть («script.js»). На странице «index.html» у нас указано:
А теперь просто создадим папку «text», в которую положим наш скрипт («script.js») под именем «javascript» и поменяем атрибуты местами. Это будет выглядеть так:
Для лучшего эффекта сразу отвлечем внимание пользователя на путь. Например, так:
Проверено на личном опыте: работает отлично! Таким способом я сам накручивал партнерку по кликам, так как пришлось использовать накрутчик на JavaScript. Администрация партнерки его так и не увидела :).
JavaScript-обработчики
Данный способ также не является универсальным средством для сокрытия JS-кода, но все же я расскажу о нем. Главная идея состоит в том, чтобы прятать код внутрь обработчиков событий onLoad, onClick и т.д. То есть примерно в следующие конструкции:
Например, для тегов body и frameset есть обработчик onLoad, который запустит в нем прописанный код после загрузки страницы/фрейма.
Отмечу, что не для всех объектов обработчики одинаковы.
Cookie, Referrer и адрес
JavaScript можно также спрятать и в такие нестандартные места, как cookie (document.cookie), реферрер (document.referrer) и адрес страницы (location.href). В данном случае код будет храниться как обычный текст, а выполняться с помощью функции eval(), которая берет в качестве аргумента текст и выполняет его как JavaScript-код.
В качестве примера примем такое допущение, что у нас уже установлены кукисы следующего вида:
Теперь выполним этот алерт следующим образом:
Здесь мы берем текст всех cookie-записей для нашего хоста и делим его на части в местах, где стоит «||». Затем берем второй элемент ([1]) и запускаем его через eval().
Данный способ не так уж и плох, так как код, который мы хотим исполнить, не виден на самой странице, а также потому, что мы можем заставить код удалить самого себя! Пример реализации:
Аналогичным образом можно использовать и другие строки, доступные через JavaScript, например, location.href и document.referrer.
Сокрытие кода на Ajax
- Страница с кодом, который мы хотим скрыть (с именем «l»):
- Страница с вызовом кода:
Нуллбайт атакует Оперу
Этот метод прост и достаточно эффективен, но, к сожалению, он рассчитан только на браузер Opera. Суть метода в том, чтобы перед скрываемым кодом поставить так называемый нуллбайт (нуллбайт или nullbyte — это символ с ASCII кодом «0»). Зачем? Затем, что Opera просто-напросто не показывает код во встроенном просмотрщике после данного символа. Пример:
В данном примере сначала идет нормальный код, который нам скрывать не требуется. Потом с помощью PHP мы вставляем нуллбайт, а после него идет скрываемый код.
Прячемся в HTML-коде и комментариях
Код можно легко спрятать в HTML, затем обработать его и выполнить. Например, вот так:
В данном случае мы спрятали код в атрибутах тега img, после чего обработали код всей страницы, собирая разбросанные кусочки. Таким же способом можно скрывать текст в HTML/JavaScript комментариях:
Отдельно стоит отметить, что очень эффективно можно прятать код внутри популярных фреймворков — например, jQuery, mooTools и подобных. Эти файлы не являются подозрительными, а исследование их займет много времени (хотя всегда существует возможность автоматического сравнения оригинала и измененного файла).
Теперь же, думаю, можно поговорить о том, что, в конце концов, видит эксперт безопасности, и о том, что исследуют антивирусы. Ниже читай о наиболее популярных методах криптовки и обфускации JS-кода.
Субституция стандартных функций/методов JavaScript
Данный метод ориентирован на то, чтобы вместо стандартных функций или методов JavaScript подставить свои переменные:
- document.getElementsByTagName
- document[‘getElementsByTagName’]
Флуд комментариями и кодом
Данный способ рассчитан на то, чтобы вставить в обфусцируемый код флуд, то есть что-то, что не несет смысловой нагрузки для кода скрипта. Флудить можно как код, так и комментарии:
В данном случае флуд комментариями слишком плотный, хотя на самом деле код был очень простым: « a = «hahaha»; alert(a); ».
Флуд кодом можно также мешать с флудом комментариями. При желании можно написать PHP-функцию для добавления флуда в код JavaScript. Лично я брал какую-то статью с английского блога, парсил на слова, и функция добавляла случайное количество этих слов в комментарии.
Кстати, желательно также использовать многострочные комментарии в форме «фальшивого закрытия»:
Какое из чисел покажет алерт? 🙂
Работа обфусцированного алерта
Замена текста шестнадцатеричными кодами
Я хотел отнести к этому пункту и кое-какие другие способы преобразования текста, но оставил только этот, так как это единственный способ шифровки, не требующий функций-помощников для расшифровки:
В данном случае мы — во-первых, использовали внутреннюю переменную «cookie» объекта «document», как элемент массива. Во-вторых, мы перевели ее имя в шестнадцатеричный формат. Если бы мы использовали переменную «cookie» через точку, то есть как document.cookie, то мы бы не смогли перевести обращение к ней в шестнадцатеричный формат, так как это относится только к строкам (в массиве ключ является строкой), а в document.cookie строк нет.
PHP-функция перевода в шестнадцатеричный формат:
Трюк с несуществующими функциями
Как мы уже знаем из прочитанного выше, в JavaScript можно вызывать методы, как элементы обьекта: document.getElementById и document[‘getElementById’]. Оба варианта фактически одинаковы, различие есть только в записи — во втором варианте мы используем строку.
Как-то вечером я придумал очень интересный способ получения подобных строк. Например, нам нужно зашифровать вышеупомянутый «getElementById». Отвлечемся на короткое объяснение данного способа с помощью такого примера:
Этот скрипт не будет работать, так как функции b, c и d не были ранее объявлены. Теперь попробуем сделать так, чтобы этот код заработал, для этого будем использовать «песочницу» конструкции try<>catch()<>:
После запуска мы увидим ошибку, а это значит, что, хоть код и не является рабочим, он не остановил выполнение оставшейся корректной части.
А вот теперь мы зададимся вопросом, как такая схема может быть связана с шифрованием строки «getElementById»? А вот так:
После выполнения этого кода у нас получится строка «getElementById», содержащаяся в переменной «x».
В чем соль этого метода? В том, что эвристический анализ антивирусов при нахождении функций будет ругаться на то, что они не существуют. Тем самым мы обфусцируем код не на уровне шифровки строк разными способами, а на уровне получения данных строк от самого JavaScript.
Числа с помощью оператора «
» (тильда) является битовым отрицанием и используется вот так: «alert(
13);». Этот код выведет нам «-14». Работает данный оператор по принципу «-(число+1)».
Представим, что мы хотим присвоить переменной «a» какое-нибудь число, причем нигде это число не писать: «a =
[]»;
Данный код присвоит переменной «a» число «-1». Почему? Потому что массив представляет собой нейтральный элемент с числовым значением «0», следовательно,
0 равносильно «-(0+1)», то бишь -1.
Примеры других преобразований:
Буквы и строки без строковых данных
Иногда требуется получить букву/символ или какой-то текст без его явного написания. Сделать это позволяет одна особенность JavaScript. В этом языке существуют различные внутрисистемные сообщения, которые можно преобразовать в текст, а затем этот текст обработать.
Например, представим, что нам нужно получить текст «code». Эта строка содержится в именах таких методов, как charCodeAt(), fromCharCode() и других. Получить текст можно следующим образом:
В данном примере переменная «a» будет содержать текст «code». Разберем подробнее. Попробуй исполнить вот такой код: «alert(alert+»);». Ты увидишь что-то вроде «function alert() < [native code] >». Тем самым, использовав всего-навсего два раза функцию alert(), мы получили совершенно другие символы.
Теперь постараемся понять, как это все работает. Представим, что у каждого объекта, функции и всего остального в JavaScript есть некое «описание». Чтобы получить к нему доступ, нужно явно изменить тип данного объекта или функции на строковой, присоединив, например, пустую строку (+»»).
Шифровка строк
Для шифровки/расшифровки строк в JavaScript существуют несколько полезных функций. Разберем некоторые из них:
Также есть два метода объекта String, которые работают с преобразованием символа в ASCII-код и наоборот:
Стоит учесть, что строки можно преобразовывать еще и регулярными выражениями в сочетании с методами .match и .replace. Другие методы можно отнести, скорее, к поиску по строке.
Преобразование объектов/переменных
Имена объектов и переменных можно также преобразовать в строку (например, чтобы потом эту строку зашифровать). Преобразование происходит по тому же принципу, что и преобразование имен методов, то есть с помощью перехода из формы «.метод» в форму «[метод]». Для корректного преобразования нужно найти еще более высокий в иерархии объектов элемент, который бы имел внутри себя слово «document». Имя ему this. Согласно стандартам JavaScript, this не является объектом, а является оператором, возвращающим ссылку на объект. В результате теперь мы можем безболезненно использовать getElementById таким образом: «this[«document»][«getElementById»]».
Привязка кода
- привязка к домену // location.href.split(‘/’)[2];
- привязка к параметрам (передаются странице после #?) // location.href.split(‘#’)[1] или location.href.split(‘?’).slice(1);
- привязка к дате // a = new Date();
- привязка к коду JavaScript // ;
- привязка к коду всей страницы // a = document.getElementsByTagName(‘html’)[0].innerHTML;
- привязка к браузеру // a = navigator.userAgent;
- привязка к куки-записям // document.cookie;
- любые другие привязки, которые можно придумать.
Избегание подозрительных функций
Советую также избегать явное использование функций eval(), document.write() и других. При поиске настоящего кода люди часто используют метод подстановки alert() вместо данных функций, так как после этого код можно сразу прочитать таким, каким мы его начинали шифровать, следовательно, весь смысл обфускации пропадает. Как же выполнить код, не используя фунцкию eval()?
Вспомним про то, что во главе всего стоит оператор this. С помощью него функцию eval() можно превратить вот в такой код:
После такого преобразования мы спокойно сможем использовать «a()» вместо «eval()».
Изменение на нечитаемые строки
- «o», «O», «0»
- «i», «I», «l», «1»
- «_» (и варианты «__» , «___» . )
- «$» (и варианты «$$» , «$$$» . )
Шифрование кода
Способов шифровки текста существует неограниченное количество, хотя все они основаны на использовании каких-либо текстовых/числовых функций. Часто работает конструкция: eval() + функция_расшифровки() + шифрованная_строка. Попробую без лишней воды показать один из таких способов.
Допустим, нам нужно зашифровать строку «alert(1);». Мне пришло в голову брать по два символа из нее, переводить их в числа (ASCII код), считывать их и рядом ставить первый символ в чистой (без перевода) форме. Только стоит учесть, что, разделяя код на такие двухбуквенные части, мы получим код примерно в 2-2,5 раза больше оригинала, а также нельзя забывать, что такие блоки лучше как-то разделять (как элемент массива или через разделитель). За разделитель возьмем знак «%», так как он делает шифрованную строку похожей на URL-строку. Напишем простой PHP-скрипт:
Вот что у нас получилось: « %a205%e215%t156%190%;59 ».
А теперь напишем дешифровщик этого кода на JavaScript:
Вызов кода в таком случае будет выглядеть так: «eval(d(‘%a205%e215%t156%190%;59’));».
Теперь остается только немного обфусцировать весь этот скрипт. Мы не будем использовать все описанные методы, а затронем лишь некоторые из них:
- z = ‘. ‘ Здесь переменной присваевается текст, который был получен переводом строки split!slice!length!fromCharCode!substr!charCodeAt в шестнадцатеричны вид (\x73\x70\x6C\x69\x74. ) без «\х»;
- _=»;for(. > Тут мы переводим обратно split!slice!length!fromCharCode!substr!charCodeAt в переменную «_»;
- _=_. (‘!’); Разделяем строку в тех местах, где есть символ «!»;
- function ___(__) <. >Описанная выше функция d() в обфусцированном виде;
- this[‘\x65\x76\x61\x6C’](. ); Декодирование строки и запуск кода.
Напоследок
Ну что ж, подведем итоги. При комбинации всех этих способов можно быть на 100% уверенным, что простой или даже средний пользователь не сможет прочитать или скопировать к себе твой код. Но так как специалисты по компьютерной безопасности прекрасно знают о большинстве данных трюков, а также потому что я выкладываю эту информацию на всеобщее обозрение, могу предположить, что данные методы станут более популярными и известными. Я надеюсь, что ты сможешь использовать представленную информацию в благих целях.
Делаем скрипт читаемым
Журнал Хакер, Сентябрь (09) 152
|qbz| (lopuxin.iv@yandex.ru, http://essenzo.net).
Прячем JavaScript-код на фронтенде от посторонних
Давайте представим ситуацию, когда вы и ваша команда пишете интересный и сложный код на JavaScript. Причём этот код в кратчайшие сроки нужно использовать в проекте. Если его функциональность действительно уникальна, то в процессе разработки и у вас, и у членов команды вполне резонно возникнет вопрос: «Как защитить код от копирования?».
Как защитить код: веб-сокеты, крипторы и обфускация
Разумеется, все мы прекрасно понимаем, что JavaScript выполняется на стороне браузера. И любой зашифрованный код всегда можно расшифровать, если знать принципы работы браузера. Поэтому можно попробовать лишь затруднить понимание данного кода, а это, в свою очередь, очень сильно помешает злоумышленнику модифицировать его под свои нужды.
Итак, есть несколько вариантов защиты кода:
- Использовать веб-сокеты.
- Использовать крипторы.
- Сделать обфускацию кода.
Крипторы приводят код в нечитаемый вид, используя, как правило, base64 (что неизбежно приводит к увеличению объёма кода примерно на 30%). Затем к полученному результату прибавляется так называемая «соль» — набор символов, который при разборе кода функцией-дешифровщиком используется в качестве ключа. Ну а потом вся строка кода обычно выполняется через eval(). Проблема крипторов в том, что если понять принцип их работы, отсечь «соль» и декодировать, то сразу становится доступен весь код в его исходном виде.
Обфускаторы же изменяют сам код, вставляя между операторами нечитаемые символы, меняя имена переменных и функций на набор визуально непонятных символов. При этом объём кода также сильно увеличивается из-за вставки дополнительного псевдокода, а также замены символов на hex, когда любые символы переводятся в их hex-значения (например, латинская буква ‘e’ может быть записана как ‘\x65’, причём это прекрасно интерпретируется любым браузером). Можете посмотреть, как работает перевод в hex через любой сервис Text To Hex, например на Crypt Online.
Применение обфускаторов сильно усложняет дальнейшую отладку кода, поскольку это необратимый процесс. К тому же в некоторых случаях они могут повлиять на функциональность кода. Попробовать обфускаторы можно на любом сервисе обфускации, к примеру этом или этом. Также в Сети можно найти платные крипторы-обфускаторы, в настройках которых вы сможете указывать степень защиты, время жизни скрипта и прочее, при этом скрипт будет намертво привязан к вашему домену, т.е. для дешифровки будет использоваться уникальное для вашего хоста значение. Стоимость таких крипторов начинается от 45 $. Кроме этого, перед обфускацией вы можете предварительно минимизировать код, заменив все имена переменных и функций на их односимвольные синонимы. Отличный и очень популярный инструмент на Node.js — UglifyJS, который работает как в автоматическом режиме (скажем, через Gulp), так и в режиме командной строки.
Также есть всем известный Closure Compiler от Google, который кроме минимизации анализирует JavaScript-код, удаляет мёртвый код, переписывает и сводит к минимуму то, что осталось. Он также проверяет синтаксис, ссылки на переменные и типы и предупреждает об общих ошибках JavaScript. Имеет хорошо документированный API.
Кроме предложенных методов можно сделать следующее:
- использовать WebStorage и скрывать там JavaScript код;
- прятать часть кода в отдельном файле на сервере и вызывать его через XMLHttpRequest ;
- использовать побитовые операторы для замены чисел на наборы скобок и знака
Всё это, разумеется, не станет стопроцентной защитой. Тем не менее чем сложнее процесс дешифровки, тем больше шансов, что после множества неудачных попыток любители копировать чужой код оставят ваш сайт в покое.
Зашифровка кода на примере JavaScript-калькулятора
Не так давно я разработал JavaScript-калькулятор для расчёта стоимости услуг, с большим количеством взаимосвязанных параметров. Руководство поставило задачу защитить данный скрипт от копирования, чтобы конкуренты не смогли использовать его на своих сайтах. Искал различные решения, ничего подходящего не нашёл, поэтому начал писать собственное. Представляю его ниже.
Обращаю ваше внимание на то, что любой код можно расшифровать, просто для этого нужно время. Поэтому данное решение, разумеется, не идеально. Тем не менее, чтобы его раскрыть, требуется время, внимательность и усидчивость. И это может оттолкнуть ваших конкурентов от идеи скопировать ваш скрипт. Большинство из них после нескольких неудачных попыток просто будут искать аналог похожего скрипта на других ресурсах.
По итогам работ в браузере вы увидите нечто такое:
При этом все зашифрованные скрипты будут работать корректно. Опытный взгляд программиста сразу визуально определит кодирование через base64. Но при попытке расшифровать строку любым base64 декодером, будет ошибка. Если вставить скрипт в alert (такой метод также рекомендуют на форумах для дешифровки кода), то результат также будет нулевым.
При этом никто ведь не знает, что здесь зашифрован именно скрипт. Это может оказаться какой-то параметр, текст или изображение. Через base64 можно зашифровать всё что угодно.
Поищем в коде функцию glob() , которой передаётся шифрованная строка. Вот она: glob=function(s) Видим ещё несколько функций sfd() и rty() . Ищем эти функции. Вот они: На этом месте многие закончат попытки расшифровки и оставят ваш сайт в покое. Рассмотрим алгоритм подробнее. Первым делом указываем в футере сайта путь на скрипт и тут же кодируем его: В строке выше мы говорим интерпретатору PHP взять файл script.js, далее закодировать его через base64, прибавить строку ‘K’ и всё это записать в переменную $filebase64 . Добавление строки ‘K’ (это может быть любая латинская буква или комбинация букв или цифр) защищает нас от того, что желающий скопировать ваш скрипт расшифрует его с помощью alert() или онлайн-дешифратора. Ведь с дополнительными символами скрипт не будет работоспособен. Затем где-то дальше в коде вызываем скрипт: Пусть этот скрипт вызывается отдельно, подальше от других скриптов и ссылок на скрипты. Далее где-то в файле с общими скриптами сайта, отдельно от других скриптов, вставляем вызов функций дешифровки. Вставлять можно независимо от других функций и библиотек. Разбираем подробно что здесь происходит. Наша основная функция glob() принимает один параметр s . Он сразу передаётся функции substring() с параметром — [] (это равно 1 в зашифрованном виде), которая извлекает из s строку начиная с первого символа и до конца. Следовательно, если мы в PHP-коде в качестве строки прибавляли более одного символа, скажем три, то нам нужно будет в функции substring() указать 2+(- []) . Либо путём шифрования цифр через побитовые операторы мы можем создать запутанную формулу, часть переменных которой мы можем прятать в cookies или sessionStorage, что сделает крайне затруднительным понимание того, какое количество символов необходимо отбросить для дешифровки кода. Пример замены цифр через побитовый операторКак защитить JavaScript от копирования на своём сайте
-1 можно заменить на
Далее полученный результат принимает функция rty() . Эта функция представляет собой набор символов, в частности: this[«\x61\x74\x6F\x62»] ;
Попробуйте ввести это в консоли браузера и вы увидите, что на самом деле делает эта функция. Например, вы увидите:
Т.е. набор символов — это зашифрованная функция atob() , которая, согласно описанию на MDN, декодирует строку, закодированную с использованием base64.
Результат декодирования получает функция sfd() . Она также представляет собой набор символов: this[«\x65\x76\x61\x6C»]; .
Вы уже догадались, что нужно сделать? Выполните в консоли браузера и вы увидите:
Здесь, думаю, уже объяснять ничего не надо. Все мы знаем, что функция eval() выполняет скрипт, полученный из строки. «Плохая практика», как сказали бы многие, для обычного кода, но в нашем случае это безопасная и нужная функция для реализации нашей идеи. К тому же напрямую к этой функции пользователь не сможет получить доступ.
Наверное, вы задались вопросом, а каким же образом функции зашифрованы в наборе символов? Очень просто: набор символов — это текст, преобразованный в шестнадцатеричную систему счисления. Т.е. это текст в формате hex (hexadecimal), в котором можно зашифровать любые символы.
Таким образом, наша расшифрованная функция выглядит так (специально разбил по строчкам, чтобы было наглядно):
В итоге отбрасываем первый символ шифрованной строки (при этом символов может быть хоть 353, и об этом никто не сможет быстро догадаться), потом дешифруем, потом выполняем через eval() .
Вы можете пойти и дальше. Если каким-то образом кто-то всё же расшифрует ваш скрипт, немного усложните его, чтобы людям было сложнее модифицировать его. Например, можно поговорить о побитовом операторе ^ , c помощью которого можно творить чудеса. Например, a^b^b будет равно a . В качестве b может быть использован ключ, который мы зашифруем где-то выше…
Всё будет работать как и раньше, но собьёт с толку нехороших копипастеров.