Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java tools & IDE's > Обфускация библиотеки при помощи YGuard


Автор: DOKA 21.12.2011, 01:45
Добрый вечер!

Использую YGuard для обфускации Java-приложения. Пока оно прилоежния, то проблем нет - выполняю задачу Rename для всего кроме имён пакетов (чтобы пути к картинкам работали) и главного класса.

А вот когда я компилирую то же самое, но в виде библиотеки, мне нужно ещё и имена классов сохранить. Как это сделать при помощи YGuard+Ant? Исключение файлов из задачи <rename> приводит к тому, что класс и внутри не обфусцируется.

И вообще - почему такая засада с обфускацией в Java? Замучался уже. Неужели нет ещё в природе обфускатора, который может вменяемо САМ перемешать код, не поломав программу? Как по мне, это же тривиальная задача, не требующая тех 15 строк кода в ant'e, которые я писал для своей программы, и отладки.

Автор: mstalker26 21.12.2011, 14:05
Перечисления тоже нужно исключать и если что-то с reflection используете. Нельзя обфусцироваь абсолютно все.

Мы yGuard на работе используем, единственное, что меня расстраивает, отсутствие плагина для maven. На моё письмо ответили, что не планируют его делать.

Автор: DOKA 21.12.2011, 16:35
Цитата(mstalker26 @ 21.12.2011,  14:05)
Перечисления тоже нужно исключать и если что-то с reflection используете. Нельзя обфусцироваь абсолютно все.

Мы yGuard на работе используем, единственное, что меня расстраивает, отсутствие плагина для maven. На моё письмо ответили, что не планируют его делать.

Перечисления по старинке не использую, предпочитаю int-костанты.
Reflections - тоже.
По-моему, весьма типичный use case.

Пока в голову приходит лишь вытащить всё API библиотеки в один класс типа Obfuscated.class, где ещё на момент написания ф-ии будут называться A, B, C, etc..
Я просто не могу не обфусцировать этот код, т. к. он влияет на проверку лицензий.
Как мне кажется, это очень напоминает весьма корявые костыли.

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

Автор: mstalker26 21.12.2011, 16:51
стоп-стоп-стоп.
Если я правильно понял у Вас есть проект, зависящий от библиотеки (она тоже Ваш проект). Назовем их project и commons. Когда Вы компилируете и упаковываете commons, то обфусцировать не надо. А когда Вы упаковываете project, то надо обфусцировать и project и commons.

В yGuard это
Код

...
<inoutpair in="${project_jar}"       out="${project_jar}" />
<inoutpair in="${commons_jar}"   out="${commons_jar}" />
...


Если неправильно понял, то расшифровывайте и опишите процесс, что делаете smile.

edit: или Вы все библиотеки обфусцируете?

Автор: DOKA 21.12.2011, 16:59
Цитата(mstalker26 @ 21.12.2011,  16:51)
стоп-стоп-стоп.
Если я правильно понял у Вас есть проект, зависящий от библиотеки (она тоже Ваш проект). Назовем их project и commons. Когда Вы компилируете и упаковываете commons, то обфусцировать не надо. А когда Вы упаковываете project, то надо обфусцировать и project и commons.

В yGuard это
Код

...
<inoutpair in="${project_jar}"       out="${project_jar}" />
<inoutpair in="${commons_jar}"   out="${commons_jar}" />
...


Если неправильно понял, то расшифровывайте и опишите процесс, что делаете smile.

edit: или Вы все библиотеки обфусцируете?

По-моему, это как раз и будет решением, раз YGuard позволяет связно обфусцировать два Jar'a.
Но тут проблема встаёт, это же Eclipse plugin у меня. И commons будет запакована внутрь project. Такое YGuard не поддерживает?


А может, заодно подскажете, как при сборке репозитория Eclipse плагина (он и есть мой project) заставить вызываться Ant-скрипт проекта плагина?
Грубо говоря структура такая:
- Repo <-- сборка идёт по нажатию Build All в GUI
- Feature
- Plugin <-- здесь будет ant-файл
- Commons <-- уже собран предварительно

Нет, можно, конечно и вручную обфускацию запускать... Но это не совсем правильно, как мне кажется.

Автор: mstalker26 22.12.2011, 11:59
Я бы сделал так:
1) завел бы ant-task для обфускации, который зависит от task "jar".
2) commons я бы не запаковывал внутрь project (т.е. jar в jar).
3) ну а выпускать production версию плагина, то собирал бы из консоли, а не из GUI.

Теперь вопросы:
1) я так понимаю, что собираете Вы проект из GUI? Я бы собирал (для выпуска релизов) из консоли с помощью ant, так Ваш проект будет более "гибким" (не могу перевести flexibel  smile )
2) пытались привязать ant-файл с обфускацией к Run - External Tool в eclipse? (но это на крайний случай)

edit:
кстати, для rename и shrink в yGuard можно задать аттрибут logfile, чтобы сохранить маппинг, что наделал yGuard.

Автор: DOKA 22.12.2011, 15:30
Спасибо за ответы. Видимо проще будет собирать так, как сделано, а потом делать unjar - obfuscate - jar через ant.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)