<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<protector>
<!-- Параметры сборки и ведения журнала для процесса ГостПротектор -->
<verbose>false</verbose>
<optimize>false</optimize>
<securityAssessment>
<signingCertificateCompromised mode="error"/>
<signingCertificateWeakKey mode="error"/>
<dependencyCheck mode="warning" />
</securityAssessment>
<proguardMapFile>no_default</proguardMapFile>
<!-- Методы подписи -->
<signMode>debug</signMode>
<keystore>no_default</keystore>
<storepass>no_default</storepass>
<alias>no_default</alias>
<keypass>no_default</keypass>
<certificate>no_default</certificate>
<sha256CertificateFingerprint>no_default</sha256CertificateFingerprint>
<legacySha256CertificateFingerprint>no_default</legacySha256CertificateFingerprint>
<!-- Удаление небезопасных вызовов -->
<stripLogging>no_default</stripLogging>
<stripMethodCalls>
<filters>
<filter>no_default</filter>
</filters>
</stripMethodCalls>
<!-- Механизмы защиты кода -->
<stringEncryption/>
<annotationEncryption/>
<jniObfuscation/>
<hideAccess/>
<classEncryption/>
<nativeLibraryEncryption/>
<!-- Механизмы защиты ресурсов -->
<resourceEncryption>
<assets>
<filters>
<filter>no_default</filter>
</filters>
</assets>
<res>
<filters>
<filter>no_default</filter>
</filters>
</res>
<strings>
<filters>
<filter>no_default</filter>
</filters>
</strings>
<nameObfuscation>
<filters>
<filter>no_default</filter>
</filters>
</nameObfuscation>
<androidManifestMangling/>
<xamarinAssemblies/>
</resourceEncryption>
<!-- RASP - Проверки окружения для обнаружения рутованных устройств,
отладчиков, эмуляторов и средств перехвата вызовов -->
<antiDebug>true</antiDebug>
<antiEmulator>true</antiEmulator>
<antiManualInstall>true</antiManualInstall>
<antiMalware>true</antiMalware>
<runtimeChecks/>
<!-- Параметры защиты сетевых подключений -->
<publicKeyPinning src="no_default">
<trace>0</trace>
<actions>block, report</actions>
<network-security-config>
<domain-config>
<domain includeSubdomains="false">...</domain>
<pin-set expiration="no_default">
<pin digest="no_default"></pin>
</pin-set>
</domain-config>
</network-security-config>
</publicKeyPinning>
<certificateTransparency>
<trace>0</trace>
<domain includeSubdomains="false">no_default</domain>
<!-- <logFile>no_default</logFile> -->
</certificateTransparency>
<!-- Защита пользовательского интерфейса -->
<uiProtection/>
<!-- Интеграция с системой мониторинга об угрозах и телеметрии атак -->
<reportMonitoring>
<apiKey>no_default</apiKey>
<!-- <customFieldsUpdate>no_default</customFieldsUpdate> -->
<trace>0</trace>
</reportMonitoring>
<!-- Параметры защиты библиотек (AAR) -->
<aar autoInit="on" autoInitAuthorities="${applicationId}">
<!-- <initMethod>...</initMethod> -->
<!-- <initClass>...</initClass> -->
<!-- <kotlinSupport>...</kotlinSupport> -->
<!-- <nativeClassEncryption>...</nativeClassEncryption> -->
<!-- <nativeHideAccess>...</nativeHideAccess> -->
</aar>
</protector>
## Описание параметров конфигурации
*(Примечание: В следующих разделах подробно описываются элементы, представленные выше. Для форматирования используются заголовки для категорий и подзаголовки для отдельных элементов.)*
### Параметры сборки
**Подробное ведение журнала** (`boolean`)
* **Элемент:** `<securityAssessment>
<signingCertificateCompromised mode="error"/>
<signingCertificateWeakKey mode="error"/>
<dependencyCheck mode="warning" />
</securityAssessment>
**Файл соответствий ProGuard** (`string`)
* **Элемент:** `<keystore>/home/developer/example.keystore</keystore>
<storepass>examplestorepass</storepass>
<alias>examplealias</alias>
<keypass>examplekeypass</keypass>
**Информация о хранилище ключей** (для `signMode == google`)
* **Элемент:** `<signMode>google</signMode>
<keystore>/home/developer/upload.keystore</keystore>
<storepass>upload_password</storepass>
<alias>upload_alias</alias>
<keypass>upload_key_password</keypass>
<sha256CertificateFingerprint>AB:CD:EF:...</sha256CertificateFingerprint>
<!-- <legacySha256CertificateFingerprint>12:34:56:...</legacySha256CertificateFingerprint> -->
### Удаление небезопасных вызовов
**Удаление вызовов ведения журнала**
* **Элемент:** `<stripMethodCalls>
<filters>
<filter>glob:com/example/debug/Logger.**</filter>
</filters>
</stripMethodCalls>
### Защита кода
**Шифрование строк**
* **Элемент:** `<stringEncryption>
<filters>
<filter>glob:!com/google/**</filter>
<filter>glob:com/mycompany/sensitive/**</filter>
</filters>
</stringEncryption>
**Шифрование аннотаций**
* **Элемент:** `<annotationEncryption>
<filters>
<filter>glob:kotlin/Metadata.class</filter> <!-- Example: Encrypt standard Kotlin metadata -->
<filter>glob:com/mycompany/annotations/SecretAnnotation.class</filter>
</filters>
</annotationEncryption>
**Обфускация JNI**
* **Элемент:** `<jniObfuscation>
<filters>
<filter>glob:com/mycompany/nativeinterface/Bridge.class</filter>
</filters>
</jniObfuscation>
**Сокрытие доступа**
* **Элемент:** `<hideAccess>
<filters>
<filter>glob:!com/google/**</filter>
<filter>glob:com/mycompany/internal/**</filter>
</filters>
</hideAccess>
**Шифрование классов**
* **Элемент:** `<classEncryption>
<filters>
<filter>glob:!com/mycompany/publicapi/**</filter>
</filters>
</classEncryption>
**Шифрование нативных библиотек**
* **Элемент:** `<nativeLibraryEncryption>
<filters>
<filter>glob:lib/armeabi-v7a/libsecret.so</filter>
</filters>
</nativeLibraryEncryption>
### Защита ресурсов
**Шифрование ресурсов**
* **Элемент:** `<resourceEncryption nameObfuscation="on">
<assets>
<filters><filter>glob:data/**</filter></filters>
</assets>
<res>
<filters><filter>glob:raw/**</filter></filters>
</res>
<strings>
<filters><filter>my_secret_string_key</filter></filters>
</strings>
<nameObfuscation>
<filters><filter>layout/secret_layout</filter></filters>
</nameObfuscation>
<root>
<filters><filter>important_config.dat</filter></filters>
</root>
<androidManifestMangling/>
<xamarinAssemblies dir="assets/assemblies"/>
</resourceEncryption>
### RASP (Runtime Application Self-Protection) - Проверки окружения во время выполнения
**Защита от отладки**
* **Элемент:** `<publicKeyPinning>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">example.com</domain>
<pin-set expiration="2025-01-01">
<pin digest="SHA-256">...</pin>
</pin-set>
</domain-config>
</network-security-config>
</publicKeyPinning>
* **Пример №2 (внешний файл):**
```xml
<certificateTransparency>
<trace>0</trace>
<!-- <domain includeSubdomains="false">example.com</domain> -->
<!-- <logFile>/path/to/custom_log_list.json</logFile> -->
</certificateTransparency>
### Защита пользовательского интерфейса
**Защита пользовательского интерфейса**
* **Элемент:** `// Example structure
package com.example;
import java.util.Map;
public class AliceCustomData {
public static void updateFields(Map<String, String> values) {
values.put("custom_field_1", "some_value");
values.put("custom_field_2", getDynamicValue());
}
private static String getDynamicValue() {
return "dynamic";
}
}
* **Значение по умолчанию:** отсутствует, но поле должно
иметь следующую структуру, если используется:
<customFieldsUpdate><![CDATA[com.example.AliceCustomData]]></customFieldsUpdate>
* **Элемент (вложенный):** `trace`
* **Формат:** string (integer, обычно 0 или 1000)
* **Описание:** Уровень ведения журнала сообщений ГостПротектор
на конечном устройстве. Для целей отладки установите значение `1000`.
В противном случае установите значение `0` или исключите узел `<reportMonitoring>
<apiKey>YOUR_ALICE_API_KEY</apiKey>
<customFieldsUpdate><![CDATA[
com.example.AliceCustomData
]]></customFieldsUpdate>
<trace>0</trace>
</reportMonitoring>
### Параметры AAR
**AAR**
* **Элемент:** `<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>
И ниже приведены перестановки для элемента `<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, перечисленный в Обзоре файла конфигурации, за исключением элементов внутри тега `<?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
<aar autoInit="off">
<initMethod>com.sample.Lib.initMethod</initMethod>
<initClass>com.sample.MyReceiver</initClass>
</aar>
### Kotlin
Если ваш AAR содержит классы Kotlin, это необходимо указать в файле конфигурации (чего не требуется для APK). Причина в том, что AAR компилируются в байт-код Java, а не в байт-код Dalvik, поэтому должны обрабатываться нативными движками ГостПротектор по-разному. Просто укажите атрибут `kotlinSupport` внутри элемента `<?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
<signMode>release</signMode>
<keystore>/Users/developer/keystores/platform.keystore</keystore>
<storepass>android</storepass>
<alias>android</alias>
<keypass>android</keypass>
* **Если у вас нет доступа к ключу**, установите для `<signMode>none</signMode>
<certificate>/home/developer/vendor/platform.x509.pem</certificate>
### Локальная подпись для APK
Если вы хотите подписать APK локально (либо потому, что он предназначен для прямого распространения, либо потому, что это обновление для старого приложения), и, следовательно, **не** используете подпись приложений Google Play и **не** отправляете приложение в Amazon Appstore, просто выберите `<signMode>release</signMode>
<keystore>/Users/developer/keystores/release.keystore</keystore>
<storepass>android</storepass>
<alias>android</alias>
<keypass>android</keypass>
<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, так же, как и нативные приложения; нет никаких различий в требованиях к конфигурации.
<reportMonitoring>
<apiKey>ЗДЕСЬ_ВАШ_КЛЮЧ_API_ALICE</apiKey>
<!-- Необязательно: добавьте метод пользовательских полей, если это необходимо -->
<!-- <customFieldsUpdate>com.example.MyCustomFields</customFieldsUpdate> -->
<!-- Необязательно: установите уровень трассировки (0 или 1000 для отладки) -->
<!-- <trace>0</trace> -->
</reportMonitoring>
Также возможно включение Элис через ГостПротектор Студию посредством
указания ключа API и, при необходимости, пользовательского метода.
4. **Защита приложения и получение первых отчетов**
Для защиты приложения используйте измененный файл конфигурации. Ключ API Элис будет интегрирован в приложение в процессе защиты. В дальнейшем, при обнаружении приложением угрозы, отчет будет зарегистрирован в Элис с использованием указанного ключа. В случае компрометации ключа, предусмотрена возможность генерации нового ключа в Элис и блокировки скомпрометированного. Пользователь может инициировать инцидент самостоятельно, либо ожидать регистрации реальных инцидентов. При отсутствии инцидентов, Элис отображает только начальную страницу и демонстрационный проект. При возникновении новых инцидентов, приложение автоматически передает отчетность в Элис.
<reportMonitoring>
<apiKey>ЗДЕСЬ_ВАШ_КЛЮЧ_API_ALICE</apiKey>
<!-- Необязательно: добавьте метод пользовательских полей, если это необходимо -->
<!-- <customFieldsUpdate>com.example.MyCustomFields</customFieldsUpdate> -->
<!-- Необязательно: установите уровень трассировки (0 или 1000 для отладки) -->
<!-- <trace>0</trace> -->
</reportMonitoring>
Также возможно включение Элис через ГостПротектор Студию посредством
указания ключа API и, при необходимости, пользовательского метода.
4. **Защита приложения и получение первых отчетов**
Для защиты приложения используйте измененный файл конфигурации. Ключ API Элис будет интегрирован в приложение в процессе защиты. В дальнейшем, при обнаружении приложением угрозы, отчет будет зарегистрирован в Элис с использованием указанного ключа. В случае компрометации ключа, предусмотрена возможность генерации нового ключа в Элис и блокировки скомпрометированного. Пользователь может инициировать инцидент самостоятельно, либо ожидать регистрации реальных инцидентов. При отсутствии инцидентов, Элис отображает только начальную страницу и демонстрационный проект. При возникновении новых инцидентов, приложение автоматически передает отчетность в Элис.