Мне достаточно любопытно, чтобы не подумать о вечернем написании определенного кода на Java из-за того, насколько легко его декомпилировать. Есть ли способ, которым я могу писать на Java и не беспокоиться о декомпиляторах? Я понимаю, что все может быть изменено в обратном направлении за достаточно времени, поэтому я спрашиваю: достаточно ли эффективны обфускаторы классов Java для сдерживания декомпиляции?
Действительно ли обфускация кода Java эффективна по сравнению с декомпиляторами?
Ответы (7)
Достаточно ли эффективны обфускаторы классов Java для предотвращения декомпиляции?
Я бы сказал «нет». Когда я декомпилирую исходный код с целью выяснить, как кто-то что-то сделал, я уже знаю, что ищу. Так что мне не нужно понимать всю программу - только один фрагмент, который меня интересует в то время. Если достаточно ломать голову над методами и немного возвращаться в цепочку вызовов, обычно можно определить, что находится под капотом, без чрезмерных усилий.
Если ваш вопрос: "Могу ли я гарантировать, что никто не сможет взломать мой код", ответ будет НЕТ .. Будь то JAVA или Visual C ++. Пока ваше программное обеспечение, состоящее из байтов или битов, доступно хакеру напрямую.
ПРИЧИНА проста.
Каким бы вы ни кодировали, это можно декодировать.
Лучшей стратегией может быть создание веб-службы и развертывание там вашей секретной логики. Позвольте другим пользоваться вашим сервисом, не имея доступа к тому, как вы писали.
Обфускация в Java и других языках - всего лишь средство устрашения. Это просто поднимает планку для атакующего. Это не означает, что обфускация не имеет значения, это просто не гарантия.
Что вы пытаетесь защитить и на какой рынок вы ориентируетесь?
Обфускация для защиты алгоритма лицензирования на рынке, который полон пиратства, не имеет большого значения. Однако для SMB этого может быть достаточно, чтобы избавиться от большинства случайных пиратов.
Если вы пытаетесь защитить IP от конкуренции, я вижу два ответа. Идею будет сложно защитить. Способный инженер, просматривающий код, поймет жемчужины логики и сможет ее реализовать. Из-за обфускации людям будет намного сложнее просто взять код и включить его в свой собственный продукт. Затраты на обслуживание будут продолжать расти по мере того, как они будут пытаться внести изменения (я бы сказал, что это также верно для чисто декомпилированного кода).
Продукты Java, которые я разрабатываю для своей компании, запутаны. Они защитили нас от воровства ... Сомневаюсь. Но в контексте наших затрат на разработку обфускация была не такой уж и дорогой. Небольшая защита за небольшую цену - неплохой компромисс.
Исходя из личного опыта декомпиляции Java, я могу сказать, что обфускация может сделать чьи-то попытки декомпилировать очень раздражающими и трудными. Больше всего меня раздражает, когда все файлы классов окончательной сборки называются «a.class, b.class, c.class» и так далее, и в них добавляется большое количество фиктивных элементов. С точки зрения обфускации кода, попробуйте / catches отлично справляется с проблемой декомпилятора.
В общем, все, что вы декомпилируете, не будет компилироваться, но даст вам подсказки относительно общей работы программы.
«Достаточно эффективный» полностью зависит от того, насколько он вам нужен. А это зависит от того, что вы защищаете и от кого. Ни один из традиционных методов (обфускация, шифрование байт-кодов, компиляция в exe) не остановит опытного и целеустремленного злоумышленника с достаточным временем и стимулом. Но это в значительной степени относится ко всем формам программирования. (Вы также можете дизассемблировать или декомпилировать приложения C / C ++ ...)
Единственный способ защитить себя от серьезного реверс-инжиниринга - это использовать безопасную платформу выполнения; например используя что-то, основанное на TPM. Даже в этом случае, если злоумышленники могут подключить логический анализатор к системе, в которой выполняется ваш код, они могут (теоретически) захватить выполняемый собственный код и затем начать обратный инжиниринг.
РЕДАКТИРОВАТЬ. Сообщается, что кому-то удалось взломать популярный чип TPM с помощью электронного микроскопа; см. эту статью регистрации. И что интересно, его изначальной мотивацией было взломать консоли Xbox 360!
Откровенно говоря, нет. Как бы нелепо вы ни запутали код, если кто-то знает, что он может заработать на вашем коде миллион долларов, он декомпилирует ваши файлы классов и получит код.
Однако есть альтернативы:
Преобразуйте вашу java-программу в exe-файл для распространения. Вы должны знать, что здесь есть уловы.
Зашифруйте файлы классов с помощью ключа. Создайте собственный загрузчик классов, который может декодировать файлы классов с помощью закрытого ключа перед загрузкой их в память. Здесь есть две проблемы: а) время загрузки увеличивается, б) как вы скроете закрытый ключ.
если вы прочтете мой пост https://stackoverflow.com/a/26717791/2132826, вы увидите, что я не мог найдите один хороший java де-обфускатор, который действительно работает так, как ожидалось.
так что текущий ответ: НЕТ.