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

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

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

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

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


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

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

Здесь уже спрашивали: Об этом уже спрашивали здесь: stackoverflow.com/questions/49379/…

Craig 29.09.2008 23:01

Почему пользователю важно не знать, что служба базы данных работает на IP-адресе, к которому вы подключаетесь?

user359996 16.02.2011 21:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
8 632
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

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

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

Он сказал обфускация исходного кода, я говорю ему обфускировать результирующие классы jar, которые не имеют ничего общего с исходным кодом

albertein 29.09.2008 22:12

Действительно, предположительно допускается двоичная обфускация. Если нет, то его вопрос действительно сводится к следующему: «Как мне запутать свой код? Ps, я не могу использовать обфускатор», и это не имело бы особого смысла. Обфускация двоичных файлов не идеальна, но она настолько хороша, насколько это возможно.

jsight 29.09.2008 22:17

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

JeeBee 29.09.2008 22:18

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

albertein 29.09.2008 22:21

dotFuscator запутывает код .NET IL таким образом, чтобы его нельзя было декомпилировать во что-то, что вы можете использовать, включая переупорядочивание команд и шифрование строк. Вы можете перекомпилировать его, и если вам повезет, вы не сможете его прочитать. Если не повезет, он даже не перекомпилируется. Спорим, есть такая вещь и для Java

OregonGhost 29.09.2008 22:24

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

Elie 29.09.2008 23:16

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

albertein 29.09.2008 23:27

именно поэтому я хочу убедиться, что они не могут получить доступ к источнику, чтобы они не могли найти эту информацию.

Elie 29.09.2008 23:35

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

albertein 29.09.2008 23:44

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

Benjamin Autin 30.09.2008 00:56

@David: dotfuscator утверждает, что они действительно улучшают производительность во многих ситуациях.

OregonGhost 30.09.2008 01:04

Я думаю, что соединения с БД проходят через зашифрованный канал, но я не уверен в этом.

albertein 30.09.2008 02:10

Мне хочется спросить, зачем вам это нужно, но я оставлю это в покое ...

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

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

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

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

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

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

эффективно. Это похоже на «управление» авторскими правами. Вы хотите предоставить программу, чтобы ваш компьютер мог ее прочитать (и выполнить), но не хотите, чтобы пользователь ее читал (и копировал). Это довольно неестественно.

helios 29.09.2008 23:16

Компиляция вашей Java в машинный код кажется единственным реалистичным решением, и оно должно быть лучше, чем обфускация.

KJW 27.11.2011 10:34

Это невозможно.

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

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

конечно, до тех пор, пока вы не хотите, чтобы ваш процессор мог его читать;)

tloach 29.09.2008 22:28

Что ж, это было бы нарушением безопасности, не так ли.

Chris Cudmore 03.10.2008 00:03

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

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

Гизмо, я думаю, тебе стоит либо удалить, либо отредактировать свой комментарий. Любой, кто читает вопрос, понимает, что Эли ищет способ предотвратить легкую декомпиляцию. Вы раскалываете волосы, и это ДЕЙСТВИТЕЛЬНО не ответ. Или вы можете обновить свой комментарий, включив в него правильную фразу. Pls b полезно!

Joseph Gordon 01.10.2008 01:38

Извините, но я не буду этого делать. Я предпочитаю дать хороший ответ на неправильный вопрос, чем дать неправильный ответ на неправильный вопрос, тем более, что теперь это имеет место с ответом AlbertEin, который совсем не соответствует реальному требованию, а именно: «не позволять кому-либо найти URL-адрес в декомпилированный код ".

gizmo 01.10.2008 13:04

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

user359996 16.02.2011 21:19

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

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

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

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

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

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

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

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

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

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

Имея опасения по поводу сокрытия кода, я бы все равно запустил ProGuard.

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

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

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

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

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

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