Claude Info
Dev-инструменты

unidbg

zhkl0228/unidbg

unidbg — эмулятор нативных библиотек Android (ARM32/ARM64) и экспериментальной поддержкой iOS. Поддерживает JNI, syscalls, inline-хуки, несколько бэкендов (unicorn, dynarmic, KVM). Встроенный MCP-сервер позволяет AI-инструментам (Cursor и др.) управлять отладкой: регистры, память, дизассемблирование, точки останова.

Подключение

terminal
bash
git clone https://github.com/zhkl0228/unidbg.git

README

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 остановится.

java
Debugger debugger = emulator.attach();
debugger.addBreakPoint(address);
// запустите логику эмуляции — отладчик приостановится при срабатывании точки останова

Режим 2: Пользовательские инструменты (многократный запуск) — используйте McpToolkit для регистрации пользовательских инструментов и позвольте AI повторно запускать целевые функции с разными параметрами. Нативная библиотека загружается один раз; после каждого выполнения процесс остаётся активным, а MCP продолжает работу для следующего запуска.

java
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:

json
{
  "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). Возвращает значение с разрешением символа

Похожие MCP-серверы