# Сохранение скриптов Frida

FIRERPA предоставляет возможность сохранения скриптов Frida. Вы можете легко внедрять скрипты через соответствующий API, а менеджер скриптов FIRERPA будет автоматически управлять внедренными скриптами. Даже если ваш скрипт аварийно завершится или процесс приложения будет остановлен, FIRERPA автоматически повторно внедрит скрипт при следующем запуске вашего приложения. Эта функция была добавлена в версии 7.80.

## Установка скрипта

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

```{attention}
Менеджер скриптов позволяет внедрять только один скрипт в каждое приложение одновременно. Вы не можете внедрить несколько скриптов в одно и то же приложение за раз.
```

```python
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, standup=5)
```

Параметр `script` — это содержимое вашего Frida-скрипта для внедрения (поддерживается байт-код), `runtime` — соответствующая среда выполнения, по умолчанию `qjs`. Параметр `standup` означает, что внедрение произойдет только через 5 секунд после запуска процесса приложения (время отсчитывается с момента создания процесса). Минимальное значение этого параметра — 1 секунда, максимальное — 300 секунд. Это позволяет избежать сбоев и других проблем состояния гонки, вызванных слишком ранним внедрением в процесс приложения. В режиме `spawn` этот параметр всегда должен быть равен 0.

Этот API также поддерживает внедрение в режиме `spawn`. Однако обратите внимание, что использование режима `spawn` может прервать ваш поток операций с пользовательским интерфейсом (если вам нужно одновременно работать с UI). Это связано с тем, что в режиме `spawn`, в случае сбоя скрипта или выхода из приложения, этот режим автоматически перезапустит приложение, что может помешать вашим действиям с интерфейсом. Если вам необходимо использовать режим `spawn`, используйте следующие параметры.

```python
app = d.application("com.android.settings")
app.attach_script(script, runtime=ScriptRuntime.RUNTIME_QJS, spawn=True, standup=0)
```

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

## Удаление скрипта

Этот API удаляет уже установленный в приложении скрипт Frida. Скрипт будет отсоединен от процесса приложения, и менеджер скриптов FIRERPA прекратит отслеживать его состояние и не будет выполнять повторное внедрение в случае сбоя.

```python
app = d.application("com.android.settings")
app.detach_script()
```

## Проверка установки

Этот API используется для проверки, установлен ли скрипт в приложении. На основе этого статуса вы можете определить, требуется ли повторная установка.

```python
app = d.application("com.android.settings")
app.is_attached_script()
```

## Проверка внедрения

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

```python
app = d.application("com.android.settings")
app.is_script_alive()
```

## Просмотр логов скрипта

Логи консоли из вашего скрипта, такие как `console.log`, а также сообщения об ошибках скрипта, можно просмотреть. Однако для этого необходимо выполнить предварительную настройку при запуске. Пожалуйста, обратитесь к разделу `Просмотр логов`, чтобы узнать, как настроить файл логов. Предположим, вы правильно настроили файл логов как `/data/local/tmp/server.log`. В этом случае, когда вам нужно будет просмотреть логи скрипта, выполните следующую команду. Она отфильтрует всю информацию из логов, относящуюся к внедренным скриптам. Вы также можете использовать другие команды, например `tail -f`, для непрерывного отслеживания логов.

```bash
grep SCRIPT /data/local/tmp/server.log
```

## Автономное сохранение

Автономное сохранение означает, что вы можете разместить ваш скрипт FRIDA на устройстве в виде файла конфигурации, и FIRERPA автоматически загрузит его после запуска. Вам не нужно использовать вышеупомянутые API для внедрения, удаления и других операций; достаточно просто создать файл скрипта в определенном формате и поместить его в указанный каталог. Эта функция поддерживает мониторинг каталога, загрузку, удаление и обновление скриптов в реальном времени. Изменения, внесенные непосредственно в файлы в каталоге скриптов, также будут применены в реальном времени. Ниже приведен простой пример конфигурации сохранения скрипта в формате YAML. Содержимое скрипта в этой конфигурации — `console.log("Hello From Yaml Script")`.

```yaml
enable: true
application: "com.android.settings"
version: "2.10"
user: 0
runtime: "qjs"
script: !!binary "Y29uc29sZS5sb2coIkhlbGxvIEZyb20gWWFtbCBTY3JpcHQiKQ=="
emit: "http://myserver/reportData"
encode: "none"
standup: 10
spawn: false
```

Подробное объяснение каждого параметра в приведенном выше примере конфигурации скрипта

| Поле        | Описание                                                                                             |
|-------------|------------------------------------------------------------------------------------------------------|
| enable      | Включить этот скрипт                                                                                 |
| application | ID приложения для внедрения скрипта (например, com.android.setting)                                  |
| version     | Версия приложения, поддерживаемая для внедрения скрипта ("N/A" означает любую версию)                |
| user        | Если это клонированное приложение, укажите ID пользователя клонированного приложения (обычно 999)      |
| script      | Содержимое скрипта в формате base64, поддерживает текст или бинарные данные (пожалуйста, пишите в соответствии с шаблоном) |
| runtime     | Среда выполнения (runtime) скрипта (qjs, v8)                                                         |
| standup     | Время задержки внедрения (рассчитывается с момента запуска процесса)                                  |
| spawn       | Использовать режим spawn (standup будет проигнорирован)                                               |
| encode      | Если скрипт отправляет данные, укажите здесь кодировку (zlib/none)                                    |
| emit        | Если скрипт отправляет данные, укажите здесь место назначения                                        |

Для получения дополнительной информации о функции отправки данных `emit`, пожалуйста, обратитесь к разделу `Использование Frida для отправки данных`.

Выше приведен полный пример автономного скрипта. После его создания сохраните файл конфигурации с именем `{file_name}.yaml` и поместите его в каталог `/data/usr/modules/script` на устройстве. Система автоматически загрузит вашу конфигурацию. Система автоматически отслеживает изменения в каталоге `/data/usr/modules/script`. Если вы обновите или удалите конфигурацию YAML, система также автоматически обновит или отменит внедрение вашего скрипта.