В: Если я зашифрую файлы .class и использую пользовательский загрузчик классов для загрузки и расшифровки их на лету, это предотвратит декомпиляцию?
A: Проблема предотвращения декомпиляции байт-кода Java почти так же устарела, как и сам язык. Несмотря на множество инструментов обфускации, доступных на рынке, новички Java-программистов продолжают думать о новых и умных способах защиты своей интеллектуальной собственности. В этой Java Q & В рассрочку я развею некоторые мифы вокруг идеи, которая часто перефразируется на дискуссионных форумах.
Крайняя легкость, с которой файлы Java .class могут быть восстановлены в источниках Java, которые очень напоминают оригиналы, имеет много общего с целями проектирования и компиляторами байтового кода Java. Помимо всего прочего, байт-код Java был разработан для компактности, независимости платформы, мобильности сети и простоты анализа с помощью интерпретаторов байтового кода и динамических компиляторов JIT (точно в срок)/HotSpot. Возможно, скомпилированные файлы .class выражают намерение программиста настолько ясно, что их легче анализировать, чем исходный исходный код.
Можно сделать несколько вещей, если не предотвратить полную декомпиляцию, по крайней мере, сделать ее более сложной. Например, в качестве этапа после компиляции вы можете массировать данные .class, чтобы код байта был более сложным для чтения, когда декомпилировался или сложнее декомпилировать в действительный код Java (или оба). Методы, такие как выполнение перегрузки по имени экстремального метода, хорошо работают для первого и манипулируют потоком управления для создания структур управления, которые невозможно представить через синтаксис Java, хорошо работают для последнего. Более успешные коммерческие обфускаторы используют сочетание этих и других методов.
К сожалению, оба подхода должны фактически изменить код, который запускает JVM, и многие пользователи боятся (по праву), что это преобразование может добавить новые ошибки в свои приложения. Кроме того, метод и переименование полей могут вызвать обратные вызовы, чтобы перестать работать. Изменение имен реальных классов и пакетов может привести к поломке нескольких других Java-API (JNDI (интерфейс именования и интерфейса Java), поставщиков URL-адресов и т. Д.). В дополнение к измененным именам, если связь между смещениями байтового кода класса и номерами исходных строк изменена, восстановление исходных следов стека исключений может стать затруднительным.
Тогда есть возможность обфускации исходного исходного кода Java. Но в корне это вызывает аналогичный набор проблем. Шифровать, а не запутывать?
Возможно, вышесказанное заставило вас подумать: «Ну, а что, если вместо манипулирования байтовым кодом я зашифровываю все мои классы после компиляции и расшифровываю их на лету внутри JVM (что может быть сделано с помощью специального загрузчика классов)?Затем JVM выполняет мой исходный байт-код, и все же нечего декомпилировать или реконструировать, не так ли? »
К сожалению, вы ошибаетесь, думая, что вы первыми придумали эту идею и подумали что это действительно работает.И причина не имеет никакого отношения к силе вашей схемы шифрования.
Каков ваш прецедент? – user359996 2010-12-15 01:14:45
Даже дизассемблированный родной код вполне доступен для некоторых людей, вам, вероятно, придется использовать некоторые обфускатор или ручная сборка, чтобы сделать его неочевидным (общий C++ компилируется с оптимизацией достаточно читаемый). Независимо код работает на устройстве пользователя, может быть перехвачен. Хотя требования к стоимости/квалификации такого перехвата могут быть довольно высокими, например, нарушение в смарт-карту "ta mper-proof "чип-код не является тривиальным, он доступен только с использованием верхнего оборудования и навыков. С Java-классами ... Я бы не стал сильно беспокоиться, вы, вероятно, зашифруете их достаточно, чтобы отключить скриптов, а не больше. – Ped7g 2016-09-22 10:43:53