2010-03-14 4 views
22

Я знаю, многие подобные вопросы были заданы здесь. Я не спрашиваю, могу ли я защитить свой скомпилированный Java-класс, потому что, очевидно, вы скажете «нет, вы не можете». Я спрашиваю, что является самым известным методом защиты классов Java от декомпилирования? Если вы знаете какую-либо исследовательскую или академическую работу в этой области, пожалуйста, дайте мне знать. Также, если вы использовали некоторые методы или программное обеспечение, поделитесь опытом? Любая информация будет очень полезна. Спасибо.Как защитить скомпилированные классы Java?

+3

Подобный вопрос к вашему - http: // stackoverflow.com/questions/49379/how-to-lock-compiled-java-classes-to-prevent-decompilation –

+1

Вы заинтересованы в предотвращении декомпиляции или защите ваших коммерческих секретов, встроенных в код? – Yuval

+5

@ Yuval - меня интересует и то, и другое ... –

ответ

14

Во-первых, если вы ориентируетесь «только» на рынке Windows, есть очень легко предотвратить «.class в .Java» декомпиляции: использовать инструмент, как Excelsior JET, который превратит .jar в . exe.

Это несложное: это невозможно, чтобы получить файл .java обратно, если вы используете Excelsior Jet (так долго все люди говорят «это невозможно предотвратить декомпилирование .class файла»). Конечно, злоумышленник может запустить SoftIce и попытаться проследить свой .exe но это окажется немного сложнее, чем при использовании JAD декомпилировать .class к .java и это, конечно, не позволит найти .java файл назад.

Теперь, возможно, вы тоже нацеливаете OS X и Linux, иначе у вас нет $$$, чтобы отключить Excelsior Jet.

Я пишу коммерческое программное обеспечение, написанное на Java. Это программное обеспечение имеет смысл, если есть подключение к Интернету. Следовательно, мы «защищаем» наше программное обеспечение, среди прочего, участвуя в вычислении на стороне сервера: у нас есть несколько .class, которые не будут работать, если они не сгенерированы с серверной стороны, и мы отправляем их по провод (и то, что отправлено на провод, всегда разные: мы генерируем уникальные, одноразовые файлы .class на стороне сервера).

Это требует подключения к Интернету, но если пользователь не нравится, как наша программа работает, то он может свободно купить один низший продукт нашего конкурента;)

Декомпиляция не будет делать много хорошего: вы активно должны взломать (т. е. воспроизводить то, что происходит на стороне сервера), или вы не сможете его использовать.

Мы используем нашу собственную «обфускацию» строки до мы используем Proguard. Мы также используем инструментарий с исходным кодом (мы могли бы также выполнить байт-код), где мы удаляем много вещей из кода (например, «assert», которые мы комментируем) и вводим случайную «обфускацию потока кода» [программное обеспечение может принимать разные пути все же получают тот же результат, это то, что действительно заставляет программное обеспечение трудно отслеживать]).

Затем мы используем Proguard (который является бесплатным), чтобы сгладить всю нашу иерархию OO и сфотографировать код с уже запутанным кодом и потоком с запутанным кодом.

Таким образом, наш поток:

  • строка запутывание
  • запутывания случайного код поток
  • Proguard
  • окончательный .jar, что зависит от .class, которые (по-разному) динамически генерируемых на стороне сервера.

В дополнение к этому мы выпускаем очень регулярное (и автоматическое) обновление, которое всегда позволяет немного изменить нашу схему защиты клиент/сервер (так что с каждой версией гипотитический злоумышленник должен начинать в основном с нуля).

Конечно, это легче бросить полотенце и думать: «нет ничего, что я могу сделать, чтобы сделать жизнь атакующего труднее, потому что JAD может найти файл обратно .java все равно» (что больше, чем очень спорно и вопиюще неправильно в том случае, когда вы используете конвертер .class в .exe для защиты вашего .class от декомпиляции).

+1

Я сомневаюсь, что это доказательство дурака, хотя я использую Launch4J для упаковки банку в exe. Я считаю, что с правильным пониманием структуры файла exe и помощью Launch4J можно сделать обратное проектирование. Конечно, это будет сложно, чем использование декомпилятора Java. –

+1

У меня небольшая коррекция: Excelsior JET доступен как для Windows, так и для Linux. –

+2

@Yan Cheng CHEOK: Excelsior JET не является оберткой вокруг .jar: он преобразует ваш байт-код Java в собственный исполняемый файл Windows (или Linux). Таким образом, это не «безупречно» в этом, конечно, люди все еще могут попытаться декомпилировать его. Но не существует *, они вернут файл .java, позволяющий скомпилировать .class (потому что больше нет файлов .class, а не байт-кода, это все родной .exe [или исполняемый файл Linux]). Это совсем не похоже на обертку, такую ​​как izpack или Launch4J и т. Д. – SyntaxT3rr0r

0

Итак, как вы можете защитить свои классы от декомпиляции? Один ответ - Крема. Crema скремблирует символическую информацию в ваших .class-файлах, чтобы они стали менее уязвимыми к декомпиляции. Символьная информация о том, что Crema скремблирует, включает имя класса, его суперкласс, интерфейсы, имена переменных, методы и т. Д. Эти символические имена необходимы виртуальной машине Java (JVM) для связывания ваших классов с библиотечными пакетами. Crema скремблирует эти символические имена и делает ссылки на них таким же образом, чтобы JVM все же могла достичь правильной связи между классами и пакетами.

Как работает Crema? В принципе, прежде чем распространять свои файлы классов в Интернете, запустите Crema. Crema будет скрещивать символическую информацию, содержащуюся в них, и поместит каждый новый класс в файл 1.crema. Затем ваша задача - переименовать 1.crema в нечто вроде filename.class, прежде чем распространять его в Интернете.

HOW TO PROJECT JAVA COMPLIED CLASSSES

0

Вы можете попробовать Java Protector. Это лучший способ, чем obfuscation.It делает Native ClassLoader путем изменения источника OpenJDK, может зашифровать классы, которые вы хотите защитить AES, и проанализировать их в своем custom -JRE. Вы можете опубликовать свое программное обеспечение с помощью JRE и распространять безопасность вашего программного обеспечения.

Смежные вопросы