сделать так, чтобы ваш Jar не декомпилировался

Как я могу упаковать свое Java-приложение в исполняемый файл jar, который нельзя декомпилировать (например, с помощью Jadclipse)?


person Community    schedule 28.05.2009    source источник


Ответы (5)


Вы не можете. Если JRE может его запустить, приложение может его декомпилировать.

Лучшее, на что вы можете надеяться, это сделать его очень трудным для чтения (замените все символы комбинациями «l» и «1», «O» и «0», добавьте много бесполезного кода и т. д.). Вы будете удивлены, насколько нечитаемым можно сделать код, даже с относительно тупым инструментом перевода. Это называется запутыванием, и, хотя это не идеально, иногда этого достаточно.

Помните, решительного хакера остановить можно не больше, чем решительного грабителя. То, что вы пытаетесь сделать, это очень усложнить жизнь случайному злоумышленнику. При представлении символов O001l1ll10O, O001llll10O, OO01l1ll10O, O0Ol11ll10O и O001l1ll1OO и кода, который, кажется, не делает ничего полезного, большинство людей просто сдаются.

person paxdiablo    schedule 28.05.2009
comment
как, какой и где применить такой сценарий сэр? - person Daniel Adenew; 24.11.2015

Во-первых, вы не можете избежать людей, реконструирующих ваш код. Байт-код JVM должен быть простым для выполнения, и есть несколько программ для его обратного проектирования (то же самое относится к .NET CLR). Вы можете только сделать все более и более трудным повышение барьера (т. е. стоимости) для просмотра и понимания вашего кода.

Обычный способ — обфускировать источник с помощью какого-либо инструмента. Классы, методы и поля переименовываются по всей кодовой базе, даже с неверными идентификаторами, если вы решите это сделать, что делает код практически невозможным для понимания. Раньше у меня были хорошие результаты с JODE. После обфускации используйте декомпилятор, чтобы увидеть, как выглядит ваш код...

Помимо обфускации, вы можете зашифровать свои файлы классов (все, кроме небольшого начального класса) с помощью некоторого метода и использовать собственный загрузчик классов для их расшифровки. К сожалению, класс загрузчика классов не может быть зашифрован сам по себе, поэтому люди могут выяснить алгоритм дешифрования, прочитав декомпилированный код вашего загрузчика классов. Но окно для атаки на ваш код стало меньше. Опять же, это не мешает людям видеть ваш код, просто усложняет задачу для случайного злоумышленника.

Вы также можете попытаться преобразовать приложение Java в какой-нибудь EXE-файл Windows, который скроет подсказку о том, что это Java вообще (в некоторой степени), или действительно скомпилируется в машинный код, в зависимости от ваших потребностей в функциях JVM. (Я не пробовал это.)

person Peter Kofler    schedule 28.05.2009

GCJ — это бесплатный инструмент, который может компилироваться либо в байт-код, либо в собственный код. Имея в виду, что это как бы противоречит цели Java.

person AgileJon    schedule 29.05.2009
comment
Я был бы признателен, если бы вы рассказали больше о своем открытии, можете ли вы запустить после ccoversion или могли бы вызвать их как библиотеку, или вы можете запустить их из командной строки или из исполняемого файла? - person Daniel Adenew; 24.11.2015

Немного поздно я знаю, но ответ нет.

Даже если вы пишете на C и компилируете в собственный код, существуют дизассемблеры/отладчики, которые позволят людям пройтись по вашему коду. Конечно, отладка оптимизированного кода без символьной информации неприятна, но это можно сделать, иногда мне приходилось это делать.

Есть шаги, которые вы можете предпринять, чтобы сделать это сложнее, например. в Windows вы можете вызвать IsDebuggerPresent API в цикле, чтобы увидеть, не отлаживает ли кто-то ваш процесс, и если да, и это сборка релиза, завершить процесс. Конечно, достаточно решительный злоумышленник может перехватить ваш вызов IsDebuggerPresent и всегда возвращать false.

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

person quixver    schedule 04.12.2014

Это не мое практическое решение, но здесь я думаю, что это хорошая коллекция или ресурс и учебные пособия, чтобы сделать это с максимальным уровнем удовлетворения.

Предложение с этого сайта (сообщество oracle)

(чистый способ), запутывайте свой код, существует множество бесплатных и открытых инструментов запутывания, вот их простой список: [Список обфускаторов с открытым исходным кодомt] . Эти инструменты делают ваш код нечитаемым (хотя вы все равно можете его декомпилировать), меняя имена. это наиболее распространенный способ защитить ваш код.

2. (Не очень чистый способ) Если у вас есть определенная целевая платформа (например, Windows) или у вас могут быть разные версии для разных платформ, вы можете написать сложную часть своих алгоритмов на языке низкого уровня, таком как C (что очень сложно). для декомпиляции и понимания) и используйте его как нативную библиотеку в своем java-приложении. это не чисто, потому что многие из нас используют java из-за его кроссплатформенных возможностей, а этот метод сводит на нет эту способность.

и это ниже, шаг за шагом, следуйте: >Защитите свой код Java

Наслаждаться! Добавляйте свои решения, нам это нужно больше.

person Daniel Adenew    schedule 24.11.2015
comment
Когда C стало очень сложно декомпилировать? - person NateS; 26.04.2020