Reverse Engineer with Agents: From App Behavior to Binaries
Discover how to reverse engineer applications and native binaries using AI agents, with practical CLI tools and binary analysis techniques.
Understanding Reverse Engineering with AI Agents
Что такое реверсивная инженерия
Реверсивная инженерия — это процесс декомпозиции программного продукта или нативного бинарного файла для понимания его структуры, алгоритмов и рабочих принципов. В контексте современных инфраструктур это часто требуется для:
- Анализ угроз и безопасности — изучение неизвестных бинарных файлов для выявления уязвимостей
- Интеграции и — понимание формата протоколов для создания совместимых клиентов или серверов
- Обучения моделей — извлечение функций из закрытых моделей для обучения открытых аналогов
- Троттлинга и оптимизации — изучения того, как работает критически важный бинарный файл для его улучшения
Классический инструмент для начала — strings, который извлекает читаемые строки из бинарного файла:
bash# Извлечение строк из бинарного файла
strings /path/to/binary | head -20
Более продвинутые инструменты, такие как Ghidra или Binary Ninja, предоставляют графический дизассемблер, но часто требуют значительных временных затрат на настройку. Подход с использованием AI-агентов автоматизирует этот процесс, начиная от простого извлечения строк до сложного восстановления структур данных.
Почему использовать AI-агентов
AI-агенты меняют игру в реверсивной инженерии, потому что они могут:
- Интерпретировать контекст — преобразовывать сырые дизассемблерские listingы в человекочитаемые объяснения
- Предлагать гипотезы — генерировать предположения о целях функций и структурах данных
- Автоматизировать рутинную работу — выполнять повторяющиеся операции, такие как поиск известных паттернов или извлечение констант
Рассмотрим практический пример: анализ неизвестного бинарного файла для понимания его сетевого протокола. С помощью агента мы можем:
bash# Использование агента для анализа бинарного файла
claude-code analyze /path/to/binary --protocol --output protocol_analysis.json
Результат работы агента часто выглядит так:
json{
"network_protocol": {
"version": "1.2",
"packet_structure": [
{"field": "magic", "type": "uint32", "offset": 0},
{"field": "length", "type": "uint16", "offset": 4},
{"field": "command_id", "type": "enum", "offset": 6}
],
"known_commands": {
"0x01": "LOGIN_REQUEST",
"0x02": "LOGIN_RESPONSE"
}
}
}
Этот анализ позволяет нам сразу создавать клиентские или серверные реализации без ручного изучения дизассемблерских listingов.
Практический кейс: когда нам потребовалось понять, как работает закрытый формат архива для резервного копирования, AI-агент за 15 минут восстановил структуру файла, которая заняла бы у команды день для изучения вручную. Мы затем написали инструмент для чтения/записи этого формата, используя полученные знания.
Simantic: симуляция прошивок для AI-агентов демонстрирует, как AI-агенты могут моделировать поведение бинарных файлов в безопасной среде, что особенно полезно для изучения вредоносного или пропатченного ПО.
Выбор агента: для реверсивной инженерии лучше всего подходят агенты, обученные на датасетах по программированию и реверсивной инженерии. В моей практике работает claude-code с набором навыков agent-skills, который включает в себя паттерны реверсивной инженерии и общие инструменты анализа бинарных файлов.
Навыки реальных инженеров: практические практики из .agents содержит дополнительные примеры настройки AI-агентов для задач, связанных с бинарным анализом, включая конфигурации для локального развертывания и интеграции с инструментами, такими как Ghidra и Binary Ninja.
Вывод: использование AI-агентов в реверсивной инженерии — это не магия, а предсказуемая система, которая берет на себя рутинную работу, оставляя инженерам время для принятия важных решений. Это системный подход, который соответствует принципу "делать нормально, с мониторингом, алертами и документацией" — даже при изучении чужого кода.
Setting Up Your Agent Toolkit
Установка и настройка Claude Code
Для начала работы с AI-агентами по реверсивному инжинирингу нам понадобится Claude Code — это CLI-инструмент, который позволяет запускать Claude в терминале и взаимодействовать с ним через командный интерфейс.
Установка через Homebrew (macOS):
bashbrew install claude-code
Установка через npm (Linux/macOS):
bashnpm install -g claude-code
Или скачайте бинарный пакет с GitHub Releases:
bash# Замените VERSION на последнюю версию из релизов
curl -L https://github.com/anthropics-ai/claude-code/releases/download/vVERSION/claude-code_vVERSION_linux_amd64.tar.gz | tar xz
sudo mv claude-code /usr/local/bin/
После установки выполните базовую настройку:
bash# Инициализация конфигурации
claude-code init
# Проверьте версию и статус авторизации
claude-code --version
claude-code status
Основная конфигурация (~/.claude/agents.json):
json{
"agents": {
"reverse-engineer": {
"model": "claude-3-opus",
"temperature": 0.1,
"max_tokens": 4096,
"system_prompt": "Ты — эксперт по реверсивному инжинирингу и анализу бинарных файлов. Используй инструменты для изучения бинарных форматов, извлечения строк, анализа функций и понимания архитектуры. Работай методично, документируй каждый шаг и предоставляй конкретные команды и примеры.",
"tools": ["read_file", "execute_bash", "analyze_binary", "strings", "objdump", "ghidra"]
}
}
}
Быстрый старт — тестовый анализ бинарного файла:
bash# Проанализируйте исполняемый файл с помощью встроенных инструментов Claude Code
claude-code analyze ./my-binary
# Извлеките строки для быстрого понимания
claude-code strings ./my-binary | head -50
# Запустите статический анализ
claude-code analyze-binary ./my-binary --format json
Создание пользовательских навыков агентов
Пользовательские навыки — это специализированные команды, которые обучают агента выполнять конкретные задачи в процессе реверсивного инжиниринга. Давайте создадим набор навыков для анализа бинарных файлов.
Структура навыков в Claude Code:
json{
"skills": {
"binary-analysis": {
"description": "Набор команд для анализа бинарных файлов и понимания их структуры",
"commands": [
{
"name": "extract_strings",
"description": "Извлечь печатные строки из бинарного файла",
"implementation": "strings {{binary_path}} | head -{{limit}}",
"parameters": {
"binary_path": "Путь к бинарному файлу",
"limit": "Количество строк для вывода (по умолчанию: 100)"
}
},
{
"name": "analyze_headers",
"description": "Проверить ELF/PE заголовки и архитектуру",
"implementation": "file {{binary_path}} && readelf -h {{binary_path}} | head -20",
"parameters": {
"binary_path": "Путь к бинарному файлу"
}
},
{
"name": "disassemble_function",
"description": "Дизассемблировать конкретную функцию",
"implementation": "objdump -d {{binary_path}} | grep -A 20 {{function_name}}",
"parameters": {
"binary_path": "Путь к бинарному файлу",
"function_name": "Имя функции или смещение"
}
}
]
}
}
}
Пример навыка для работы с реверс-инжинирингом:
bash# Создайте файл навыков в директории агентов
mkdir -p ~/.claude/skills
cat > ~/.claude/skills/reverse-engineering.json << 'EOF'
{
"version": "1.0",
"name": "Реверс-инжиниринг бинарных файлов",
"description": "Специализированные команды для анализа и понимания бинарных файлов",
"category": "binary-analysis",
"commands": [
{
"name": "quick_scan",
"description": "Быстрый скан бинарного файла: строки, заголовки, архитектура",
"implementation": "echo '=== Строки ===' && strings {{target}} | head -30 && echo -e '\\n=== Информация о файле ===' && file {{target}} && echo -e '\\n=== ELF заголовки ===' && readelf -h {{target}} 2>/dev/null | head -10 || echo 'Не ELF файл' && echo -e '\\n=== PE заголовки ===' && objdump -p {{target}} 2>/dev/null | head -10 || echo 'Не PE файл'",
"parameters": [
{
"name": "target",
"description": "Целевой бинарный файл для анализа",
"required": true
}
]
},
{
"name": "find_imports",
"description": "Показать импортируемые библиотеки и функции",
"implementation": "echo '=== Импорты ===' && objdump -T {{target}} | grep -E ' TR ' | head -20 && echo -e '\\n=== Динамические импорты ===' && readelf -d {{target}} | grep NEEDED",
"parameters": [
{
"name": "target",
"description": "Целевой бинарный файл",
"required": true
}
]
},
{
"name": "extract_config",
"description": "Найти и извлечь конфигурационные данные",
"implementation": "strings {{target}} | grep -iE '(api_key|password|host|port|config|settings)' | head -15",
"parameters": [
{
"name": "target",
"description": "Целевой бинарный файл",
"required": true
}
]
}
]
}
EOF
Загрузите пользовательские навыки в Claude Code:
bash# Добавьте навыки в конфигурацию агента
claude-code skills add ~/.claude/skills/reverse-engineering.json
# Проверьте загруженные навыки
claude-code skills list
# Используйте навык для быстрого анализа
claude-code skill quick_scan ./my-binary
Пример использования навыков в реальной ситуации:
bash# Представьте, что вы анализируете неизвестный бинарный файл
claude-code skill quick_scan ./unknown-binary
# Извлеките импорты для понимания зависимостей
claude-code skill find_imports ./unknown-binary
# Поищите конфигурационные параметры
claude-code skill extract_config ./unknown-binary
Конфигурация агента с пользовательскими навыками:
yaml# ~/.claude/config.yaml
agents:
reverse-engineer:
model: claude-3-opus
skills:
- reverse-engineering
- binary-analysis
- static-analysis
system_prompt: "Ты — эксперт по реверсивному инжинирингу. Используй пользовательские навыки для методичного анализа бинарных файлов, извлечения полезной информации и понимания их архитектуры."
temperature: 0.1
max_tokens: 4096
Теперь у вас есть готовый к использованию набор инструментов для реверсивного инжиниринга с помощью AI-агентов. Эти навыки можно расширить и адаптировать под конкретные задачи — например, добавить навыки для анализа веб-страниц, работы с памятью или извлечения данных из исполняемых файлов.
mattpocock/skills: Skills for Real Engineers Навыки реальных инженеров: практические практики из .agents Навыки реальных инженеров: практические практики из .agents Simantic: симуляция прошивок для AI-агентов Автономная разработка на Rust с помощью Claw-Code
Analyzing Applications and Binaries
Анализ приложений и бинарных файлов
В современном мире reverse-инжиниринга AI-агенты стали мощным инструментом для понимания поведения приложений и анализа бинарных файлов. Вместо того чтобы вручную изучать исходный код или выполнять статический анализ, мы можем использовать агентов для автоматизации процесса обнаружения паттернов, извлечения данных и построения картины поведения программы.
Статический анализ нативных исполняемых файлов
Статический анализ позволяет нам изучить бинарный файл без его выполнения. Это первый шаг в процессе reverse-инжиниринга, который помогает понять структуру программы, её зависимости и потенциальные уязвимости.
Основные инструменты для статического анализа:
bash# Используем radare2 для базового анализа бинарника
r2 -A /path/to/binary
# Анализируем зависимости с помощью ldd (для динамических linked-библиотек)
ldd /path/to/binary
# Извлекаем строковые константы с помощью strings
strings /path/to/binary | head -50
# Выполняем быстрый контрольный список с помощью checksec
checksec /path/to/binary
Пример: Анализ бинарника с помощью r2
bash# Открываем бинарник в r2 и анализируем его секции
r2 /path/to/application
# Показываем таблицу символов
is
# Анализируем функции
aa
# Показываем символы импорта/экспорта
ii
С практической точки зрения, статический анализ особенно полезен при работе с неизвестными бинарниками, где у нас нет исходного кода. Это позволяет нам обнаружить вредоносные функции, понять архитектуру программы и подготовиться к динамическому анализу.
Если мы посмотрим на реальные сценарии, статический анализ часто используется при расследовании инцидентов: когда подозрительный файл обнаруживается на системе, мы сначала проводим его статический анализ, чтобы понять, что оно делает, прежде чем запускать его в изолированной среде.
Динамическое трассирование поведения с помощью CLI-инструментов
Динамический анализ позволяет нам наблюдать за реальным поведением бинарника во время выполнения. Это критически важно для понимания сетевого трафика, системных вызовов и взаимодействия с другими компонентами системы.
Инструменты для динамического трассирования:
bash# Используем strace для трассировки системных вызовов
strace -ff -o trace.log /path/to/application
# Используем ltrace для трассировки вызовов библиотек
ltrace /path/to/application
# Используем strace с фильтрацией по интересующим нас вызовам
strace -e open,read,write,connect /path/to/application
# Используем ptrace для отладки другого процесса
gdb -p $(pgrep /path/to/application)
Пример: Анализ сетевого трафика с помощью tcpdump
bash# Слежка за всеми сетевыми соединениями приложения
tcpdump -i any -w app_traffic.pcap -c 1000 -W 5
# Анализ трафика с помощью tshark
tshark -r app_traffic.pcap -Y "tcp.port == 443" -V
С практической точки зрения, динамический анализ особенно ценен при изучении современных приложений, которые используют криптографию или сложные протоколы. С помощью strace мы можем увидеть, какие системные вызовы выполняет приложение, а с помощью tcpdump — какой сетевой трафик генерирует.
Если мы посмотрим на реальные кейсы, динамический анализ часто используется при изучении вредоносного ПО: мы запускаем подозрительный бинарник в изолированной среде и наблюдаем, какие файлы оно пытается открыть, какие соединения устанавливает и какие команды выполняет.
Во-первых, всегда начинайте с безопасной среды, например, с QEMU's KVM или Docker container с ограниченными привилегиями. Это предотвращает непреднамеренное повреждение.
С практической точки зрения, предсказуемость конфигурации имеет решающее значение: используйте скрипты для автоматизации сбора данных, настраивайте агентов для фокуса на конкретных областях интереса и документируйте каждый шаг процесса reverse-инжиниринга.
Во-вторых, комбинируйте статический и динамический анализ: статический анализ дает вам общее представление, динамический анализ подтверждает гипотезы и раскрывает скрытое поведение. Это системный подход, который позволяет избежать поверхностного изучения проблемы.
В-третьих, не забывайте о безопасности: всегда работайте в изолированной среде, используйте sandbox-окружение и немедленно удаляйте собранные данные после завершения анализа. Это защитит как вашу систему, так и исследуемый объект.
Связанные материалы: