`
* **Описание:** Включает DexProtection для библиотек Android (AAR). Поскольку механизм среды выполнения ГостПротектор должен запускаться до первого доступа к AAR, необходимо настроить процесс инициализации и/или оставить включенным механизм автоматической инициализации ГостПротектор.
* **Атрибут:** `autoInit`
* **Допустимые значения:** `on` - включить механизм автоматической инициализации ГостПротектор; `off` - отключить механизм автоматической инициализации ГостПротектор. Если `autoInit="off"`, необходимо указать либо `initMethod(s)`, либо `initClass(es)`.
* **Значение по умолчанию:** `on`
* **Атрибут:** `autoInitAuthorities`
* **Описание:** Чтобы гарантировать, что механизм среды выполнения ГостПротектор инициализируется при необходимости, механизм `autoInit` использует подход Content Provider и определяет компонент Content Provider в `AndroidManifest.xml`. Поэтому, если `autoInit="on"`, мы **настоятельно рекомендуем** указать `autoInitAuthorities="${applicationId}"`, дополнительно указав уникальный идентификатор для каждого AAR, где это необходимо, чтобы избежать риска конфликта, при котором в `android:authorities` указано несколько Content Provider с одним и тем же именем.
* **Значение по умолчанию:** `${applicationId}`
* **Атрибут:** `kotlinSupport`
* **Допустимые значения:** `on` - включить поддержку библиотек, содержащих код Kotlin; `off` - отключить поддержку библиотек, содержащих код Kotlin
* **Значение по умолчанию:** `off`
* **Атрибут:** `nativeClassEncryption`
* **Допустимые значения:** `on` - включить шифрование нативных классов в библиотеке; `off` - отключить шифрование нативных классов в библиотеке
* **Значение по умолчанию:** `on`
* **Атрибут:** `nativeHideAccess`
* **Допустимые значения:** `on` - включить механизм скрытия доступа для нативных классов в библиотеке; `off` - отключить механизм скрытия доступа для нативных классов в библиотеке
* **Значение по умолчанию:** `off`
* **Пример (Автоматическая инициализация — рекомендуется):**
```xml
```
* **Пример (Ручная инициализация):**
```xml
com.example.library.Initializer.initializeDexPro com.example.library.MyReceiver
```
## Фильтры: руководство по настройке
`ГостПротектор` предоставляет гибкий механизм для установки пользовательских фильтров для каждого из своих механизмов защиты кода, защиты ресурсов и удаления кода.
Если механизмы защиты включены, но фильтры не указаны, ГостПротектор автоматически защищает все строки во всех классах (шифрование строк), все методы, поля и обращения к полям во всех классах (шифрование классов, сокрытие доступа), а также шифрует ресурсы (шифрование ресурсов). Это обеспечивает максимальную защиту и рекомендуется включить на этапе тестирования, но иногда может привести к неэффективной работе приложения. Это особенно относится к механизму сокрытия доступа для кода выполняющего объемные вычисления с использованием циклов. Поэтому рекомендуется использовать фильтры для точной настройки защиты там, где это необходимо.
Для применения защиты в соответствии с указанными шаблонами имен можно использовать режимы синтаксиса `'glob'` или `'regex'`.
Чтобы установить фильтр для **включения** данного пакета или класса в процесс защиты, просто укажите режим синтаксиса и шаблон имени в формате: `'syntax:pattern'`, где `:` обозначает само себя.
Чтобы **исключить** данный пакет или класс из защиты, используйте восклицательный знак (`!`) перед шаблоном имени в формате: `'syntax:!pattern'`
Ниже приведены руководства по фильтрам, настроенным для **включения**, **исключения** и **обоих**, с использованием режима синтаксиса `glob`.
### Включение
**Защита каждого класса в указанном пакете**
Допустим, необходимо настроить фильтр, чтобы указать, какие классы ГостПротектор должен включать в свой процесс шифрования классов. В `classes.dex` имеется следующая структура пакетов:
```
android/support/...
com/google/..
com/facebook/..
com/mycompany/..
com/mycompany/ui/..
com/mycompany/core/..
```
В этом случае необходимо, чтобы ГостПротектор зашифровал все классы, содержащиеся в пакете `com/mycompany`. Поэтому необходимо установить следующий фильтр в конфигурации:
```xml
glob:com/mycompany/**
```
**Защита одного класса**
Чтобы защитить один класс — например, `com/mycompany/core/InternalEngine.class` — необходимо следующий формат фильтра:
```xml
glob:com/mycompany/core/InternalEngine.class
```
### Исключение
**Исключение каждого класса в указанном пакете из защиты**
Фильтры исключения устанавливаются путем добавления восклицательного знака (`!`) перед шаблоном имени класса или пакета:
```xml
glob:!android/support/** glob:!com/google/** glob:!com/facebook/**
```
**Исключение одного класса из защиты**
Фильтры исключения для классов выполняются таким же образом, путем добавления восклицательного знака (`!`) перед путем к классу:
```xml
glob:!com/mycompany/core/BumpGenerator.class
```
### Смешанные фильтры: объединение включения и исключения
Один из возможных (и рекомендуемых) подходов для шифрования строк и сокрытия доступа — сначала установить глобальный фильтр исключения, чтобы исключить каждый класс из защиты, а затем выбрать конкретные классы для включения. Для шифрования классов не должно возникнуть никаких проблем при шифровании каждого класса в пакете, за исключением тех, которые должны оставаться доступными для третьих сторон, например, классы, которые являются частью открытого API.
Ниже приведен простой пример конфигурации для шифрования строк, шифрования классов и сокрытия доступа:
<dexprotector>
***
<stringEncryption mode="filters">
<filters>
<filter>glob:!**/**</filter> <!-- Исключить все глобально -->
<filter>glob:com/test/**</filter> <!-- Включить конкретный пакет -->
</filters>
</stringEncryption>
<classEncryption/> <!-- ГостПротектор будет шифровать все классы по умолчанию -->
<!-- Добавьте фильтры здесь, только если необходимо ИСКЛЮЧИТЬ общедоступные API -->
<!-- <filters><filter>glob:!com/mycompany/publicapi/**</filter></filters> -->
<hideAccess mode="filters">
<filters>
<filter>glob:!**/**</filter> <!-- Исключить все глобально -->
<filter>glob:com/test/**</filter> <!-- Включить конкретный пакет -->
</filters>
</hideAccess>
***
</dexprotector>
### Подробная информация о синтаксисе фильтров
Фильтры определяются режимом синтаксиса и шаблоном и имеют вид: `'syntax_mode:pattern'`, где `:` обозначает само себя. Значение компонента синтаксиса не чувствительно к регистру.
Когда режим синтаксиса — `'glob'`, строковое представление шаблона сопоставляется с путями с использованием ограниченного языка шаблонов, который напоминает регулярные выражения, но с более простым синтаксисом.
Например:
* `*.java` — Соответствует именам файлов, заканчивающимся на `.java`
* `foo.?` — Соответствует именам файлов, начинающимся с `foo.` и односимвольным расширением.
* `com//` — Соответствует пакету `/com/test/a`.
* `com/**` — Соответствует всем пакетам и классам внутри пакета `com`.
**Символы синтаксиса Glob:**
* Символ `*` соответствует нулю или более символам компонента имени, **не** пересекая границы каталогов.
* Символы `**` соответствуют нулю или более символам, **пересекая** границы каталогов.
* Символ `?` соответствует ровно одному символу компонента имени.
* Обратная косая черта (`\`) используется для предотвращения интерпретации символов как специальных символов. Например, выражение `\\` соответствует одной обратной косой черте, а `\{` соответствует левой фигурной скобке.
* Символы `[...]` составляют выражение в скобках, которое соответствует одному символу компонента имени из набора символов. Например, `[abc]` соответствует "a", "b" или "c". Дефис (`-`) можно использовать для указания диапазона, поэтому `[a-z]` указывает диапазон, соответствующий символам от "a" до "z" (включительно). Эти формы можно смешивать, поэтому `[abce-g]` соответствует "a", "b", "c", "e", "f" или "g". Если символ после `[` является `!`, то он используется для отрицания, т. е. `[!a-c]` соответствует любому символу, кроме "a", "b" или "c". Внутри выражения в скобках символы `*`, `?` и `\` соответствуют сами себе и, следовательно, в этом контексте не имеют эффектов сопоставления с шаблоном, описанных выше. Символ `-` соответствует самому себе, если он является либо первым символом внутри скобок, либо первым символом после `!`, когда `!` используется для отрицания.
* Символы `{}` представляют собой группу подшаблонов, где группа соответствует, если какой-либо подшаблон в группе соответствует. Символ `,` используется для разделения подшаблонов. Группы не могут быть вложенными.
* Начальные точки/точки (`.`) в имени файла рассматриваются как обычные символы в операциях сопоставления шаблонов. Например, шаблон glob `*` соответствует имени файла ".login".
* Размещение символа `!` в начале компонента шаблона отрицает шаблон.
---
## Дополнительные примечания о фильтрах: шифрование ресурсов и шифрование аннотаций
### Фильтры для шифрования ресурсов
В целом, для шифрования ресурсов применяются те же принципы, что и для других механизмов защиты, но файлы также можно выбирать по **шаблону файла** (т. е. `*.png` обозначает все файлы формата PNG; ГостПротектор найдет и зашифрует все файлы этого типа в каталоге), **шаблону имени** (т. е. `File1*` обозначает все файлы, имена которых начинаются со строки "File1"), по **определенному имени файла** (например, `File2.json`) или по **пути** (например, `TestDir/File3.txt`). Ниже приведен пример конфигурации специально для каталога `assets`:
<resourceEncryption>
<assets>
<filters>
<filter>*.png</filter>
<filter>File1*</filter>
<filter>File2.json</filter>
<filter>TestDir/File3.txt</filter>
</filters>
</assets>
</resourceEncryption>
Далее представлен другой пример, с более широкими фильтрами, нацеленными на каталоги assets и res, а также на строки и массивы строк, указанные в `strings.xml` в `resources.arsc`.
<resourceEncryption nameObfuscation="on">
<assets>
<filters>
<filter>glob:cert/**</filter>
</filters>
</assets>
<res>
<filters>
<filter>glob:raw/**</filter>
</filters>
</res>
<strings>
<filters>
<filter>my_api_key</filter>
<filter>glob:mobile_token*</filter>
<filter>glob:payments_**</filter>
<filter>glob:sensitive_string</filter>
</filters>
</strings>
</resourceEncryption>
### Обфускация имен ресурсов
При желании можно разделить фильтры для шифрования ресурсов и фильтры для обфускации имен ресурсов. Это можно настроить следующим образом:
<resourceEncryption nameObfuscation="on"> <!-- or "off" -->
<res>
<filters>
<filter>res-filter-pattern-01</filter>
<filter>res-filter-pattern-02</filter>
</filters>
</res>
<nameObfuscation>
<filters>
<filter>res-name-01</filter>
<filter>res-name-02</filter>
</filters>
</nameObfuscation>
</resourceEncryption>
И ниже приведены перестановки для элемента ``:
| атрибут / фильтр → | Пустой фильтр | Указаны фильтры | Фильтры не указаны |
| :------------------- | :-------------------- | :-------------------- | :------------------- |
| **on** | Обфусцировать все имена | В соответствии с фильтром | Обфусцировать все имена |
| **off** | Нет обфускации имен | Нет обфускации имен | Нет обфускации имен |
| **Атрибут не указан** | Обфусцировать все имена | В соответствии с фильтром | Нет обфускации имен |
### Фильтры для шифрования аннотаций
Фильтры для шифрования аннотаций работают иначе, чем для других механизмов. Фильтры должны быть указаны на классы, **в которых определены аннотации**, а не на классы, в которых аннотации используются. Затем ГостПротектор найдет все экземпляры аннотаций и зашифрует их. Например:
<annotationEncryption>
<filters>
<filter>glob:kotlin/Metadata.class</filter>
<filter>glob:your/own/secret/AnnotationDefinition.class</filter>
<filter>glob:other/framework/secret/AnnotationDef.class</filter>
</filters>
</annotationEncryption>
## Настройка ГостПротектор для приложений (APK и AAB)
Механизмы защиты ГостПротектор одинаково работают с APK и AAB, и каждый элемент Android, перечисленный в Обзоре файла конфигурации, за исключением элементов внутри тега ``, может быть применен как к APK, так и к AAB. Однако существуют некоторые важные различия между DexProtection для APK и DexProtection для AAB.
1. Для защиты AAB требуется использовать Android Studio 3.2 (или выше) и (если используется Gradle) Android Gradle Plugin 3.2.0 (или выше).
2. Согласно требованиям Google Play к пакетам приложений, необходимо использовать подпись приложений Google Play для AAB, предназначенных для выпуска через Google Play. Это означает, что в конфигурации ГостПротектор для `` должно быть установлено значение `google`. Если вы выберете режим подписи `google`, вам также потребуется ввести информацию о хранилище ключей загрузки и отпечаток SHA-256 целевого сертификата. Вы можете найти отпечаток сертификата на странице подписи приложений Google Play Console: Подпись приложений → Сертификат подписи приложений → Отпечаток сертификата SHA-256.
> ⚠️ **Важно отметить, что если ваше приложение защищено с включенным режимом подписи приложений Google Play `google`, ваше приложение *должно* быть загружено и скачано непосредственно из Google Play (включая открытое, закрытое или внутреннее тестирование), чтобы работать.** Если в конфигурации ГостПротектор выбран режим подписи Google Play, и приложение тестируется локально до обработки через Google Play, приложение будет неработоспособно и аварийно завершится при запуске. Если вы не хотите использовать подпись приложений Google Play, но хотите опубликовать свое приложение в Google Play Store, вам следует использовать режим подписи `release` в ГостПротектор. Для этого см. раздел о локальной подписи для APK и AAB. С августа 2021 года любое новое приложение, опубликованное в Google Play Store, должно быть в формате пакета приложений (AAB) и должно быть подписано через подпись приложений Play.
### Пример конфигурации для приложений (APK и AAB)
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<protector>
<!-- Параметры сборки и ведения журнала для процесса ГостПротектор -->
<verbose>true</verbose>
<optimize>false</optimize>
<securityAssessment>
<signingCertificateCompromised mode="error"/>
<signingCertificateWeakKey mode="error"/>
<dependencyCheck mode="warning" />
</securityAssessment>
<proguardMapFile>/Users/developer/project/app/build/outputs/mapping/release/mapping.txt</proguardMapFile>
<!-- Методы подписи -->
<signMode>google</signMode>
<keystore>/home/developer/example.keystore</keystore>
<storepass>examplestorepass</storepass>
<alias>examplealias</alias>
<keypass>examplekeypass</keypass>
<sha256CertificateFingerprint>1B:5F:8B:D...</sha256CertificateFingerprint>
<!-- Удаление небезопасных вызовов -->
<stripLogging>all</stripLogging>
<stripMethodCalls>
<filters>
<filter>android.util.Log.println</filter>
</filters>
</stripMethodCalls>
<!-- Механизмы защиты кода -->
<stringEncryption/>
<classEncryption/>
<hideAccess/>
<annotationEncryption/>
<nativeLibraryEncryption/>
<jniObfuscation/>
<!-- Механизмы защиты ресурсов -->
<resourceEncryption nameObfuscation="on">
<assets>
<filters>
<filter>glob:cert/**</filter>
</filters>
</assets>
<res>
<filters>
<filter>glob:raw/**</filter>
</filters>
</res>
<strings>
<filters>
<filter>my_api_key</filter>
<filter>glob:mobile_token*</filter>
<filter>glob:payments_**</filter>
<filter>glob:sensitive_string</filter>
</filters>
</strings>
<androidManifestMangling/>
</resourceEncryption>
<!-- RASP - Проверки окружения -->
<runtimeChecks/>
<!-- Параметры защиты сетевых подключений -->
<publicKeyPinning>
<trace>0</trace>
<actions> block<!--, report--></actions>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">yourdomain.com</domain>
<pin-set expiration="2022-10-30">
<pin digest="SHA-256">h/sha256hashbase64==</pin>
</pin-set>
</domain-config>
</network-security-config>
</publicKeyPinning>
<certificateTransparency>
<trace>0</trace>
<domain includeSubdomains="false">yourdomain.com</domain>
<!-- <logFile>path_to_custom_log_list.json</logFile> -->
</certificateTransparency>
<!-- Интеграция с системой мониторинга -->
<reportMonitoring>
<apiKey>137feb09-f390-4f00-b43f-ebcc...</apiKey>
<!-- <customFieldsUpdate>com.dexprotector.demo.AliceReporter</customFieldsUpdate> -->
<trace>0</trace>
</reportMonitoring>
</protector>
## Настройка ГостПротектор для библиотек (AAR)
Большинство механизмов защиты ГостПротектор можно применять к библиотекам Android (AAR), но есть некоторые различия, и определенные функции необходимо настраивать иначе, чем для APK и AAB.
Наиболее важные различия между настройкой защиты приложения и AAR касаются:
* Инициализации
* Kotlin
* Защиты общедоступных API
### Инициализация
Поскольку механизм среды выполнения ГостПротектор должен запускаться до первого доступа к AAR, необходимо настроить процесс инициализации и/или оставить включенным механизм автоматической инициализации ГостПротектор.
Чтобы гарантировать, что механизм среды выполнения ГостПротектор инициализируется при необходимости, механизм `autoInit` использует подход Content Provider и определяет компонент Content Provider в `AndroidManifest.xml`. Поэтому, если `autoInit="on"`, мы **настоятельно рекомендуем** указать `autoInitAuthorities="${applicationId}.yourUniqueLibId"`, дополнительно указав уникальный идентификатор для каждого AAR, где это необходимо, чтобы избежать риска конфликта, при котором в `android:authorities` указано несколько Content Provider с одним и тем же именем.
```xml
```
Мы настоятельно рекомендуем оставить `autoInit="on"`, но если вы предпочитаете установить `autoInit="off"`, необходимо указать либо `initMethod(s)`, либо `initClass(es)`. Например:
<aar autoInit="off">
<initMethod>com.sample.Lib.initMethod</initMethod>
<initClass>com.sample.MyReceiver</initClass>
</aar>
### Kotlin
Если ваш AAR содержит классы Kotlin, это необходимо указать в файле конфигурации (чего не требуется для APK). Причина в том, что AAR компилируются в байт-код Java, а не в байт-код Dalvik, поэтому должны обрабатываться нативными движками ГостПротектор по-разному. Просто укажите атрибут `kotlinSupport` внутри элемента ``, как показано ниже:
```xml
```
### Защита общедоступных API
При защите AAR крайне важно указать фильтры для шифрования классов таким образом, чтобы классы общедоступного API не шифровались.
### Пример конфигурации для библиотек и SDK (AAR)
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<protector>
<!-- Параметры сборки и ведения журнала для процесса ГостПротектор -->
<verbose>false</verbose>
<optimize>false</optimize>
<proguardMapFile>/Users/developer/project/library/build/outputs/mapping/release/mapping.txt</proguardMapFile>
<!-- Параметры защиты библиотек (AAR) -->
<aar autoInit="on" autoInitAuthorities="${applicationId}.myLibraryId" kotlinSupport="on"/>
<!-- Удаление небезопасных вызовов -->
<stripLogging>all</stripLogging>
<stripMethodCalls>
<filters>
<filter>android.util.Log.println</filter>
</filters>
</stripMethodCalls>
<!-- Механизмы защиты кода -->
<stringEncryption>
<filters>
<filter>glob:!**/**</filter> <!-- Исключить все -->
<filter>glob:com/test/**</filter> <!-- Включить конкретный внутренний пакет -->
</filters>
</stringEncryption>
<classEncryption>
<filters>
<filter>glob:!com/mycompany/library/public/**</filter> <!-- Исключить общедоступный API -->
</filters>
</classEncryption>
<hideAccess>
<filters>
<filter>glob:!**/**</filter> <!-- Исключить все -->
<filter>glob:com/test/**</filter> <!-- Включить конкретный внутренний пакет -->
</filters>
</hideAccess>
<nativeLibraryEncryption>
<filters>
<filter>libsome.so</filter>
</filters>
</nativeLibraryEncryption>
<jniObfuscation>
<filters>
<filter>glob:com/sample/NativeLibInterface</filter>
</filters>
</jniObfuscation>
<!-- Механизмы защиты ресурсов -->
<resourceEncryption>
<assets>
<filters>
<filter>glob:cert/**</filter>
</filters>
</assets>
</resourceEncryption>
<!-- RASP - Проверки окружения для обнаружения рутованных устройств, отладчиков,
эмуляторов и средств перехвата вызовов -->
<runtimeChecks/>
<!-- Параметры защиты сетевых подключений -->
<publicKeyPinning>
<trace>0</trace>
<actions> block<!--, report--></actions>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">librarydomain.com</domain>
<pin-set expiration="2022-10-30">
<pin digest="SHA-256">h/sha256hashbase64==</pin>
</pin-set>
</domain-config>
</network-security-config>
</publicKeyPinning>
<certificateTransparency>
<trace>0</trace>
<domain includeSubdomains="false">librarydomain.com</domain>
<!-- <logFile>path_to_custom_log_list.json</logFile> -->
</certificateTransparency>
<!-- Параметры защиты библиотек (AAR) -->
<reportMonitoring>
<apiKey>137feb09-f390-4f00-b43f-ebcc...</apiKey>
<!-- <customFieldsUpdate>com.dexprotector.demo.AliceReporter</customFieldsUpdate> -->
<trace>0</trace>
</reportMonitoring>
</protector>
## Подпись приложений
Подпись вашего приложения — обязательная часть обеспечения его защиты от несанкционированного вмешательства и клонирования. Для максимально возможной защиты от несанкционированного вмешательства и контроля целостности ГостПротектор использует **ряд параметров для построения криптографической цепочки доверия**, и информация о сертификате подписи приложения является важным звеном в этой цепочке.
В результате, если злоумышленник попытается повторно подписать защищенное приложение, криптографическая цепочка доверия будет нарушена, и приложение просто перестанет работать. Поэтому каждую новую версию вашего приложения необходимо повторно защищать с помощью ГостПротектор и повторно подписывать перед выпуском.
ГостПротектор проверяет надежность и целостность сертификата подписи как часть оценки безопасности; настоятельно рекомендуется использовать сертификат подписи с длиной ключа не менее 2048 бит, и ГостПротектор по умолчанию настроен таким образом, что приложение со слабым или скомпрометированным сертификатом подписи не будет обработано, что приведет к сообщению об ошибке.
Выбор режима подписи будет зависеть от этапа цикла сборки и от того, защищается APK, AAB или AAR. Поэтому ГостПротектор поддерживает различные режимы подписи, включая подпись приложений Google Play и подпись Amazon Appstore, любой из которых можно ввести в качестве `signMode` в файле конфигурации ГостПротектор или выбрать через ГостПротектор Студию. Значение `signMode` можно установить как `google`, `amazon`, `debug`, `release` или `none`. См. ниже руководства по каждому режиму подписи.
### Облачная подпись (подпись приложений Google Play; Amazon Appstore)
#### Подпись приложений Google Play
Вам необходимо использовать режим подписи `google`, если ваше приложение опубликовано или будет опубликовано в Google Play Store и вы используете подпись приложений Google Play, при этом Google управляет вашим ключом подписи приложения и использует его для подписи ваших APK при их распространении.
Если вы выберете режим подписи `google`, вам также потребуется ввести свой ключ загрузки и отпечаток SHA-256 целевого сертификата. Вы можете найти отпечаток сертификата на странице подписи приложений Google Play Console: Подпись приложений -> Сертификат подписи приложений -> Отпечаток сертификата SHA-256.
> ⚠️ **Важно отметить, что при использовании подписи приложений Google Play вы *должны* использовать режим подписи `google` в ГостПротектор, и после того, как приложение было защищено с использованием режима подписи `google`, оно станет *только* функциональным, когда оно будет *загружено и скачано непосредственно из Google Play*.** Это связано с тем, что приложение должно быть подписано на серверах Google с ожидаемым ключом подписи приложения, соответствующим отпечатку сертификата SHA-256, указанному в конфигурации ГостПротектор. Если вы попытаетесь запустить приложение локально или с помощью службы тестирования *без* предварительной загрузки и скачивания из Google Play, оно аварийно завершится. Если вы хотите протестировать приложение, которое было DexProtected с режимом подписи `google`, вы должны сделать это через Play Console.
Чтобы настроить режим подписи `google`, выполните следующие действия:
1. В файле конфигурации (`protector.xml`) укажите `google` в качестве значения `signMode`:
```xml
google
```
2. Добавьте отпечаток сертификата SHA-256 для ключа подписи приложения, который вы ранее сгенерировали для этого приложения через Google Play:
```xml
ВВЕДИТЕ_СВОЕ_ЗНАЧЕНИЕ_ЗДЕСЬ
```
3. Укажите информацию, связанную с хранилищем ключей, для вашего **ключа загрузки** в файл конфигурации (если вы используете плагин ГостПротектор Gradle, эта информация будет взята автоматически из `signingConfig`):
* `keystore` - путь к хранилищу ключей, содержащему ключ загрузки, используемый для создания ключа подписи приложения.
* `storepass` - пароль для хранилища ключей
* `alias` - псевдоним ключа
* `keypass` - пароль для ключа
Например:
```xml
...
google /Users/developer/keys/upload.keystore android android android AB:CD:EF:...
...
```
И если вы используете Gradle, обязательно добавьте новый `buildType`/`productFlavor` специально для публикации в Google Play, так как он не будет работать для других магазинов или для прямого распространения.
#### Подпись приложений Amazon Appstore
Вам необходимо использовать режим подписи `amazon`, если ваше приложение опубликовано или будет [опубликовано в Amazon Appstore](link-to-amazon-appstore).
Когда вы отправляете свое приложение, Amazon удаляет подпись, которую вы использовали для подписи своего приложения, и повторно подписывает его подписью Amazon, которая является уникальной для вас, не изменяется и одинакова для всех приложений в вашей учетной записи.
Поэтому, если вы выберете режим подписи `amazon`, вам также потребуется ввести отпечаток SHA-256 целевого сертификата. Этот хэш можно найти в разделе **Хэши сертификатов Appstore** консоли разработчика Amazon.
> ⚠️ **Важно отметить, что при использовании подписи приложений Amazon Appstore вы *должны* использовать режим подписи `amazon` в ГостПротектор, и после того, как приложение было защищено с использованием режима подписи `amazon`, оно станет *только* функциональным, когда оно будет *загружено и скачано непосредственно из Amazon Appstore*.** Это связано с тем, что приложение должно быть подписано на серверах Amazon с ожидаемой подписью Amazon, соответствующей отпечатку сертификата SHA-256, указанному в конфигурации ГостПротектор. Если вы попытаетесь запустить приложение локально или с помощью службы тестирования *без* предварительной загрузки и скачивания из Amazon Appstore, оно аварийно завершится.
Чтобы настроить режим подписи `amazon`, выполните следующие действия:
1. В файле конфигурации (`protector.xml`) введите `amazon` в качестве значения `signMode`:
```xml
amazon
```
2. Добавьте отпечаток сертификата SHA-256 для подписи Amazon:
```xml
ВВЕДИТЕ_СВОЙ_ХЭШ_AMAZON_ЗДЕСЬ
```
Например:
```xml
...
amazon 12:34:56:
...
...
```
И если вы используете Gradle, обязательно добавьте новый `buildType`/`productFlavor` специально для публикации в Amazon, так как он не будет работать для других магазинов или для прямого распространения.
### Подпись для системных и предустановленных приложений
Для системных и предустановленных приложений, для которых подпись приложений управляется платформой или поставщиком, режим подписи зависит от того, есть ли у вас доступ к ключу подписи платформы.
* **Если у вас есть доступ к ключу**, установите для `release` и заполните все другие теги, связанные с подписью, как если бы вы использовали свой собственный закрытый ключ:
<signMode>release</signMode>
<keystore>/Users/developer/keystores/platform.keystore</keystore>
<storepass>android</storepass>
<alias>android</alias>
<keypass>android</keypass>
* **Если у вас нет доступа к ключу**, установите для `none`, и, запросив файл сертификата подписи у поставщика платформы, добавьте путь к сертификату, используя тег ``, следующим образом:
<signMode>none</signMode>
<certificate>/home/developer/vendor/platform.x509.pem</certificate>
### Локальная подпись для APK
Если вы хотите подписать APK локально (либо потому, что он предназначен для прямого распространения, либо потому, что это обновление для старого приложения), и, следовательно, **не** используете подпись приложений Google Play и **не** отправляете приложение в Amazon Appstore, просто выберите `release`, а также укажите хранилище ключей, пароль хранилища ключей, псевдоним ключа и пароль ключа:
<signMode>release</signMode>
<keystore>/Users/developer/keystores/release.keystore</keystore>
<storepass>android</storepass>
<alias>android</alias>
<keypass>android</keypass>
# Интеграция
## Gradle-плагин ГостПротектор
Gradle-плагин `ГостПротектор` входит в каждый дистрибутив и может использоваться для защиты APK, AAB и AAR.
Шаги по внедрению ГостПротектор в процесс сборки:
1. Установите путь к ГостПротектор в `buildscript.repositories` (основной `build.gradle` вашего проекта), например:
```groovy
buildscript {
repositories {
google()
mavenCentral()
flatDir { dirs '/Users/developer/protector/lib' } // Путь к каталогу
lib ГостПротектор
}
// ...
}
```
2. Добавьте следующие зависимости:
```groovy
buildscript {
dependencies {
classpath ':protector-gradle-plugin:' // Gradle-плагин ГостПротектор
classpath ':protector:' // ГостПротектор
// ... other classpath dependencies
}
}
```
3. Примените Gradle-плагин ГостПротектор в файле `build.gradle` вашего приложения/библиотеки, в строке сразу после `apply plugin: 'com.android.application'` или `apply plugin: 'com.android.library'`:
```groovy
apply plugin: 'com.android.application' // или com.android.library
apply plugin: 'protector'
```
4. Необходимо указать соответствующий файл конфигурации ГостПротектор в `buildType`, следующим образом:
```groovy
android {
// ...
buildTypes {
release {
// ... other release settings
ext.set("protector.configFile", "${project.rootDir}/protector-release.xml")
}
debug {
// ... other debug settings
ext.set("protector.configFile", "${project.rootDir}/protector-debug.xml")
}
}
// ...
}
```
5. Чтобы указать файл конфигурации для конкретной разновидности продукта, применяется тот же принцип:
```groovy
android {
// ...
productFlavors {
flavor1 {
// ... flavor1 settings
ext.set("protector.configFile", "${project.rootDir}/protector-flavor1.xml")
}
flavor2 {
// ... flavor2 settings
ext.set("protector.configFile", "${project.rootDir}/protector-flavor2.xml")
}
}
// ...
}
```
Таким образом, можно управлять файлами конфигурации ГостПротектор для соответствующих вариантов сборки, используя параметры разновидностей, разновидности продуктов и типы сборки, например, следующим образом:
```groovy
android {
flavorDimensions "version", "target" // Пример параметров
productFlavors {
free {
dimension "version"
// ...
}
paid {
dimension "version"
// ...
}
googlePlay {
dimension "target"
// ...
}
amazonStore {
dimension "target"
// ...
}
}
buildTypes {
release {
// ...
// Установите конфигурацию на основе комбинации разновидностей
для сборок выпуска
productFlavors.free.googlePlay.ext.set("protector.configFile",
"${project.rootDir}/protector-free-google-release.xml")
productFlavors.paid.googlePlay.ext.set("protector.configFile",
"${project.rootDir}/protector-paid-google-release.xml")
productFlavors.free.amazonStore.ext.set("protector.configFile",
"${project.rootDir}/protector-free-amazon-release.xml")
productFlavors.paid.amazonStore.ext.set("protector.configFile",
"${project.rootDir}/protector-paid-amazon-release.xml")
}
debug {
// ...
// Установите конфигурацию на основе комбинации разновидностей
для отладочных сборок (необязательно)
productFlavors.free.googlePlay.ext.set("protector.configFile",
"${project.rootDir}/dexprotector-free-google-debug.xml")
// ... и т.д.
}
}
}
```
## Защита гибридных и кроссплатформенных приложений (React Native, Ionic, NativeScript, Cordova, Xamarin, Flutter)
### Гибридные и кроссплатформенные приложения на основе JavaScript и HTML
Защиты гибридных или кроссплатформенное приложение, разработанное с использованием таких фреймворков, как React Native, Ionic, NativeScript и Cordova.
Для целей защиты кода необходимо выбрать файлы JS и HTML с помощью шифрования ресурсов. Это означает установку такого фильтра:
<resourceEncryption mode="all"> <!-- Зашифровать все в ресурсах -->
<assets mode="on"> <!-- Специально выбрать активы -->
<filters>
<filter>**.html</filter> <!-- Зашифровать все файлы HTML -->
<filter>**.js</filter> <!-- Зашифровать все файлы JS -->
</filters>
</assets>
</resourceEncryption>
### Xamarin
Каждая функция ГостПротектор доступна для Android-приложений на основе Xamarin, включая:
* **Защиты кода** и ресурсов посредством обфускации и шифрования классов, методов и строк для предотвращения статического анализа и реверс-инжиниринга.
* **Runtime Application Self-Protection (RASP)** — защита приложений во время выполнения с постоянными проверками операционной среды и сети связи для предотвращения динамического анализа и атак типа "человек посередине".
* **Проверки целостности** для предотвращения несанкционированного изменения кода и ресурсов и клонирования.
* Выделенный **CryptoModule** ГостПротектор, изолирующий криптографические данные и обработку для предотвращения перехвата криптографических ключей и вычислений.
Android-приложения Xamarin содержат байт-код Dalvik, ресурсы и нативные библиотеки. Внутри ресурсов находятся нативные библиотеки Mono Runtime и сборки Xamarin. Сборки Xamarin состоят из среды выполнения Xamarin и программного кода Xamarin.
Основные средства защиты ГостПротектор от статического анализа работают с байт-кодом Dalvik в Android-приложениях, разработанных на Xamarin, которые могут содержать **специальные классы Android** (Activity, ContentProvider, Receiver, Service), **классы поддержки Xamarin/Mono** и **классы сторонних библиотек**. Таким образом, все следующее применимо так же, как и для приложения, разработанного на Java или Kotlin:
* Шифрование строк
* Шифрование классов
* Сокрытие доступа
* Обфускация нативного кода (за исключением Mono Runtime)
* Шифрование нативного кода
* Защита от отладки нативного кода
* Шифрование файлов ресурсов и активов в `assets/`, `res/` и `root/`
* Обфускация имен ресурсов (`resources.arsc`)
* Обфускация `AndroidManifest.xml`: маскировка имен классов Applications/ActivityNames/ContentProviders/Receiver
Дополнительно `ГостПротектор` также способен взаимодействовать с Mono Runtime, что позволяет **шифровать сборки Xamarin**. Для этого необходимо использовать элемент `` в файле конфигурации ГостПротектор, чтобы включить шифрование сборок. Например:
<resourceEncryption>
<!-- ... другие настройки шифрования ресурсов ... -->
<xamarinAssemblies dir="assets/assemblies"/> <!-- Каталог по умолчанию -->
<!-- или -->
<!-- <xamarinAssemblies dir="custom/assembly/path"/> -->
</resourceEncryption>
Для всех остальных механизмов защиты, включая проверки времени выполнения, специальная конфигурация не требуется.
### Flutter
ГостПротектор поддерживает приложения, разработанные с помощью Flutter, так же, как и нативные приложения; нет никаких различий в требованиях к конфигурации.
# ГостПротектор Студия
## Обзор
`ГостПротектор Студия` — это настольное приложение, включенное в каждую лицензию ГостПротектор. Студия предлагает простой графический интерфейс, в котором можно контролировать каждый аспект процесса защиты ГостПротектор. Студия позволяет:
* Активировать лицензию ГостПротектор
* Наблюдать за анализом исходного файла для защиты
* Настраивать параметры защиты для проекта
* Создавать профили защиты
* Визуализировать, как именно механизмы защиты ГостПротектор применяются к коду и ресурсам
* Управлять интеграцией с `Элис`
## Использование ГостПротектор Студии: Исполняемый файл ГостПротектор и файл лицензии
### Работа с исполняемым файлов ГостПротектор и файлом лицензии
Если файл `protector.jar` находится не в том же каталоге, что и ГостПротектор Студия, укажите его местоположение, прежде чем вы сможете начать использовать Студию.
Для просмотра и управления статусом лицензии, нажмите `Информация о лицензии` в правом нижнем углу открывающегося окна.
### Активация лицензии через Студию (онлайн)
1. Нажмите `'Информация о лицензии'` справа от панели в нижней части окна.
2. Нажмите `'Активировать лицензию'` и следуйте инструкциям в новом окне. Чтобы активировать лицензию и получить файл лицензии **онлайн**, необходимо ввести уникальный одноразовый код активации, указанный в электронном письме со ссылками для загрузки.
3. После успешной активации в домашнем каталоге пользователя будет создан файл лицензии `protector.licel`.
### Активация лицензии через Студию (оффлайн)
1. Нажмите `'Информация о лицензии'` справа от панели в нижней части окна.
2. Нажмите `'Активировать лицензию'` и следуйте инструкциям в новом окне. Если у вас нет активного подключения к Интернету или вы предпочитаете автономную активацию, введите уникальный одноразовый код активации, указанный в электронном письме со ссылками для загрузки, и нажмите `'Создать запрос активации'`.
3. После ввода действительного кода активации будет сгенерирован код запроса. Отправьте этот код запроса в нашу службу поддержки по электронной почте gostprotector@licel.ru. Вы получите код ответа не позднее, чем в течение 1 рабочего дня.
4. После получения кода ответа вернитесь в то же окно `'Активировать лицензию'` и нажмите `'У меня уже есть код ответа активации'`. В следующем окне введите полученный код ответа и нажмите `'Активировать'`, чтобы завершить процедуру активации лицензии.
5. После успешной активации в домашнем каталоге пользователя будет создан файл лицензии `protector.licel`.
## Защита APK, AAB или AAR с помощью ГостПротектор Студии
### Рекомендации по защите
Мы настоятельно рекомендуем использовать все предоставляемые функции защиты, поскольку каждый элемент защиты повышает уровень безопасности и устойчивость к вредоносному ПО, реверс-инжинирингу, несанкционированному вмешательству и атакам типа "человек посередине".
Настройка ГостПротектор осуществляется с помощью **единого XML-файла**, который можно редактировать непосредственно или через интерфейс ГостПротектор Студии.
Файл конфигурации по умолчанию (`protector.xml`) находится в корневом каталоге дистрибутива, но каждое приложение (или библиотека) может иметь разные требования по защите. Поэтому мы также настоятельно рекомендуем настроить свою конфигурацию, указав для защиты конфиденциальный код и ресурсы, а также включить механизмы защиты приложений во время выполнения и защиты сетевых подключений, предлагаемые ГостПротектор.
ГостПротектор Студия предлагает интуитивно понятный интерфейс, который поможет вам настроить и управлять процессом защиты. Он предлагает описания и подсказки для каждого механизма защиты в своих окнах "Параметры защиты" и позволяет применять выбранные параметры одним щелчком мыши. Затем эти параметры автоматически сохраняются в файле конфигурации XML, готовом к применению при запуске процесса ГостПротектор.
### Загрузить пакет для защиты
Первое окно позволяет указать файл для защиты, и начальный файла конфигурации, который можно будет отредактировать позже через Студию. Вы можете выбрать либо конфигурацию по умолчанию, включенную в дистрибутивный пакет, либо пользовательский файл конфигурации XML по вашему выбору.
### Управление параметрами защиты
После нажатия `'Открыть файл и применить настройки'` можно просмотреть проанализированную структуру пакета и управлять параметрами защиты.
Механизмы защиты кода и ресурсов (Шифрование классов, Сокрытие доступа, Шифрование строк, Шифрование ресурсов) можно применять непосредственно через обзор структуры пакета, выбрав класс или файл и используя переключатели фильтра.
Окно "Параметры защиты" предлагает обзор всех параметров конфигурации; можно управлять всеми механизмами защиты и применять фильтры через элементы интерфейса.
Любые изменения в конфигурации XML, внесенные через Студию, могут быть сохранены в любое время, в том числе после завершения процесса защиты.
На финальном этапе конфигурации защиты, есть возможность просмотреть анализ того, что в пакете будет защищено, выбрав вкладку "Обзор".
### Запустить защиту и просмотреть результаты защиты
Для защиты необходимо выбрать `'Запустить защиту'`, в процесс работы ГостПротектор будет отображать журнал выполненный действий.
После завершения защиты можно сохранить вновь созданный профиль конфигурации, чтобы на него можно было ссылаться, повторно использовать или адаптировать позже.
Разумеется, я переработаю текст, чтобы использовать более формальный стиль, избегая повелительного наклонения там, где это уместно, и заменяя "Защитите" на "Для защиты" или аналогичные конструкции.
# Элис - Мониторинг угроз и телеметрия
## Использование Элис с ГостПротектор
После релиза приложения, `ГостПротектор` будет отслеживать его безопасность во время использования в любой точке мира, и отправлять (при активации данного модуля) при этом все данные о рисках, угрозах и атаках в вашу учетную запись в системе телеметрии атак и аналитики угроз `Элис`.
`Элис` предлагает простую в использовании панель управления, посредством которой обеспечивается отслеживание ключевых инцидентов по мере их возникновения, включая любые случаи аномалий HTTP Public Key Pinning, несанкционированного вмешательства и сбоев. Пользователь имеет возможность просматривать указанные инциденты с разбивкой по времени и месту возникновения, а также адаптировать выходные данные в соответствии с потребностями формирования отчетов.
`ГостПротектор` и `Элис` также могут функционировать в сочетании с существующей системой анализа рисков, обеспечивая получение необходимой информации для мониторинга безопасности в формате, оптимальном для организации.
В результате обеспечивается удобный обзор каждого инцидента с момента его возникновения, гибкий инструмент поиска, осуществляющий сортировку по типу и содержимому атаки, а также уведомления при каждой активации средств защиты ГостПротектор.
---
## Начало работы с Элис
1. **Получение учетных данных для входа в Элис**
При наличии активной лицензии ГостПротектор, следует заполнить форму запроса для получения данных доступа к Элис, либо направить обращение по адресу `gostprotector@licel.ru`.
2. **Копирование ключа API для интеграции с Элис**
Вход в систему осуществляется с использованием имени пользователя и пароля, полученных ранее. На начальной странице Элис будет представлен уникальный автоматически сгенерированный ключ, используемый для интеграции Элис при конфигурировании ГостПротектор.
3. **Указание ключа API в файл конфигурации ГостПротектор**
С использованием ГостПротектор Студии или путем непосредственного редактирования файла конфигурации, добавьте элемент `` и вложенный элемент ``, следующим образом:
<reportMonitoring>
<apiKey>ЗДЕСЬ_ВАШ_КЛЮЧ_API_ALICE</apiKey>
<!-- Необязательно: добавьте метод пользовательских полей, если это необходимо -->
<!-- <customFieldsUpdate>com.example.MyCustomFields</customFieldsUpdate> -->
<!-- Необязательно: установите уровень трассировки (0 или 1000 для отладки) -->
<!-- <trace>0</trace> -->
</reportMonitoring>
Также возможно включение Элис через ГостПротектор Студию посредством
указания ключа API и, при необходимости, пользовательского метода.
4. **Защита приложения и получение первых отчетов**
Для защиты приложения используйте измененный файл конфигурации. Ключ API Элис будет интегрирован в приложение в процессе защиты. В дальнейшем, при обнаружении приложением угрозы, отчет будет зарегистрирован в Элис с использованием указанного ключа. В случае компрометации ключа, предусмотрена возможность генерации нового ключа в Элис и блокировки скомпрометированного. Пользователь может инициировать инцидент самостоятельно, либо ожидать регистрации реальных инцидентов. При отсутствии инцидентов, Элис отображает только начальную страницу и демонстрационный проект. При возникновении новых инцидентов, приложение автоматически передает отчетность в Элис.