Обфускация что это такое
Обфускация
Обфуска́ция (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать неочевидным, запутанным, сбивать с толку) или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
«Запутывание» кода может осуществляться на уровне алгоритма, исходного текста и/или ассемблерного текста. Для создания запутанного ассемблерного текста могут использоваться специализированные компиляторы, использующие неочевидные или недокументированные возможности среды исполнения программы. Существуют также специальные программы, производящие обфускацию, называемые обфускаторами (англ. Obfuscator ).
Содержание
Цели обфускации
Технологии
На уровне исходных текстов
На JavaScript, VBScript и подобных скрипт-языках пользователю доступен исходный текст программы. В этом случае форматированием текста и заменой имён можно сделать текст менее читаемым.
Код после обфускации:
На уровне машинного кода
Как правило, обфускация на уровне машинного кода уменьшает скорость выполнения и соответственно увеличивает время выполнения программы. Поэтому она применяется в критичных к безопасности, но не критичных к скорости местах программы, таких как проверка регистрационного кода.
Простейший способ обфускации машинного кода — вставка в него недействующих конструкций (таких как or ax, ax )
На уровне промежуточного кода
Назначение
Усложнение исследования кода
Обфускация HTML помогает спамерам: на почтовом клиенте, который способен отображать HTML, текст читается, но антиспам-фильтр, который имеет дело с исходным HTML-файлом, пропускает нежелательное сообщение, не распознавая в нём запретной строки.
Простейший пример обфусцированного HTML:
При просмотре пользователь увидит слово «Машина», в то время как в исходном коде оно расчленено и воспринимается как два раздельных слова.
Оптимизация
В интерпретируемых языках обфусцированный код занимает меньше места, чем исходный, и зачастую выполняется быстрее, чем исходный. Современные обфускаторы также заменяют константы числами, оптимизируют код инициализации массивов, и выполняют другую оптимизацию, которую на уровне исходного текста провести проблематично или невозможно.
Проблема уменьшения размера важна, например, при программировании для сотовых телефонов на J2ME, где размер программы серьёзно ограничен. Обфускация JavaScript уменьшает размер HTML-файлов и, соответственно, ускоряет загрузку.
Недостатки
Потеря гибкости кода
Код после обфускации может стать более зависимым от платформы или компилятора.
Трудности отладки
Обфускатор не даёт постороннему выяснить, что делает код, но и не даёт разработчику отлаживать его. При отладке приходится отключать обфускатор.
Недостаточная безопасность
Хотя обфускация помогает сделать распределённую систему более безопасной, не стоит ограничиваться только ею. Обфускация — это безопасность через неясность. Ни один из существующих обфускаторов не гарантирует сложности декомпиляции и не обеспечивает безопасности на уровне современных криптографических схем. Вполне вероятно, что эффективная защита невозможна (по крайней мере в некотором конкретном классе решаемых задач).
Ошибки в обфускаторах
Современный обфускатор — сложный программный комплекс. Зачастую в обфускаторы, несмотря на тщательное проектирование и тестирование, вкрадываются ошибки. Так что есть ненулевая вероятность, что прошедший через обфускатор код вообще не будет работать. И чем сложнее разрабатываемая программа, тем больше эта вероятность.
Вызов класса по имени
Большинство языков с промежуточным кодом могут создавать или вызывать объекты по именам их классов. Современные обфускаторы позволяют сохранить указанные классы от переименования, однако подобные ограничения сокращают гибкость программ.
См. также
Источники
Полезное
Смотреть что такое «Обфускация» в других словарях:
Запутывание кода — Обфускация (от лат. obfuscare затенять, затемнять; и англ. obfuscate делать неочевидным, запутанным, сбивать с толку), или запутывание кода приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но… … Википедия
Обфускатор — Обфускация (от лат. obfuscare затенять, затемнять; и англ. obfuscate делать неочевидным, запутанным, сбивать с толку), или запутывание кода приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но… … Википедия
Безопасность через неясность — (англ. Security through obscurity) принцип, используемый для обеспечения безопасности в различных сферах деятельности человека. Основная идея заключается в том, чтобы скрыть внутреннее устройство системы или реализацию для обеспечения… … Википедия
Полный перебор — У этого термина существуют и другие значения, см. Перебор. Полный перебор (или метод «грубой силы», англ. brute force) метод решения математических задач. Относится к классу методов поиска решения исчерпыванием всевозможных… … Википедия
Игра для программистов — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете … Википедия
Программерская игра — Игра для программистов компьютерная игра, в которой человек не участвует напрямую в игре. Вместо этого он пишет управляющую программу, сражающуюся с себе подобными программами. Такие игры являются сложным и нетривиальным упражнением для… … Википедия
0day — В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена. Вы можете отредактировать эту статью … Википедия
Byte Code Engineering Library — Jakarta BCEL Тип Библиотека модификации байт кодов Разработчик Apache Software Foundation Написана на Java Операционная система Кроссплатформенное программное обеспечение Последняя версия 5.2 (6 июня 2 … Википедия
Мёртвый код — В теории компиляторов, мёртвым кодом (так же бесполезным кодом, англ. dead code) называют код, который может быть исполнен, но результаты его вычислений в дальнейшем в программе не используются[1][2][3]. Другими словами это код, определяющий … Википедия
Обфускация программ
Обфускация программ — это прорывная, самая горячая сегодня, область криптографии. За последние два года написано свыше 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] году был исследован «лучший» обфускатор. Было предложено называть обфускатор «лучшим», если обфусцированная программа сообщает не больше информации, чем любая другая программа с той же функциональностью. И было показано, что Обфускатор Неразличимости — это и есть «лучший» обфускатор. Таким образом конструкция-кандидат лучшего обфускатора на свете уже у нас в кармане! И скоро не надо будет изощряться в перепутывании инструкций и переименовании переменных.
То есть фактически, Обфускатор Неразличимости это примитив, образующий чуть ли не всю криптографию, с помощью которого можно построить практически всё, что мы имеем в криптографии сегодня. Конечно, требуется еще много работы прежде чем обфускатор станет доступен для широкого использования, но фундамент для этого уже заложен.
Обфускация и деобфускация кода: всё про этот метод защиты ПО
Обфускация кода
Обфускацию применяют все: как создатели программ, так и создатели вирусов, чтобы обезопасить свой код от чужого вмешательства.
Обфусцированный код представляет собой запутанный программный код, в котором сложно проследить хоть какие-то логические взаимосвязи. Поэтому такой код очень трудно изучать, трансформировать и, тем более, модифицировать под свои потребности — это усложняет жизнь посторонним лицам, которые задались целью изучить уникальный алгоритм функционирования обфусцированной программы. В роли таких посторонних лиц могут выступать как злоумышленники, так и рядовые программисты, которые, допустим, хотят клонировать успешную программу.
Обфускация — это всего лишь дополнительный способ обезопасить код программного продукта, который часто используется с дополнительными инструментами защиты, такими как:
В качестве единственного инструмента защиты кода, обфускация не способна дать 100%-ую защиту.
Обфускация: алгоритмы и оценка процесса
Обфускация кода проводится сторонними независимыми программами — обфускаторами. Обфускаторы «запутывают» код программ по определенным алгоритмам. Алгоритмы обфускации разрабатывались, отталкиваясь от потенциальных возможностей различных языков программирования. Поэтому алгоритмы обфускации есть:
Примеры алгоритмов обфускации:
Обфускация и ее алгоритмы измеряются несколькими параметрами, которые характеризуют эффективность ее применения, например:
Обфускация кода: виды
Обфускацию можно распределить на несколько видов, которые зависят от метода модифицирования кода программы. Различают следующие виды:
Деобфускация
Что такое обфускация? Это процесс «запутывания» кода. Но когда мы размышляем об обфускации, то в любом случае появляется вопрос: а существует ли обратный процесс, чтобы можно было «распутать» «запутанный» код?
Однозначного ответа на этот вопрос нет. То есть, программы для выполнения обфускации есть, а таких программ, чтобы обфусцированный код приводили в первозданный образ – нет. Однако сам процесс деобфускации существует.
Под деобфускацией понимают процесс при котором «запутанный» код становится более читабельным и понятным. По сути, это и есть процесс оптимизации кода, который рассчитан на удаление всего лишнего из кода. А как мы помним, при обфускации добавляется много «мусорного» ненужного кода, который затрудняет чтение кода программы.
В большинстве компиляторов процесс оптимизации кода встроен по умолчанию. Поэтому считается, что обфускация программ на высокоуровневых языках программирования менее продуктивна, так как после прохождения кода программы через компилятор он подвергнется оптимизации.
Получается, что деобфускация кода — это и есть оптимизация кода. Но и это еще не все. К процессу деобфускации кода можно отнести еще процедуру декомпиляции программного кода. При декомпиляции программ из двоичного кода на выходе получается более-менее понятное представление исходного кода программы на каком-либо языке программирования высокого уровня. А это значит, что процед уру реверсивной инженерии после декомпиляции осуществить легче.
Также к процессу деобфускации подключаются дополнительные инструменты в виде статического и динамического анализа программ.
В конечном итоге получаем, что деобфускация — это не какая-то конкретная программа, а это комплекс мер, связанных с оптимизацией, декомпиляцией и анализом обфусцированного кода.
Заключение
Обфускация кода — это всего лишь дополнительный инструмент для защиты кода от постороннего несанкционированного вмешательства. В качестве единственного инструмента защ иты да нный процесс практически не имеет ценности. Но в совокупности с другими инструментами защиты он существенно снижает вероятность изучения исходного кода программы.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
О чудесах современной криптографии: обфускация
Продолжим рассказ о том, что придумала современная криптография, помимо всем известных вещей (шифрования и цифровых подписей). В этот раз речь пойдет об обфускации программ.
Начнем с трех ситуаций:
1. разработчик добавил в игру проверку лицензии и не хочет, чтобы хакеры смогли взломать программу и удалить эту проверку;
2. программист придумал новый эффективный алгоритм и хочет продавать программы, но не хочет, чтобы кто-то узнал, как именно работает алгоритм;
3. Алисе нужно использовать симметричное шифрование (ассиметричное для нее слишком медленное). Но для этого ей нужно передать Бобу ключ, а Боб далеко. Тогда она посылает Бобу exe-шник вот такой программы:
Боб может использовать эту программу, чтобы зашифровывать сообщения для Алисы.
Обфускация черного ящика делает именно это: она позволяет переписать программу так, чтобы ее можно было использовать, но никто бы не знал, что внутри, и не мог бы ее изменить определенным образом. Фактически это все равно, что иметь черный ящик: все, что вы можете с ним сделать, это попробовать его прогнать на разных входах и посмотреть результат. Ученые надеялись, что такую обфускацию можно построить и доказать, что ее нельзя взломать.
Кстати, бесполезный факт №21: в авиации то, что называется черным ящиком, на самом деле оранжевый шар. Но мы отвлеклись..
К сожалению, оказалось, что такая обфускация не существует. Если быть точнее, то оказалось, что можно написать программу (специально для этого подобранную и в реальном мире не встречающуюся), обладание кодом которой всегда дает больше возможностей, чем обладание черным ящиком. Криптографы очень расстроились и потом 12 лет не знали, что им делать с обфускацией.
Практические обфускации. А тем временем люди пытались сделать хоть какую-то обфускацию на практике, пусть и не доказанную строго. Сейчас проводятся соревнования по обфускации, вот одна из работ:
Подобные примеры не дают никакой гарантии, что программу нельзя разобрать по кусочкам и понять, что и где она делает. Они просто пытаются запутать читателя по-максимуму. Такой принцип часто называют security through obscurity (безопасность через неясность). Вот например, вы сейчас читаете этот пост, и вам нафиг не упало разбираться, что делает эта программа. То есть какая-то защита все-таки есть. Однако, если у вас будет мотивация, вы потратите время и скорее всего взломаете эту программу.
Неразличимая обфускация. В 2013 году в теоретической криптографии случился прорыв. Помните, ученые доказали ранее, что «обфускация черного ящика» невозможна? Так вот, спустя 12 лет они построили кое-что не менее важное, а именно «неразличимую обфускацию». Эта обфускация дает гораздо, гораздо более слабые гарантии безопасности, чем обфускация черного ящика. А именно, допустим у вас есть две программы, у которых код разный, но результат всегда одинаковый, например так:
Неразличимая обфускация гарантирует, что вы не сможете отличить, какая из двух «одинаковых» программ была обфусцирована.
То есть на данный момент мы имеем обфускацию, которая во многих случаях доказуемо невзламываемая. Пока что у нее большие проблемы с эффективностью, которые делают ее неприменимой в приложениях. Например, на обфускацию простенькой программы уходят часы и гигабайты памяти. Однако наука не стоит на месте, так что подождем!
Не зря подписывался. Спасибо за интереснопосты!
О чудесах современной криптографии
Я знаю, что вы сюда деградировать приходите, но сегодня выходные, вы отдохнувшие, и я пишу этот пост с чистой совестью.
Если кто смотрел star trek: TOS «A taste of armageddon», то помнит, что там две планеты долго воевали друг с другом, но в итоге решили, что физическая война уничтожает их культурное наследие, и перешли к виртуальной войне, т.е. просто симулировали военные действия на компьютере. В фильме этого конечно нет, но вот лишь несколько проблем, с которыми им пришлось бы столкнуться:
— допустим, винтовка попадает в цель с вероятностью 9/10. Кто из враждующих планет будет решать, попала она или нет?
— допустим, снайпер сидит в укрытии и стреляет в цель. Как убедить противника, что снайпер мог поразить свою цель, не раскрывая местоположение снайпера? (например, убедить противника, что между снайпером и целью нет деревьев/стен/иных препятствий)
Когда мы играем в мморпг, все эти решения (попал/не попал) и проверки за нас делает сервер. Недостаток этого подхода в том, что серверу приходится доверять. В компьютерной игре это оправдано, но во многих случаях (в том числе в примере выше) доверять третьему лицу нежелательно, а то и вообще невозможно. Хорошие новости: все это можно сделать без всяких третьих лиц и необходимости кому-то доверять, с помощью т.н. защищенных вычислений:
1. Защищенные вычисления (secure multiparty computation). Эта штука позволяет людям вычислить любую функцию так, чтобы все узнали ответ и ничего больше (в частности, не узнали входные данные участников). Примеры:
в) Можно вычислить засекреченную функцию на засекреченных данных.
Но гомоморфное шифрование рвет шаблоны. Если я вам дам 2 зашифрованных сообщения, вы сможете их сложить, перемножить, или умножить на число. Под «сложить» имеется в виду «выполнить некие сложные действия, чтобы в итоге из зашифрованных чисел x, y (сами x, y вы не знаете, т.к. у вас нет ключа) получить зашифрованное x+y (само x+y вы тоже не знаете). Разумеется, операции можно повторять, комбинировать итд. Таким образом, имея зашированные данные, можно дохрена всего посчитать и получить зашифрованный результат.
В примере из стар трека выше это как раз и позволяет «бросить монетку» и узнать, попала винтовка или нет. Но это конечно шутливый пример, а вот более серьезный.
Возможно вы слышали скандал с американским агентсвом нац безопасности (NSA) и генератором случайных чисел. NSA участвовала в разработке местного госта по генераторам. В их задачу входило выбрать несколько случайных чисел, которые бы задавали определенную т.н. эллиптическую кривую, и опубликовать их в спецификации генератора. А дальше все бы использовали этот генератор.
4. Доказательства с нулевым разглашением (zero-knowledge proofs). По-моему, одна из самых красивых штук в крипто. Позволяет доказать утверждение, не раскрывая ничего о самом доказательстве или используемых фактах. Пример:
— вариант один: сказать суду значения p и q. Суд сможет сам проверить, что N = p*q. Минусы: все узнают ваш секретный ключ и смогут расшифровать все ваши полученные сообщения.
— вариант два: сгенерировать доказательство с нулевым разглашением для вот такого утверждения:
Все смогут проверить это заявление, но никто не узнает сами p и q. Минусы: придется объяснять суду, что такое доказательства с нулевым разглашением.
б) Еще силу таких доказательств можно продемонстрировать на такой слегка корявой системе голосования: допустим у нас есть 10 человек, и мы хотим проголосовать. При этом:
— голосование должно быть тайным
— результат должен быть проверяемым.
Вообще это очень непросто, поэтому мы решили слегка облегчить себе задачу и решили, что мы частично доверяем дяде Пете. Мы посылаем дяде Пете зашифрованные голоса. Дядя Петя их расшифровывает, подсчитывает результаты и говорит ответ.
Как вы уже догадались, у этого голосования 2 проблемы:
С первой проблемой в этой схеме придется смириться, а вот вторую, гораздо более важную проблему решить можно. Для этого дяде Пете нужно опубликовать доказательство с нулевым разглашением для вот такого утверждения:
в)Такие доказательства- неотъемлемая часть защищенных вычислений, о которых говорилось выше.
К сожалению, пост начинает превышать разумные размеры, а я написала лишь половину того, что хотела. Так что про остальные штуки будет позже. В заключение хочу сказать, что значительную часть криптографии можно объяснить на пальцах. Есть даже статья «как объяснить доказательства с нулевым разглашением вашим детям».
Защита приложения. Часть 2. Обфускация
Обфускация — следующий уровень защиты приложения. Недостаточно защитить данные паролями и привязкой к железу: такую защиту легко обойти, пронанализировав код. Мы писали об этом в предыдущей статье — «Защита приложения. Часть 1». Чтобы код нельзя было так просто просмотреть и понять — запутывайте его. Для этого и была придумана обфускация, набор методов, которые превращают понятный код в непонятную кашу.
Обфускация имеет под собой серьёзные теоретические основания. Важно не только выполнить основную задачу — запутать код, но и при этом не нанести серьёзного урона как скорости, так и функциональности приложения.
Наибольшую популярность в деле обфускации получил метод Колберга. Пусть ваша программа — А, тогда задача сводится к созданию выходного кода A’ с использованием преобразований T1, T2…Tn, опирающихся на использование библиотек L1, L2…Ln. Эффективность процессов оценивается функциями E1, E2…En. Множественность возникает из-за разбиения кода на разные по важности фрагменты, оцениваемые функциями I1, I2…ln. Так мы обеспечим максимальную защиту важнейшим участкам, при этом постараясь не проиграть в быстродействии.
Виды обфускации
Преобразования бывают четырех видов:
Лексическая обфускация — замена названий переменных и функций. Например, понятная раннее final_cost[positions] превращается в бездушную f5rq[zlp]. Или вот ещё сравните:
А если переменных не две, а полтора десятка? Читать и понимать такое сложно. Этот вид обфускации простой для быстрого применения, но малоэффективный: меняются только названия методов, а общая схема работы остается неизменной. Современные IDE умеют искать использования методов в коде, это очень упрощает анализ обфусцированного кода. Обход такой обфускации вопрос времени.
Преобразование данных более сложная и эффективная операция. Она включает в себя изменение и создание новых типов данных и применение к ним комбинаторики. Например, число 9 можно представить, как 10000000001 (количество нулей), 210019 (двоичное число между идентификаторами начала и конца), 32 (3 2 ) и ещё огромным количеством способов. Или замена выражения i=1 для простого цикла перечисления на i0=21 c последующим представлением через другие константы — i=i0/i1-i2, где i1=7, i2=2. Что касается типов данных, то в простейшем случае можно представлять 32-битные числовые данные перемножением 16-битным на некоторую переменную со значением 16.
Преобразование управления — нарушение естественного хода программы, для чего используются непрозрачные предикаты. То есть это случай, когда результат исполняемых действий трудно предугадать в ходе заданной процедуры. В простейшем случае это создание дополнительных блоков кода: в одном выполняются вычисления, в другом происходит наследование, а в каком-то общем — несколько ложных операций, лишь одна из которых действительная. В более сложных ситуациях создаётся комплексная карта замещений и трансформаций, до неузнаваемости меняющих общую структуру кода.
Профилактическая обфускация защищает ваш код от деобфускации специальными программами-деобфускаторами. Они основываются на обнаружении неиспользуемых кусков кода, нахождении наиболее сложных структур (фрагментов максимальной важности) и анализе статистических и динамических данных. Именно борьба с этими операциями — наиболее сложный и эффективный процесс обфускации. Здесь необходимо максимально точно подойти к анализу исходных данных, задействовать максимум предоставленных ресурсов, учесть подходы потенциальных оппонентов.
Без опыта ручной обфускации создать непроходимый лабиринт не получится, требуется помощь специалистов. В сети можно отыскать массу бесплатных, платных и взломанных обфускаторов. Последний вид наиболее бесполезен: программа защиты, не способная защитить себя — сомнительный выбор. Бесплатные обфускаторы неплохи, но в силу своего распространения имеют универсальный и не самый сложный подход. Плюс, надежность процедуры запутывания также можно поставить под вопрос — если программа легко доступна, то ее алгоритмы несложно проанализировать и найти обратный алгоритм. Поэтому, если вы действительно собрались хорошо заработать на своем коде — не пожалейте денег на организацию грамотной обфускации.
Хорошо запутанная программа, закрытая надёжным паролем — уже головная боль для потенциального взломщика. Но и обфускация еще не финальный оплот защиты.
В следующей части — защита от отладчиков, протекторы, лицензии и программы слежения.
А тем, кто определился с тем, что хочет стать программистом, рекомендуем профессию «Веб-разработчик».
Обфускация — следующий уровень защиты приложения. Недостаточно защитить данные паролями и привязкой к железу: такую защиту легко обойти, пронанализировав код. Мы писали об этом в предыдущей статье — «Защита приложения. Часть 1». Чтобы код нельзя было так просто просмотреть и понять — запутывайте его. Для этого и была придумана обфускация, набор методов, которые превращают понятный код в непонятную кашу.
Обфускация имеет под собой серьёзные теоретические основания. Важно не только выполнить основную задачу — запутать код, но и при этом не нанести серьёзного урона как скорости, так и функциональности приложения.
Наибольшую популярность в деле обфускации получил метод Колберга. Пусть ваша программа — А, тогда задача сводится к созданию выходного кода A’ с использованием преобразований T1, T2…Tn, опирающихся на использование библиотек L1, L2…Ln. Эффективность процессов оценивается функциями E1, E2…En. Множественность возникает из-за разбиения кода на разные по важности фрагменты, оцениваемые функциями I1, I2…ln. Так мы обеспечим максимальную защиту важнейшим участкам, при этом постараясь не проиграть в быстродействии.
Виды обфускации
Преобразования бывают четырех видов:
Лексическая обфускация — замена названий переменных и функций. Например, понятная раннее final_cost[positions] превращается в бездушную f5rq[zlp]. Или вот ещё сравните:
А если переменных не две, а полтора десятка? Читать и понимать такое сложно. Этот вид обфускации простой для быстрого применения, но малоэффективный: меняются только названия методов, а общая схема работы остается неизменной. Современные IDE умеют искать использования методов в коде, это очень упрощает анализ обфусцированного кода. Обход такой обфускации вопрос времени.
Преобразование данных более сложная и эффективная операция. Она включает в себя изменение и создание новых типов данных и применение к ним комбинаторики. Например, число 9 можно представить, как 10000000001 (количество нулей), 210019 (двоичное число между идентификаторами начала и конца), 32 (3 2 ) и ещё огромным количеством способов. Или замена выражения i=1 для простого цикла перечисления на i0=21 c последующим представлением через другие константы — i=i0/i1-i2, где i1=7, i2=2. Что касается типов данных, то в простейшем случае можно представлять 32-битные числовые данные перемножением 16-битным на некоторую переменную со значением 16.
Преобразование управления — нарушение естественного хода программы, для чего используются непрозрачные предикаты. То есть это случай, когда результат исполняемых действий трудно предугадать в ходе заданной процедуры. В простейшем случае это создание дополнительных блоков кода: в одном выполняются вычисления, в другом происходит наследование, а в каком-то общем — несколько ложных операций, лишь одна из которых действительная. В более сложных ситуациях создаётся комплексная карта замещений и трансформаций, до неузнаваемости меняющих общую структуру кода.
Профилактическая обфускация защищает ваш код от деобфускации специальными программами-деобфускаторами. Они основываются на обнаружении неиспользуемых кусков кода, нахождении наиболее сложных структур (фрагментов максимальной важности) и анализе статистических и динамических данных. Именно борьба с этими операциями — наиболее сложный и эффективный процесс обфускации. Здесь необходимо максимально точно подойти к анализу исходных данных, задействовать максимум предоставленных ресурсов, учесть подходы потенциальных оппонентов.
Без опыта ручной обфускации создать непроходимый лабиринт не получится, требуется помощь специалистов. В сети можно отыскать массу бесплатных, платных и взломанных обфускаторов. Последний вид наиболее бесполезен: программа защиты, не способная защитить себя — сомнительный выбор. Бесплатные обфускаторы неплохи, но в силу своего распространения имеют универсальный и не самый сложный подход. Плюс, надежность процедуры запутывания также можно поставить под вопрос — если программа легко доступна, то ее алгоритмы несложно проанализировать и найти обратный алгоритм. Поэтому, если вы действительно собрались хорошо заработать на своем коде — не пожалейте денег на организацию грамотной обфускации.
Хорошо запутанная программа, закрытая надёжным паролем — уже головная боль для потенциального взломщика. Но и обфускация еще не финальный оплот защиты.
В следующей части — защита от отладчиков, протекторы, лицензии и программы слежения.
А тем, кто определился с тем, что хочет стать программистом, рекомендуем профессию «Веб-разработчик».