Создание Java-программ без обратной разработки

StackOverflow https://stackoverflow.com/questions/149937

  •  02-07-2019
  •  | 
  •  

Вопрос

Есть ли способ развернуть Java-программу в формате, который не поддается обратной разработке?

Я знаю, как преобразовать мое приложение в исполняемый JAR-файл, но я хочу убедиться, что код не может быть подвергнут обратному проектированию или, по крайней мере, нелегко.

Запутывание исходного кода не считается...это затрудняет понимание кода, но не скрывает его.

Связанный с этим вопрос заключается в следующем Как заблокировать скомпилированные классы Java, чтобы предотвратить декомпиляцию?


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

Что меня беспокоит, так это есть ли в коде какая-либо информация, относящаяся к удаленному доступу.Существует хост, к которому приложение подключается, используя идентификатор пользователя и пароль, предоставленные пользователем.Есть ли способ скрыть адрес хоста от пользователя, если этот адрес расположен внутри исходного кода?

Это было полезно?

Решение

Вы могли бы запутать свой JAR-файл с помощью Игард. Это не запутывает ваш исходный код, но скомпилированные классы, так что нет проблем с поддержанием кода позже.

Если вы хотите скрыть какую-то строку, вы могли бы зашифровать ее, что затруднит ее получение при просмотре исходного кода (еще лучше, если вы затемните файл JAR).

Другие советы

Короткий ответ: "Нет, этого не существует".

Реверс-инжиниринг - это процесс, который вообще не предполагает просмотра кода.По сути, это попытка понять лежащие в основе механизмы, а затем имитировать их.Например, вот как появляется JScript из MS labs, копируя поведение Netscape на JavaScript, не имея доступа к коду.Копия была настолько совершенной, что были скопированы даже ошибки.

Если вы знаете, на какие платформы вы ориентируетесь, найдите что-нибудь, что компилирует вашу Java в машинный код, например Эксельсиор ДЖЕТ или GCJ.

Без этого вы никогда не сможете скрыть исходный код, поскольку у пользователя всегда есть ваш байт-код и он может Джад IT.

Вы пишете на языке, в котором интроспекция является частью основного языка.Это порождает .class файлы, спецификации которых широко известны (что позволяет другим поставщикам создавать простые реализации компиляторов и интерпретаторов Java).

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

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

Не используете интерпретируемый язык?В любом случае, что ты пытаешься защитить?Если это достаточно ценно, все, что угодно, может быть подвергнуто обратному проектированию.Шансы на то, что кто-то достаточно заботится о том, чтобы перепроектировать большинство проектов, минимальны.Запутывание создает, по крайней мере, минимальное препятствие.

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

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

Проблема, которую я вижу, заключается в том, что JVM, как и CLR, должна иметь возможность интерпретировать ваш код, чтобы JIT-компиляция и запускали его.Вы можете сделать это более "сложным", но, учитывая, что спецификация для байт-кода довольно хорошо документирована и существует на гораздо более высоком уровне, чем что-то вроде спецификации ассемблера x86, маловероятно, что вы сможете "скрыть" поток процессов, поскольку он должен быть там, чтобы программа работала в первую очередь.

Это невозможно сделать.

Все, что может быть скомпилировано, может быть декомпилировано.Самое лучшее, что вы можете сделать, это запутать все до чертиков.

Тем не менее, в квантовой криптографии происходит кое-что интересное.По сути, любая попытка прочитать сообщение изменяет его.Я не знаю, можно ли это применить к исходному коду или нет.

Даже если вы компилируете код на машинном языке, существуют всевозможные программы, которые позволяют вам по существу декомпилировать его на язык ассемблера и следовать потоку процесса (OlyDbg, IDA Pro).

Превратите это в веб-сервис.Тогда вы единственный, кто может видеть исходный код.

Это невозможно сделать.Это не проблема Java.Любой язык, который может быть скомпилирован, может быть декомпилирован для Java, это просто проще.

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

Как кто-то сказал выше, обратный инжиниринг всегда может декомпилировать ваш исполняемый файл.Единственный способ защитить ваш исходный код (или алгоритм) - это не распространять ваш исполняемый файл.

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

При этом даже ваш клиентский код декомпилируется.Вы ничего не теряете.

Но наверняка это снизит производительность и удобство использования.

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

Все, что интерпретируется в какой-то момент, должно быть обработано "в чистом виде".Строка будет отображаться ясно, как божий день, как только код будет запущен через JAD.Вы могли бы развернуть ключ шифрования в своем приложении или использовать базовый шифр ceasar для шифрования информации о подключении к хосту и расшифровки во время выполнения...

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

Таким образом, вы могли бы статически скрыть это, но вы не можете скрыть это во время выполнения, если они запускают отладчик

Это невозможно.Центральный процессор должен будет выполнить вашу программу, т.е.ваша программа должна быть в формате, понятном центральному процессору.Процессоры намного глупее людей.Следовательно, если центральный процессор может понять вашу программу, то и человек может.

Испытывая опасения по поводу сокрытия кода, я бы запустил Предусмотрительный в любом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top