Руководство по использованию Stringer Java Obfuscator

Описание продукта

Stringer Java Obfuscator - это обфускатор, обеспечивающий высочайший уровень защиты Java-программ от реверс-инжиниринга и модификации. Для защиты приложений, вы можете использовать следующие функции: шифрование строк и проверка контекста вызова, защита от модификации и контроль целостности, оптимизация размера Java-приложений.

Шифрование строк и проверка контекста вызова

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

Защита от модификации и контроль целостности

Android не поддерживается

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

Оптимизация размера

Для уменьшения размера получаемого приложения можно использовать функцию оптимизации. В отличие от других обфускаторов, Stringer Java Obfuscator удаляет только действительно ненужную для работы приложения информацию (отладочная информация, имена локальных переменных и др.). В среднем, размер приложения уменьшается на 20%.

Шифрование ресурсов

Android не поддерживается

Для дополнительной защиты приложения можно использовать шифрование ресурсов. Список защищаемых ресурсов определяется настройками фильтра исходных файлов. Шифрование осуществляется на базе алгоритма AES с динамическим ключом для каждого приложения. Работа с защищенными ресурсами происходит совершенно прозрачно для разработчика и не требует никаких дополнительных настроек.

Общие сведения

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

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

Stringer Java Obfuscator можно использовать как консольное приложение, GUI-приложение, Ant-задачу, Maven-плагин или Eclipse-плагин.

Для работы Stringer Java Obfuscator необходима JRE 1.6 и выше. Защищенные class-файлы совместимы с JRE 1.5 и выше.

Состав дистрибутива

Дистрибутив представляет собой zip-архив, в котором содержатся:

  • Исполняемый jar-файл - stringer.jar
  • Исполняемый jar-файл - stringer-gui.jar
  • Приложение для MacOS X - Stringer-GUI.app
  • Библиотека с описанием аннотаций - stringer-annotations.jar
  • Каталог с примерами - samples/
  • Тексты лицензий - NOTICE, LICENSE

Использование консольного и графического режима работы

Загрузка

Сссылка на дистрибутив будет отправлена после запроса пробной версии, или после покупки полной лицензии.

Установка

Распакуйте архив в удобном для вас месте.

Получение кода активации

Для получения пробного кода активации используйте кнопку "Получить пробный код активации" на главной странице продукта.

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

При покупке продукта через FastSpring коды активации высылаются в течении 24-часов после поступления денежных средств. В случае заключения договора с коммерческой организацией, после поступления денег на наш расчетный счет или при предъявлении копии платежного поручения.

В случае, если вы были авторизованы в момент получения пробного кода, он будет отображаться в вашем личном кабинете на вкладке Ваши лицензии, равно как и полноценные коды активации. А так же будет отображено состояние Generated - код сгенерирован, но не использовался, или Activated - код активации использован.

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

Stringer Java Obfuscator поддерживает два метода активации: онлайн и офлайн. Если у вас есть активное интернет подключение вы можете использовать онлайн активацию. Если же у вас отсутствует интернет подключение, или оно ограничено различными средствами фильтрации трафика, вы можете использовать офлайн активацию. В этом случае, необходимо сгенерировать через консольный или графический интерфейс код запроса на активацию и отправить письмо с ним по электронной почте на адрес stringer@licelus.com. Это можно сделать с другого компьютера или иного устройства, имеющего доступ к сети интернет.

Консольный режим

Активация через консоль
Онлайн активация через консоль

Для онлайн активации в консольном режиме необходимо выполнить команду:

java -jar stringer.jar -activate

и следовать инструкциям программы.

После успешной активации в домашнем каталоге будет создан файл лицензии stringer.licel.
Для использования файла лицензии, расположенного не в домашнем каталоге и не в одном каталоге с stringer.jar, необходимо задать соответствующий параметр.

Офлайн активация через консоль

Для офлайн активации в консольном режиме выполните команду:

java -jar stringer.jar -activationRequest

После того, как вы введете код активации, будет сгенерирован код запроса (request code), данный код необходимо отправить с помощью электронной почты по адресу stringer@licelus.com. В течении 24-часов вы получите код ответа (response code), далее необходимо выполнить команду:

java -jar stringer.jar -activationResponse

И ввести полученный код ответа. После успешной активации в домашнем каталоге будет создан файл лицензии stringer.licel.
Для использования файла лицензии, расположенного не в домашнем каталоге и не в одном каталоге с stringer.jar, необходимо задать соответствующий параметр.

Описание параметров и опций
java -jar stringer.jar <options> <src> <dest>
Допустимые значения <src>:

Путь к исходному jar-файлу или каталогу

Допустимые значения <dest> (Может совпадать с <src>):

Путь к jar-файлу или каталогу на выходе. Если не существует, то он будет создан. По умолчанию тип <dest> такой же как и <src>. Изменить тип <dest> можно параметром -outputType dir/jar

Допустимые значения <options>:
  • -activate - активировать копию онлайн
  • -activationRequest - сгенерировать код запроса для офлайн активации
  • -activationResponse - завершить процесс офлайн активации, введя код ответа
  • -info - состояние лицензии
  • -configFile имя_файла - использовать конфигурационные параметры из указанного файла (формат конфигурационного файла)
  • -outputType dir/jar - выбрать тип <dest>. Каталог или jar-файл
Параметры обработки
  • -checkCaller - проверять контекст вызова функции дешифрования (по умолчанию выключено)
  • -integrityProtection - защита class-файлов от модификации (по умолчанию выключено)
  • -resourceEncryption - шифрование файлов с ресурсами (по умолчанию выключено)
  • -optimize - оптимизировать размер class-файлов (по умолчанию выключено)
  • -osgiCompatibility - включить режим совместимости защиты с OSGI-контейнерами (по умолчанию выключено)
  • -proguardMapFile - путь к map-файлу Proguard
  • -target 1.7|1.8 - принудительно генерировать байткод с указанной версией, по умолчанию используется версия из оригинального class-файла
  • -nameGenMethod latin|utf - алгоритм генерации имен методов, по умолчанию utf
  • -verbose - вывести на stdout детальный лог работы (по умолчанию выключено)
  • -licenseFile имя_файла - файл с лицензией
Фильтр исходных файлов
  • -include <шаблон> - включить class-файлы и файлы ресурсов по маске
  • -exclude <шаблон> - исключить class-файлы и файлы ресурсов по маске

Графический режим

Активация через графический интерфейс
Онлайн активация через графический интерфейс

Чтобы активировать Stringer Java Obfuscator в графическом режиме: запустите двойным кликом stringer-gui.jar (Windows/Linux) или Stringer-GUI.app (MacOS).
В окне приложения нажмите кнопку License Info.


Нажмите кнопку Activate, введите код активации и нажмите Activate online.


После успешной активации в домашнем каталоге будет создан файл лицензии stringer.licel.
Офлайн активация через графический интерфейс

Для офлайн активации: запустите двойным кликом stringer-gui.jar (Windows/Linux) или Stringer-GUI.app (MacOS).
В окне приложения нажмите кнопку License Info.


Нажмите кнопку Activate, введите код активации и нажмите Generate activation request.


Отправьте сгенерированный код по электронной почте на адрес: stringer@licelus.com. В течении 24 часов на письмо придет ответ с кодом ответа (activation response). Необходимо ввести данный код в поле, которое будет доступно при нажатии на Enter activation response. В случае, если вы завершали работу Stringer Java Obfuscator, запустите вновь, нажмите License Info -> Activate -> Enter activation response


После успешной активации в домашнем каталоге будет создан файл лицензии stringer.licel.
Описание параметров и опций

Source - путь к исходному jar-файлу или каталогу.
Destination - путь к jar-файлу или каталогу на выходе. Может совпадать с Source. Если Destination не существует, то он будет создан. По умолчанию тип Destination такой же как и Source.

Configuration - Конфигурация

  • Include class file filter - включить class-файлы и файлы ресурсов по маске
  • Exclude class file filter - исключить class-файлы и файлы ресурсов по маске
  • Check call context - проверять контекст вызова функции дешифрования (по умолчанию выключено)
  • Class file integrity protection - защита class-файлов от модификации (по умолчанию выключено)
  • Resource file encryption - шифрование файлов с ресурсами (по умолчанию выключено)
  • Optimize - оптимизировать размер class-файлов (по умолчанию выключено)
  • OSGI compatibility - включить режим совместимости защиты с OSGI-контейнерами (по умолчанию выключено)
  • Print verbose output to console - вывести детальный лог работы (по умолчанию выключено)

Элементы управления:

  • License Info - состояние лицензии и активация
  • Load config - загрузить настройки из файла конфигурации
  • Save config - сохранить текущие настройки в файл
  • Run - запуск обфускации

После запуска отображается окно с информацией о процессе обфускации, а так же с отладочной информацией, если включена опция Print verbose output to console. Вы можете сохранить лог в файл, нажав Save to file.

Использование Ant-задачи

NOTE: Чтобы использовать Stringer Java Obfuscator, как Ant-задачу необходимо скачать дистрибутив обфускатора, произвести установку, получить код активации и использовать его для получения лицензии, следуя инструкциям Использование консольного и графического режима работы. Активацию лицензии можно произвести удобным для вас способом: через GUI или консольный режим.

Для использования Stringer Java Obfuscator в Ant-скриптах необходимо добавить в ваш скрипт описание задачи:

<taskdef name="stringer" classname="com.licel.stringer.AntTask"
classpath="${stringer.home}/stringer.jar"/>

Чтобы вызвать задачу stringer:

<stringer srcFile="${src.jar}" destFile="${dest.jar}"/>

Вы так же можете использовать параметры srcDir и destDir для указания исходной директории и для выходной директории соответственно. Можно подать на вход jar-файл и на выходе получить каталог и наоборот.
Пример:

<stringer srcDir="${src.dir}" destFile="${dest.jar}"/>

Дополнительные параметры можно задать во внешнем конфигурационном файле, или описать внутри задачи:

<stringer srcFile="${src.jar}" configFile="${stringer.config}" destFile="${dest.jar}"/>

Или:

<stringer srcFile="${src.jar}" destFile="${dest.jar}" 
         checkCaller="true|false"
         integrityProtection="true|false"
         resourceEncryption="true|false"
         optimize="true|false"
         verbose="true|false"
         osgiCompatibility="true|false"
         proguardMapFile="${proguard.map.file}"
         target="1.7|1.8"
         nameGenMethod="latin|utf"
         licenseFile="${stringer.license}">
  <include name="mypackage/p1/**"/>
  <exclude name="mypackage/p1/testpackage/**"/>
</stringer>


Android и Ant

1) Убедитесь в том, что Android SDK и ANT корректно установлены.
2) Если у вас уже есть build.xml, пропустите шаги 3-5 и начните с шестого.
3) Перейдите в директорию проекта:

$ cd HelloWorldAndroid

4) Выполните следующую команду:

    $ android-sdk-home/tools/android update project --path .

5) Проверьте корректность build.xml с помощью команды ant, вывод должен быть примерно таким:

help:
     [echo] Android Ant Build. Available targets:
     [echo]    help:      Displays this help.
     [echo]    clean:     Removes output files created by other targets.
     [echo]               The 'all' target can be used to clean dependencies
     ......
BUILD SUCCESSFUL

6) Создайте файл custom_rules.xml, со следующим содержанием:

<?xml version="1.0" encoding="UTF-8"?>
<project name="stringer_rules" default="debug">

<taskdef name="stringer" classname="com.licel.stringer.AntTask"
classpath="${stringer.home}/stringer.jar"/>

 <target name="-obfuscate" depends="android_rules.-obfuscate">
 	<if condition="${proguard.enabled}">
    	<then>
    		<property name="stringer.jar.file" value="${out.dex.input.absolute.dir}"/>
        </then>
        <else>
            <!-- Secondary dx input (jar files) is empty since all the
                     jar files will be in the obfuscated jar -->
            <path id="out.dex.jar.input.ref" />
            <property name="stringer.absolute.dir" location="${out.absolute.dir}/stringer" />
            <property name="stringer.jar.file" value="${stringer.absolute.dir}/project-all.jar"/>
            <property name="out.dex.input.absolute.dir" value="${stringer.jar.file}" />
            <delete file="${stringer.jar.file}"/>
            <script language="javascript"><![CDATA[
              println("Merging all jars in single jar");
              importClass(java.io.File); 
              var zipTask = project.createTask("zip");
              zipTask.setDestFile(new File(project.getProperty("stringer.jar.file")));
              var fileSet = project.createDataType("fileset");
              fileSet.setDir(new File(project.getProperty("out.classes.absolute.dir")));
              zipTask.addFileset(fileSet);
              println("input: "+project.getProperty("out.classes.absolute.dir"));
              var allPath = project.getReference("project.all.jars.path");
              if(allPath!=null) {
              	var paths = allPath.list();
                for (i=0; i<paths.length; i++) {
                	println("input: "+paths[i]);
                	fileSet = project.createDataType("fileset");
                	fileSet.setFile(new File(paths[i]));
                        fileSet.setExcludes("META-INF/**");
                	zipTask.addZipGroupFileset(fileSet);
		        }
              }
              zipTask.execute();
             ]]></script>
        </else>
 	</if>           
 	<stringer verbose="true" checkCaller="true"
 		srcFile="${stringer.jar.file}"
 		destFile="${stringer.jar.file}">
 	</stringer>
 </target>

</project>

7) В файле local.properties добавьте свойстов stringer.home, указав в его значении каталог с дистрибутивом Stringer, например stringer.home=/usr/local/stringer.

Внимание! Не помещайте jar-библиотеки Stringer в каталог libs вашего проекта.

Сохраните изменения и выполните команду ant release.

Использование Maven-плагина

NOTE: Для использования Maven-плагина вам необходим валидный файл лицензии, для этого скачайте дистрибутив обфускатора, произведите установку, получите код активации и используйте его для получения лицензии, следуя инструкциям Использование консольного и графического режима работы. Активацию лицензии можно произвести удобным для вас способом: через GUI или консольный режим.

Вначале необходимо указать Licel Plugin Repository в pom.xml:

    <pluginRepositories>
        <pluginRepository>
            <id>licel</id>
            <url>https://jfxstore.com/stringer/m2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>

Stringer выполняется на фазе package жизненного цикла сборки проекта.
Для его использования, необходимо добавить описание плагина в секцию build/plugins pom.xml.

<project>
  ...
  <build>
    <plugins>
            ...
            <plugin>            
                <groupId>com.licel</groupId>
                <artifactId>stringer-maven-plugin</artifactId>
                <version>1.6.11</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>stringer</goal>
                        </goals>
                        <configuration>
                           <!-- put your configurations here -->   
                        </configuration>
                    </execution>
                </executions>
            </plugin>
           ...
      </plugins>
  </build>
  ...
</project>

Дополнительные параметры можно задать, указав внешний файл конфигурации, или описав внутри секции plugin:

<configuration>
    <configFile>${stringer.config}</configFile>
</configuration>

Или:

<configuration>
    <verbose>true</verbose>
    <checkCaller>true</checkCaller>
    <integrityProtection>true</integrityProtection>
    <resourceEncryption>true</resourceEncryption>
    <optimize>true</optimize>
    <osgiCompatibility>true</osgiCompatibility>
    <proguardMapFile>${proguard.map.file}</proguardMapFile>
    <target>1.7|1.8</target>
    <nameGenMethod>latin|utf</nameGenMethod>
    <licenseFile>${stringer.license}</licenseFile>
    <includes>
        <include>mypackage/p1/**</include>
    </includes>
      <excludes>
        <exclude>mypackage/p1/testpackage/**</exclude>
    </excludes>    
</configuration>

Установка и использование Eclipse-плагина

Установка с использованием Eclipse Marketplace

1. Откройте Eclipse Marketplace (если у вас не установлен Eclipse Marketplace, см. http://www.eclipse.org/mpc/)


2. Просто наберите Stringer в поле поиска, затем нажмите Install

Установка вручную

Repository location: https://jfxstore.com/stringer/eclipse
1. Запустите Eclipse
2. Откройте Help -> Install New Software


3. Кликните Add в окне инсталляции и добавьте репозиторий, используйте удобное имя, например Stringer и location - https://jfxstore.com/stringer/eclipse

4. Выберите Stringer из категории Developer Tools и нажмите Next. Далее вы увидете резюме установки, нажмите Next. Если Stringer не виден вам в окне установки, снимите галочку с Group items by category

5. Подтвердите согласие с лицензией и нажмите Finish
6. После установки вы должны перезапустить Eclipse. Лучше всего выбрать вариант Restart Now

Использование Eclipse-плагина

1. Откройте или создайте Java/Android-проект, зайдите в настройки проекта. Выберите Builders и добавьте Stringer


2. После того, как вы добавите Stringer, вы увидите экран конфигурации плагина

Если у вас нет действующего файла лицензии или кода активации следуйте инструкциям раздела Получение кода активации. После получения кода активации нажмите кнопку Activate. Введите полученный код активации.


3. Передвиньте Stringer на позицию сразу после Java Builder

Теперь вы можете ваши Android и Java проекты используя IDE Eclipse!

NOTE: Для экспорта Android-проектов необходимо использовать экспорт с помощью Export Android Application with Stringer Protection.

Использование аннотаций в Eclipse: Stringer Annotations Library

Для того, чтобы использовать аннотации в Eclipse IDE, необходимо добавить в Build Path проекта библиотеку Stringer Annotations Library.
Зайдите в настройки проекта, выберите Java Build Path, окройте вкладку Libraries и нажмите Add Library…, добавьте Stringer Annotations Library:

Защита Eclipse RCP проектов

Для того, чтобы защищать RCP проекты, необходимо включить Use class files compiled in the workspace, на вкладке Options диалога экспорта (Export Dialog Wizard):

Использование в NetBeans

1. Для защиты ваших class-файлов в NetBeans можно использовать Ant-задачу stringer.

2. Перейдите в каталог проекта, который вы хотите защитить и откройте файл build.xml в редакторе.

3. Добавьте описание Ant-задачи stringer

classpath="${stringer.home}/stringer.jar"/>

4. Добавьте вызов stringer после компиляции проекта




Дополнительные параметры задачи вы можете посмотреть в Использование Ant-задачи.

Если вы используете Maven для сборки проекта в NetBeans - следуйте инструкциям Использование Maven-плагина.

Формат конфигурационного файла

    <stringer  checkCaller="true|false"
                   integrityProtection="true|false" 
                   resourceEncryption="true|false" 
                   optimize="true|false"  
                   verbose="true|false"  
                   osgiCompatibility="true|false"   
                   proguardMapFile="/home/user/build/proguard.map" 
                   target="1.7|1.8" 
                   nameGenMethod="latin|utf" 
                   licenseFile="/home/user/stringer.licel">
    	<include name="mypackage/p1/**"/>
    	<exclude name="mypackage/p1/testpackage/**"/>
    </stringer>


Аннотации

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

Аннотацию @secured можно применять на следующих уровнях иерархии:

Класс - защищается все содержимое класса:
...
import com.licel.stringer.annotations.secured;

@secured 
public class Test {
   ....
}
Поле класса - защищается указанное поле класса:
import com.licel.stringer.annotations.secured;

public class Test {
 @secured
  final String SOME_TEXT="12345678";
   ....
}
Метод класса - защищается тело метода класса:
import com.licel.stringer.annotations.secured;

public class Test {
   ....
  @secured
  public void someMethod(){
     ...
  }
   ....
}

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

Чтобы использовать аннотации @secured и @insecure в ваших проектах, добавьте в classpath проекта архив stringer-annotations.jar из дистрибутива.
В случае использования Eclipse, следуйте инструкциям раздела Использование аннотаций в Eclipse: Stringer Annotations Library.

В случае использования Maven-проекта: добавьте Maven-репозитарий Stringer Java Obfuscator и укажите зависимость проекта от артефакта com.licel.stringer-annotations:

   <repositories>
     <repository>
         <id>licel</id>
         <url>https://jfxstore.com/stringer/m2</url>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
     </repository>
   </repositories>

   <dependencies>
       <dependency>
           <groupId>com.licel.</groupId>
           <artifactId>stringer-annotations</artifactId>
           <version>1.0.3</version>
           <scope>compile</scope>
       </dependency>
   </dependencies>

Пример использования аннотаций можно посмотреть в каталоге samples/HelloWorldAnnotations дистрибутива.

Работа с примерами

Для сборки примеров можно использовать Ant или Maven.

Ant:

$ cd samples/HelloWorld
$ ant
$ java -cp dist/HelloWorld.jar test.App

Maven:

$ cd samples/HelloWorld
$ mvn package 
$ java -cp target/HelloWorld-1.0-SNAPSHOT.jar test.App

Удаление

Чтобы удалить или де-инсталлировать Stringer, пожалуйста удалите каталог `STRINGER_HOME` и файл с лицензией, который расположен в домашнем каталоге пользователя. Если использовался Eclipse плагин, он может быть удален стандартными средствами Eclipse.

Last update: 07.02.2016 - 16:31