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(); // Остановить скрипт и убрать его из процесса