unidbg
zhkl0228/unidbgunidbg — эмулятор нативных библиотек Android (ARM32/ARM64) и экспериментальной поддержкой iOS. Поддерживает JNI, syscalls, inline-хуки, несколько бэкендов (unicorn, dynarmic, KVM). Встроенный MCP-сервер позволяет AI-инструментам (Cursor и др.) управлять отладкой: регистры, память, дизассемблирование, точки останова.
Подключение
git clone https://github.com/zhkl0228/unidbg.gitREADME
unidbg
Позволяет эмулировать нативные библиотеки Android, а также экспериментально поддерживает эмуляцию iOS.
Это учебный проект для изучения форматов файлов ELF/MachO и ассемблера ARM.
Используйте на свой страх и риск!
Возможности
- Поддержка MCP (Model Context Protocol) для AI-assisted отладки в Cursor и других AI-инструментах.
- Эмуляция JNI Invocation API с возможностью вызова
JNI_OnLoad. - Поддержка
JavaVM,JNIEnv. - Эмуляция инструкций syscall.
- Поддержка ARM32 и ARM64.
- Inline-хуки через Dobby.
- Android import hook через xHook.
- iOS-хуки: fishhook, substrate и whale.
- Бэкенд unicorn: консольный отладчик, gdb stub, трассировка инструкций, трассировка чтения/записи памяти.
- Поддержка iOS objc и swift runtime.
- Быстрый бэкенд dynarmic.
- Поддержка гипервизора Apple M1 — самый быстрый бэкенд для ARM64.
- Поддержка бэкенда Linux KVM на Raspberry Pi B4.
- Обнаружение утечек памяти в эмулируемом нативном коде с backtrace гостя и стектрейсом хоста.
MCP-отладчик (интеграция с AI)
unidbg поддерживает Model Context Protocol (MCP) для AI-assisted отладки. Когда отладчик активен, введите mcp в консоли, чтобы запустить MCP-сервер, к которому могут подключаться AI-инструменты (например, Cursor).
Быстрый старт
unidbg MCP работает в двух режимах:
Режим 1: Отладка по точкам останова — подключите отладчик и запустите код. При срабатывании точки останова Breaker.debug() приостанавливает эмулятор — введите mcp в консоли, чтобы запустить MCP-сервер и позволить AI помочь с анализом. Доступны все инструменты отладки (регистры, память, дизассемблирование, пошаговое выполнение, трассировка и др.). После возобновления, если сработает следующая точка останова, отладчик снова приостановится. Когда выполнение завершится без срабатывания точек останова, процесс завершится и MCP остановится.
Debugger debugger = emulator.attach();
debugger.addBreakPoint(address);
// запустите логику эмуляции — отладчик приостановится при срабатывании точки остановаРежим 2: Пользовательские инструменты (многократный запуск) — используйте McpToolkit для регистрации пользовательских инструментов и позвольте AI повторно запускать целевые функции с разными параметрами. Нативная библиотека загружается один раз; после каждого выполнения процесс остаётся активным, а MCP продолжает работу для следующего запуска.
McpToolkit toolkit = new McpToolkit();
toolkit.addTool(new McpTool() {
@Override public String name() { return "encrypt"; }
@Override public String description() { return "Run encryption"; }
@Override public String[] paramNames() { return new String[]{"input"}; }
@Override public void execute(String[] params) {
String input = params.length > 0 ? params[0] : "default";
// вызов шифрования с input
}
});
toolkit.run(emulator.attach());Когда отладчик остановится, введите mcp (или mcp 9239 для указания порта) в консоли. Затем добавьте в настройки MCP в Cursor:
{
"mcpServers": {
"unidbg-mcp-server": {
"url": "http://localhost:9239/sse"
}
}
}Доступные MCP-инструменты
Статус и информация
| Инструмент | Описание |
|---|---|
check_connection | Статус эмулятора: семейство, архитектура, возможности бэкенда, isRunning, загруженные модули |
list_modules / get_module_info | Список загруженных модулей, детальная информация включая количество экспортируемых символов и зависимости |
list_exports | Список экспортируемых/динамических символов модуля с опциональной фильтрацией и C++ demangling |
find_symbol | Поиск символа по имени или ближайшего символа по адресу |
get_threads | Список всех потоков/задач в эмуляторе |
Регистры и дизассемблирование
| Инструмент | Описание |
|---|---|
get_registers / get_register / set_register | Чтение/запись регистров CPU |
disassemble | Дизассемблирование инструкций по адресу (цели переходов автоматически аннотируются именами символов) |
assemble | Сборка текста инструкции в машинный код |
get_callstack | Получение текущего стека вызовов (backtrace) |
Память
| Инструмент | Описание |
|---|---|
read_memory / write_memory | Чтение/запись сырых байт памяти |
read_string / read_std_string | Чтение C-строки или C++ std::string (с определением SSO) |
read_pointer | Чтение цепочки указателей с разрешением символов |
read_typed | Чтение памяти как типизированных значений (int8–int64, float, double, pointer) |
search_memory | Поиск байтовых паттернов в памяти с фильтрами по области/правам доступа |
list_memory_map | Список всех маппингов памяти с правами доступа |
allocate_memory / free_memory / list_allocations | Выделение памяти (malloc/mmap) с опциональными начальными данными, освобождение и отслеживание блоков |
patch | Запись собранных инструкций в память |
Точки останова и выполнение
| Инструмент | Описание |
|---|---|
add_breakpoint / add_breakpoint_by_symbol / add_breakpoint_by_offset | Добавление точек останова по адресу, символу или смещению в модуле |
remove_breakpoint / list_breakpoints | Удаление или список точек останова (с дизассемблированием) |
continue_execution | Возобновление выполнения. Используйте poll_events для ожидания breakpoint_hit или execution_completed |
step_over / step_into / step_out | Шаг с обходом, шаг с заходом (N инструкций) или выход из функции |
next_block | Остановка на следующем базовом блоке (только Unicorn) |
step_until_mnemonic | Остановка на следующей инструкции с указанным мнемоником, например bl, ret (только Unicorn) |
poll_events | Опрос событий: breakpoint_hit, execution_completed, события трассировки |
Трассировка
| Инструмент | Описание |
|---|---|
trace_code | Трассировка инструкций со значениями чтения/записи регистров (regs_read, prev_write) |
trace_read / trace_write | Трассировка чтения/записи памяти в диапазоне адресов |
Вызов функций
| Инструмент | Описание |
|---|---|
call_function | Вызов нативной функции по адресу с типизированными аргументами (hex, string, bytes, null). Возвращает значение с разрешением символа |