Перейти к основному содержимому

Frida API

Описание​

Набор интерфейсов для динамического анализа и инструментации приложений через Frida в ZennoDroid.

ИнтерфейсОписание
IFridaDeviceAPIУправление Frida Server и подключение к процессам
IFridaSessionAPIСессия подключения к конкретному процессу
IFridaScriptAPIЖизненный цикл и обмен сообщениями скрипта

IFridaDeviceAPI​

Предназначен для работы с инструментом динамического анализа Frida на Android-устройстве. Позволяет управлять Frida Server, подключаться к процессам и внедрять скрипты.

Id​

  • string Id { get; }
    Уникальный идентификатор устройства.

    Возвращает:
    Строку с ID устройства (например, ADB serial).

Пример.​

var device = instance.DroidInstance.FridaDevice;

project.SendInfoToLog(device.Id); // Серийный номер устройства

Name​

  • string Name { get; }
    Имя устройства.

    Возвращает:
    Человекочитаемое название устройства или эмулятора.

Пример.​

var device = instance.DroidInstance.FridaDevice;

project.SendInfoToLog(device.Name); // Название устройства

Attach​

  • IFridaSessionAPI Attach(uint pid)
    Подключается к уже запущенному процессу.

    Параметры:

    • pid — идентификатор процесса.

    Возвращает:
    Объект IFridaSessionAPI, представляющий активную сессию.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var pid = device.Spawn("com.android.settings");
var session = device.Attach(pid); // Подключиться к процессу по PID

DetachAllSessions​

  • void DetachAllSessions()
    Отключает все активные Frida-сессии на устройстве.

Пример.​

var device = instance.DroidInstance.FridaDevice;

device.DetachAllSessions(); // Закрыть все сессии Frida на устройстве

DetachSessionByScriptName​

  • void DetachSessionByScriptName(string scriptName)
    Отключает сессию, связанную с указанным скриптом.

    Параметры:

    • scriptName — имя скрипта, по которому производится поиск и отключение.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");
script.Load();

device.DetachSessionByScriptName("myScript"); // Закрыть сессию скрипта по его имени

InstallAndRunServer​

  • void InstallAndRunServer()
    Устанавливает (если необходимо) и запускает Frida Server на устройстве.

Пример.​

var device = instance.DroidInstance.FridaDevice;

device.InstallAndRunServer(); // Установить и запустить frida-server на устройстве

KillServer​

  • void KillServer()
    Останавливает Frida Server.

Пример.​

var device = instance.DroidInstance.FridaDevice;

device.KillServer(); // Остановить frida-server на устройстве

LoadScriptToApp​

  • void LoadScriptToApp(string packageName, string source)
    Загружает и выполняет Frida-скрипт в указанном приложении.

    Параметры:

    • packageName — имя пакета приложения;
    • source — исходный код Frida-скрипта (JavaScript).

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

// Внедрить скрипт в приложение
device.LoadScriptToApp("com.android.settings", project.Variables["script"].Value);

LoadScriptToFrontmost​

  • void LoadScriptToFrontmost(string source)
    Загружает и выполняет скрипт в текущем активном приложении.

    Параметры:

    • source — исходный код скрипта.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

// Внедрить скрипт в приложение, открытое на переднем плане
device.LoadScriptToFrontmost(project.Variables["script"].Value);

Resume​

  • void Resume(uint pid)
    Возобновляет выполнение ранее запущенного процесса.

    Параметры:

    • pid — идентификатор процесса.

Пример.​

var source = project.Variables["script"].Value;
var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();
var pid = device.Spawn("com.android.settings");
var session = device.Attach(pid);

var script = session.CreateScript(source, "myScript");
script.Message += (o, e) => project.SendInfoToLog(e.Message);
script.Load();

device.Resume(pid);

Содержимое переменной script (выводит сообщение в лог):

console.log('hello!')

Spawn​

  • uint Spawn(string packageName)
    Запускает приложение в приостановленном состоянии (до выполнения Resume).

    Параметры:

    • packageName — имя пакета приложения.

    Возвращает:
    pid созданного процесса.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var pid = device.Spawn("com.android.settings"); // Запустить приложение приостановленным
var session = device.Attach(pid);

device.Resume(pid); // Продолжить выполнение

IFridaSessionAPI​

Представляет сессию подключения к процессу через Frida. Является промежуточным звеном между IFridaDeviceAPI (устройство) и IFridaScriptAPI (скрипты).

Pid​

  • uint Pid { get; }
    Идентификатор процесса, к которому подключена сессия.

    Возвращает:
    pid процесса.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));

project.SendInfoToLog(session.Pid.ToString()); // PID процесса, к которому подключена сессия

CreateScript​

  • IFridaScriptAPI CreateScript(string source, string name)
    Создаёт Frida-скрипт с указанным именем.

    Параметры:

    • source — исходный код скрипта (JavaScript);
    • name — имя скрипта.

    Возвращает:
    Объект IFridaScriptAPI.

  • IFridaScriptAPI CreateScript(string source)
    Создаёт Frida-скрипт без явного указания имени.

    Параметры:

    • source — исходный код скрипта.

    Возвращает:
    Объект IFridaScriptAPI.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var source = project.Variables["script"].Value;

var named = session.CreateScript(source, "myScript"); // С именем - его закрывает DetachSessionByScriptName
var script = session.CreateScript(source); // Без имени

Detach​

  • void Detach()
    Отключается от процесса.

    Описание:
    Завершает текущую сессию Frida и освобождает ресурсы.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));

session.Detach(); // Отключиться от процесса и освободить сессию

IFridaScriptAPI​

Представляет отдельный Frida-скрипт. Управляет жизненным циклом скрипта и обменом сообщениями между C# кодом и внедрённым JavaScript.

Name​

  • string Name { get; }
    Имя скрипта.

    Возвращает:
    Строковое имя, идентифицирующее скрипт.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");

project.SendInfoToLog(script.Name); // myScript

Eternalize​

  • void Eternalize()
    Делает скрипт «постоянным».

    Описание:
    Скрипт продолжает работать даже после завершения сессии или отключения клиента.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");

script.Load();
script.Eternalize(); // Скрипт продолжит работать и после закрытия сессии
session.Detach();

Load​

  • void Load()
    Загружает и запускает скрипт в процессе.

    Описание:
    После вызова скрипт начинает выполняться.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");

script.Message += (o, e) => project.SendInfoToLog(e.Message); // Подписаться нужно до Load
script.Load(); // Запустить скрипт в процессе

Message​

  • EventHandler<FridaScriptMessageEventArgs> Message
    Событие: сообщение от скрипта.

    Описание:
    Сообщения от скрипта (через send() или console.log()) обрабатываются в C# через это событие.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");

script.Message += (o, e) => project.SendInfoToLog(e.Message); // Скрипт вызвал send() или console.log()
script.Load(); // Подписка нужна до Load, иначе первые сообщения будут потеряны

Post​

  • void Post(string message)
    Отправляет сообщение в Frida-скрипт.

    Параметры:

    • message — строковое сообщение.

    Описание:
    Используется для передачи данных в JavaScript (обрабатывается через recv()).

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");
script.Load();

script.Post("{\"action\":\"ping\"}"); // В скрипте сообщение принимает recv()

PostWithData​

  • void PostWithData(string message, byte[] data)
    Отправляет сообщение с бинарными данными.

    Параметры:

    • message — строковое сообщение;
    • data — массив байтов.

    Описание:
    Позволяет передавать бинарные данные (например, файлы, буферы).

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");
script.Load();

var data = File.ReadAllBytes(project.Path + "payload.bin");
script.PostWithData("{\"action\":\"write\"}", data); // Сообщение вместе с бинарными данными

Unload​

  • void Unload()
    Выгружает скрипт.

    Описание:
    Останавливает выполнение и удаляет скрипт из процесса.

Пример.​

var device = instance.DroidInstance.FridaDevice;
device.InstallAndRunServer();

var session = device.Attach(device.Spawn("com.android.settings"));
var script = session.CreateScript(project.Variables["script"].Value, "myScript");

script.Load();
script.Unload(); // Остановить скрипт и убрать его из процесса