обфусцировать код что это
Обфускация как метод защиты программного обеспечения
Или то, почему вы не можете издать свою улучшенную версию Counter Strike и уехать жить на Гавайи.
О чём речь?
Красивый пример из Википедии кода, прошедшего обфускацию.
Далее в программе
Как это должно работать?
Состояние дел сейчас
Зачем это нужно?
Так же, алгоритмы обфускации активно используются не только для затруднения анализа кода, но и для уменьшения размера программного кода, что, в свою очередь, активно используется при разработке различных веб-сервисов и баз данных.
Как это должно работать?
Как понятно из вышесказанного, методы обфускации должны усложнить код, преобразовав его таким образом, чтобы скрыть от третьих лиц логику его работы.
Как это работает
Большинство методов обфускации преобразуют следующие аспектов кода:
• Данные: делают элементы кода похожими на то, чем они не являются
• Поток кода: выставляют исполняемую логику программы абсурдной или даже недетерминированной
• Структура формата: применяют различное форматирование данных, переименование идентификаторов, удаление комментариев кода и т.д.
Инструменты обфускации могут работать как с source или байт кодом, так и с бинарным, однако обфускация двоичных файлов сложнее, и должна варьироваться в зависимости от архитектуры системы.
При обфускации кода, важно правильно оценить, какие части когда можно эффективно запутать. Следует избегать обфускации кода, критичного относительно производительности.
Методы
1. Преобразование данных
Одним из наиболее важных элементов обфускации является преобразование данных, используемых программой, в иную форму, оказывающее минимальное виляние на производительность кода, но значительно усложняющее хакерам возможность обратного инжинирнга.
По ссылке можно ознакомится с интересными примерами использования двоичной формы записи чисел для усложнения читабельности кода, а так же изменений формы хранения данных и замены значений различными тождественными им выражениями.
2. Обфускация потока управления кодом
Обфускация потока управления может быть выполнена путем изменения порядка операторов выполнения программы. Изменение графа управления путем вставки произвольных инструкций перехода и преобразования древовидных условных конструкций в плоские операторы переключения, как показано на следующей диаграмме.
3. Обфускация адресов
Данный метод изменяет структура хранения данных, так чтобы усложнить их использование. Например алгоритм, может выбирать случайными адреса данных в памяти, а также относительные расстояния между различными элементами данных. Данный подход примечателен тем, что даже если злоумышленник и сможет «декодировать» данные, используемые приложением на каком-то конкретном устройстве, то на других устройствах он всё равно не сможет воспроизвести свой успех.
4. Регулярное обновление кода
Этот метод предотвращает атаки, регулярно выпуская обновления обфусцированного программного обеспечения. Своевременные замены частей существующего программного обеспечения новыми обфусцированными экземплярами, могут вынудить злоумышленника отказаться от существующего результата обратного анализа, так как усилия по взлому кода в таком случае могут превысить получаемую от этого ценность.
5. Обфускация инструкций ассемблера
Преобразование и изменение ассемблерного когда также может затруднить процесс обратного инжиниринга. Одним из таких методов является использование перекрывающихся инструкций (jump-in-a-middle), в результате чего дизассемблер может произвести неправильный вывод. Ассемблерный код также может быть усилен против проникновения за счёт включения бесполезных управляющих операторов и прочего мусорного кода.
6. Обфускация отладочной информации
Отладочную информацию можно использовать для обратного проектирования программы, поэтому важно блокировать несанкционированный доступ к данным отладки. Инструменты обфускации достигают этого, изменяя номера строк и имена файлов в отладочных данных или полностью удаляя из программы отладочную информацию.
Заключение
Я не стал описывать историю развития различных подходов к обфускации, так как на мой взгляд, она неплохо отражена в уже существующей на Хабре статье.
Данная статья была написана в 2015 году, и мне не удалось найти в интернете существенного количества статей и иных материалов на тему моего поста, накопившихся за это время. На мой взгляд, в наш век всё большую популярность приобретает разработка всевозможных веб приложений, которые мало нуждаются в обфускации в качестве метода защиты информации. Однако как раз таки сжатие исходного кода программ, при помощи методов обфускации в таких приложениях зачастую оказывается полезным.
В заключение, хотел бы добавить, что при использовании методов обфускации не следует пренебрегать и прочими методами защиты вашего кода, ведь обфускация далеко не серебряная пуля в вопросе защиты программ от взлома.
Ссылки и источники
[3] Barak B., Goldreich O., Impagliazzo R., Rudich S., Sahai A., Vadhan S. and Yang K. «On the (im) possibility of obfuscating programs.» CRYPTO 2001.
Обфускация и деобфускация кода: всё про этот метод защиты ПО
Обфускация кода
Обфускацию применяют все: как создатели программ, так и создатели вирусов, чтобы обезопасить свой код от чужого вмешательства.
Обфусцированный код представляет собой запутанный программный код, в котором сложно проследить хоть какие-то логические взаимосвязи. Поэтому такой код очень трудно изучать, трансформировать и, тем более, модифицировать под свои потребности — это усложняет жизнь посторонним лицам, которые задались целью изучить уникальный алгоритм функционирования обфусцированной программы. В роли таких посторонних лиц могут выступать как злоумышленники, так и рядовые программисты, которые, допустим, хотят клонировать успешную программу.
Обфускация — это всего лишь дополнительный способ обезопасить код программного продукта, который часто используется с дополнительными инструментами защиты, такими как:
В качестве единственного инструмента защиты кода, обфускация не способна дать 100%-ую защиту.
Обфускация: алгоритмы и оценка процесса
Обфускация кода проводится сторонними независимыми программами — обфускаторами. Обфускаторы «запутывают» код программ по определенным алгоритмам. Алгоритмы обфускации разрабатывались, отталкиваясь от потенциальных возможностей различных языков программирования. Поэтому алгоритмы обфускации есть:
Примеры алгоритмов обфускации:
Обфускация и ее алгоритмы измеряются несколькими параметрами, которые характеризуют эффективность ее применения, например:
Обфускация кода: виды
Обфускацию можно распределить на несколько видов, которые зависят от метода модифицирования кода программы. Различают следующие виды:
Деобфускация
Что такое обфускация? Это процесс «запутывания» кода. Но когда мы размышляем об обфускации, то в любом случае появляется вопрос: а существует ли обратный процесс, чтобы можно было «распутать» «запутанный» код?
Однозначного ответа на этот вопрос нет. То есть, программы для выполнения обфускации есть, а таких программ, чтобы обфусцированный код приводили в первозданный образ – нет. Однако сам процесс деобфускации существует.
Под деобфускацией понимают процесс при котором «запутанный» код становится более читабельным и понятным. По сути, это и есть процесс оптимизации кода, который рассчитан на удаление всего лишнего из кода. А как мы помним, при обфускации добавляется много «мусорного» ненужного кода, который затрудняет чтение кода программы.
В большинстве компиляторов процесс оптимизации кода встроен по умолчанию. Поэтому считается, что обфускация программ на высокоуровневых языках программирования менее продуктивна, так как после прохождения кода программы через компилятор он подвергнется оптимизации.
Получается, что деобфускация кода — это и есть оптимизация кода. Но и это еще не все. К процессу деобфускации кода можно отнести еще процедуру декомпиляции программного кода. При декомпиляции программ из двоичного кода на выходе получается более-менее понятное представление исходного кода программы на каком-либо языке программирования высокого уровня. А это значит, что процед уру реверсивной инженерии после декомпиляции осуществить легче.
Также к процессу деобфускации подключаются дополнительные инструменты в виде статического и динамического анализа программ.
В конечном итоге получаем, что деобфускация — это не какая-то конкретная программа, а это комплекс мер, связанных с оптимизацией, декомпиляцией и анализом обфусцированного кода.
Заключение
Обфускация кода — это всего лишь дополнительный инструмент для защиты кода от постороннего несанкционированного вмешательства. В качестве единственного инструмента защ иты да нный процесс практически не имеет ценности. Но в совокупности с другими инструментами защиты он существенно снижает вероятность изучения исходного кода программы.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Обфускация кода — что это такое и для чего нужно?
Обфускация [кода] — преднамеренное сокрытие программного кода путём его запутывания с сохранением работоспособности [продукта].
Процедура выполняется вручную (долго, сложно привести в исходный вид — то есть «деобфусцировать») или автоматически (быстро, выполняется специальными программами «обфускаторами» с функцией «деобфускации»). Задачу выполняет программист с той целью, чтобы никакой другой программист не смог прочитать программный код и расшифровать алгоритмы обфускатора.
Для чего нужен обфусцированный код
Прежде всего, обфускация кода делается для безопасности программного продукта. Разработчик может преследовать и коммерческие цели (конкурентная защита от подделки или сокрытие значений/логики). В результате получается сжатый (удалены неиспользуемые классы, атрибуты, методы) или оптимизированный (проверены и переписаны операторы) софт. Обфусцированный код применяется, например, на Android и Java (пример оптимизатора: R8 для Android; ProGuard для Java и Android).
Что такое обфускация кода с точки зрения эффективного управления разработкой
При управлении разработкой оценивается целесообразность и эффективность обфускации. Другими словами, на что вам, как руководителю, следует обращать внимание при выборе исполнителя или постановке такой задачи в принципе?
Скрытность
Оцените степень сокрытия алгоритмов управления программой. Целесообразно ли проведение control-flow обфускации (применяется, например в Apple FairPlay для библиотек iTunes или iOS), когда отслеживается обновление управляющей переменной и заменяется переход к узлу диспетчера переходами к следующему блоку, что соответствует новому значению управляющей переменной.
Стоимость
Рентабельность метода обфускации. Необходимо оценить, насколько оправданы затраты, чтобы выбранный метод можно было широко применять в нескольких аналогичных приложениях.
Защита
В какой степени преобразованный код нечитаем в сравнении с исходным. Метрики сложности программного обеспечения определяют различные меры защиты. Например, количество содержащихся в нем предикатов, глубина иерархии, уровни вложенности и так далее. Цель хорошего проектирования программного обеспечения — минимизировать сложность на основе этих параметров, когда как цель обфускации — максимально усложнить.
Стабильность
Определяет, насколько хорошо преобразованный код может противостоять автоматическим атакам деобфускации. Наивысшая степень устойчивости — одностороннее преобразование, которое не может быть отменено деобфускатором. Например, обфускация удаляет такую информацию, как форматирование исходного кода.
Если программист или компания разработчиков выпускают ценное программное обеспечение (например, приложение для iOS или Android) с закрытым исходным кодом, то обфускация должна быть частью процесса разработки. Это усложняет взлом, анализ и отладку кода извне.
Добыть полезную информацию, коммерческую тайну или пользовательские учётные данные будет значительно сложнее, чем если бы разработчик не проводил процедуру обфускации.
С другой стороны, злоумышленники используют обфускацию в целях сокрытия или интеграции вредоносного кода в безопасных на первый взгляд программных продуктах. Задача антивирусов заблаговременно обнаруживать такие методы в запускаемых программах.
Обратитесь в компанию ИТ-аутсорсинга для дальнейшей экспертной поддержки и консультации по этой теме и любым другим техническим вопросам.
Обфускация программ
Обфускация программ — это прорывная, самая горячая сегодня, область криптографии. За последние два года написано свыше 70ти статей по этой теме, она вызывает жаркие дискуссии, создает настоящие гонки между исследовательскими группами, открывает полигон для научных изысканий. Более того, оказывается, что обфускация — фундаментальный, образующий примитив, который порождает практически всё, что мы имеем в криптографии сегодня. Разберемся, с тем что же это такое.
Давая пользователям доступ к установочным файлам программ, компании неизбежно раскрывают свои профессиональные секреты и наработки, и ничто не останавливает злобонравных конкурентов от беззастенчивого копирования и воровства чужих алгоритмов. Обратим внимание и на другой пример, это важные обновления (патчи), исправляющие ошибки в операционных системах. Почти мгновенно очередное обновление анализируется хакерами, они выявляют проблему которую это обновление чинит, и атакуют несчастных, не успевших вовремя обновиться, пользователей. Эти две ситуации связывает одна фундаментальная проблема, а именно: написанная человеком программа может быть человеком же и понята, проанализирована, разобрана. А что если существовал бы алгоритм, который бы мог до неузнаваемости, необратимо переделать программу при этом сохраняя ее функциональность? Так чтобы программу совершенно невозможно было бы понять, но при этом она работала бы ничуть не хуже исходной? Такой алгоритм и называется «обфусцирующий» или «обфускатор».
В распоряжении разработчиков на данный момент не существует хороших обфускаторов, а те обфускаторы, которые широко используются сегодня, весьма примитивны — они могут переставлять инструкции, заменять имена переменных, вставлять куски кода, которые на самом деле имеют нулевой эффект и делать аналогичные вещи, которые в целом можно назвать «безопасность через непонятность». Но такие обфускации при небольшом усердии легко деобфусцировать, а потому это не преграда для хороших хакеров.
Но что же конкретно мы хотим от обфускатора? «Невозможность понять программу» которую он выдает звучит весьма туманно…
В 2013 [2] году в этой области был совершен прорыв, теоретиками было вытащено на свет другое определение и предложена настоящая конструкция для него. Этот новый вид обфускатора называется «Обфускация Неразличимости» («Indistinguishability Obfuscation» — «iO»), формально: если имеются две разные программы, но с абсолютно идентичными функциональностями, то обфускации этих двух программ будут неотличимы друг от друга. То есть, если я имею программы P1, P2, такие что для любого входа x, P1(x) = P2(x), а O — это обфускатор неразличимости, который принимает на вход программу P и возвращает новую программу O(P), то невозможно будет отличить O(P1) и O(P2). То есть вы не сможете сказать, какая обфускация какой изначальной программе принадлежит, то ли O(P1) — это обфускация P1, то ли это обфускация P2. (Обфускатор O — вероятностный алгоритм). На первый взгляд, не понятно, на сколько хорош такой обфускатор. Ответ на этот вопрос, о котором рассказывается в следующих двух параграфах, сотряс сообщество криптографов.
В 2007 [3] году был исследован «лучший» обфускатор. Было предложено называть обфускатор «лучшим», если обфусцированная программа сообщает не больше информации, чем любая другая программа с той же функциональностью. И было показано, что Обфускатор Неразличимости — это и есть «лучший» обфускатор. Таким образом конструкция-кандидат лучшего обфускатора на свете уже у нас в кармане! И скоро не надо будет изощряться в перепутывании инструкций и переименовании переменных.
То есть фактически, Обфускатор Неразличимости это примитив, образующий чуть ли не всю криптографию, с помощью которого можно построить практически всё, что мы имеем в криптографии сегодня. Конечно, требуется еще много работы прежде чем обфускатор станет доступен для широкого использования, но фундамент для этого уже заложен.
Прячем, обфусцируем и криптуем клиентскую часть веб-приложений
Обфусцированный скрипт
Теория
Работа JJEncode
Базовое шифрование HTML/CSS
Что делать, если нам нужно зашифровать HTML или CSS код? Все просто: зашифровать на JavaScript, а после расшифровки вставить как HTML код.
Пример вставки (без шифровки/крипта/обфускации):
Точно так же мы поступим и с CSS-стилями:
Теперь постараемся абстрагироваться от HTML и CSS и поговорить только о самой сути — сначала скрытии, а затем и криптовке JavaScript.
Прежде, чем кто-либо захочет посмотреть и расшифровать наш код, он постарается его найти. Ниже ты найдешь несколько действенных методов сокрытия кода от глаз любопытных пользователей.
Прячем слово «][akep» в теле документа
Замена атрибутов тега
А теперь просто создадим папку «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
Нуллбайт атакует Оперу
Этот метод прост и достаточно эффективен, но, к сожалению, он рассчитан только на браузер Opera. Суть метода в том, чтобы перед скрываемым кодом поставить так называемый нуллбайт (нуллбайт или nullbyte — это символ с ASCII кодом «0»). Зачем? Затем, что Opera просто-напросто не показывает код во встроенном просмотрщике после данного символа. Пример:
В данном примере сначала идет нормальный код, который нам скрывать не требуется. Потом с помощью PHP мы вставляем нуллбайт, а после него идет скрываемый код.
Прячемся в HTML-коде и комментариях
Код можно легко спрятать в HTML, затем обработать его и выполнить. Например, вот так:
В данном случае мы спрятали код в атрибутах тега img, после чего обработали код всей страницы, собирая разбросанные кусочки. Таким же способом можно скрывать текст в HTML/JavaScript комментариях:
Отдельно стоит отметить, что очень эффективно можно прятать код внутри популярных фреймворков — например, jQuery, mooTools и подобных. Эти файлы не являются подозрительными, а исследование их займет много времени (хотя всегда существует возможность автоматического сравнения оригинала и измененного файла).
Теперь же, думаю, можно поговорить о том, что, в конце концов, видит эксперт безопасности, и о том, что исследуют антивирусы. Ниже читай о наиболее популярных методах криптовки и обфускации JS-кода.
Субституция стандартных функций/методов JavaScript
Данный метод ориентирован на то, чтобы вместо стандартных функций или методов 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», следовательно,
Буквы и строки без строковых данных
Иногда требуется получить букву/символ или какой-то текст без его явного написания. Сделать это позволяет одна особенность JavaScript. В этом языке существуют различные внутрисистемные сообщения, которые можно преобразовать в текст, а затем этот текст обработать.
Например, представим, что нам нужно получить текст «code». Эта строка содержится в именах таких методов, как charCodeAt(), fromCharCode() и других. Получить текст можно следующим образом:
В данном примере переменная «a» будет содержать текст «code». Разберем подробнее. Попробуй исполнить вот такой код: «alert(alert+»);». Ты увидишь что-то вроде «function alert() < [native code] >». Тем самым, использовав всего-навсего два раза функцию alert(), мы получили совершенно другие символы.
Теперь постараемся понять, как это все работает. Представим, что у каждого объекта, функции и всего остального в JavaScript есть некое «описание». Чтобы получить к нему доступ, нужно явно изменить тип данного объекта или функции на строковой, присоединив, например, пустую строку (+»»).
Шифровка строк
Для шифровки/расшифровки строк в JavaScript существуют несколько полезных функций. Разберем некоторые из них:
Также есть два метода объекта String, которые работают с преобразованием символа в ASCII-код и наоборот:
Преобразование объектов/переменных
Имена объектов и переменных можно также преобразовать в строку (например, чтобы потом эту строку зашифровать). Преобразование происходит по тому же принципу, что и преобразование имен методов, то есть с помощью перехода из формы «.метод» в форму «[метод]». Для корректного преобразования нужно найти еще более высокий в иерархии объектов элемент, который бы имел внутри себя слово «document». Имя ему this. Согласно стандартам JavaScript, this не является объектом, а является оператором, возвращающим ссылку на объект. В результате теперь мы можем безболезненно использовать getElementById таким образом: «this[«document»][«getElementById»]».
Привязка кода
Избегание подозрительных функций
Советую также избегать явное использование функций eval(), document.write() и других. При поиске настоящего кода люди часто используют метод подстановки alert() вместо данных функций, так как после этого код можно сразу прочитать таким, каким мы его начинали шифровать, следовательно, весь смысл обфускации пропадает. Как же выполнить код, не используя фунцкию eval()?
Вспомним про то, что во главе всего стоит оператор this. С помощью него функцию eval() можно превратить вот в такой код:
После такого преобразования мы спокойно сможем использовать «a()» вместо «eval()».
Изменение на нечитаемые строки
Шифрование кода
Способов шифровки текста существует неограниченное количество, хотя все они основаны на использовании каких-либо текстовых/числовых функций. Часто работает конструкция: eval() + функция_расшифровки() + шифрованная_строка. Попробую без лишней воды показать один из таких способов.
Допустим, нам нужно зашифровать строку «alert(1);». Мне пришло в голову брать по два символа из нее, переводить их в числа (ASCII код), считывать их и рядом ставить первый символ в чистой (без перевода) форме. Только стоит учесть, что, разделяя код на такие двухбуквенные части, мы получим код примерно в 2-2,5 раза больше оригинала, а также нельзя забывать, что такие блоки лучше как-то разделять (как элемент массива или через разделитель). За разделитель возьмем знак «%», так как он делает шифрованную строку похожей на URL-строку. Напишем простой PHP-скрипт:
Вот что у нас получилось: « %a205%e215%t156%190%;59 ».
А теперь напишем дешифровщик этого кода на JavaScript:
Вызов кода в таком случае будет выглядеть так: «eval(d(‘%a205%e215%t156%190%;59’));».
Теперь остается только немного обфусцировать весь этот скрипт. Мы не будем использовать все описанные методы, а затронем лишь некоторые из них:
Напоследок
Ну что ж, подведем итоги. При комбинации всех этих способов можно быть на 100% уверенным, что простой или даже средний пользователь не сможет прочитать или скопировать к себе твой код. Но так как специалисты по компьютерной безопасности прекрасно знают о большинстве данных трюков, а также потому что я выкладываю эту информацию на всеобщее обозрение, могу предположить, что данные методы станут более популярными и известными. Я надеюсь, что ты сможешь использовать представленную информацию в благих целях.
Делаем скрипт читаемым
Журнал Хакер, Сентябрь (09) 152
|qbz| (lopuxin.iv@yandex.ru, http://essenzo.net).