<?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>
<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>
<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>
<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>
<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>
<?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 autoInit="off">
<initMethod>com.sample.Lib.initMethod</initMethod>
<initClass>com.sample.MyReceiver</initClass>
</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>
<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>
<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>
<resourceEncryption>
<!-- ... другие настройки шифрования ресурсов ... -->
<xamarinAssemblies dir="assets/assemblies"/> <!-- Каталог по умолчанию -->
<!-- или -->
<!-- <xamarinAssemblies dir="custom/assembly/path"/> -->
</resourceEncryption>
Для всех остальных механизмов защиты, включая проверки времени выполнения, специальная конфигурация не требуется.
<reportMonitoring>
<apiKey>ЗДЕСЬ_ВАШ_КЛЮЧ_API_ALICE</apiKey>
<!-- Необязательно: добавьте метод пользовательских полей, если это необходимо -->
<!-- <customFieldsUpdate>com.example.MyCustomFields</customFieldsUpdate> -->
<!-- Необязательно: установите уровень трассировки (0 или 1000 для отладки) -->
<!-- <trace>0</trace> -->
</reportMonitoring>
Также возможно включение Элис через ГостПротектор Студию посредством
указания ключа API и, при необходимости, пользовательского метода.
4. **Защита приложения и получение первых отчетов**
Для защиты приложения используйте измененный файл конфигурации. Ключ API Элис будет интегрирован в приложение в процессе защиты. В дальнейшем, при обнаружении приложением угрозы, отчет будет зарегистрирован в Элис с использованием указанного ключа. В случае компрометации ключа, предусмотрена возможность генерации нового ключа в Элис и блокировки скомпрометированного. Пользователь может инициировать инцидент самостоятельно, либо ожидать регистрации реальных инцидентов. При отсутствии инцидентов, Элис отображает только начальную страницу и демонстрационный проект. При возникновении новых инцидентов, приложение автоматически передает отчетность в Элис.