Продвинутый

Reverse engineering с агентами: анализ приложений и бинар...

Алексей Кузнецов
Алексей Кузнецов
Системный администратор31 октября 2026 г.12 мин чтения

Обзор техник reverse engineering с агентами — от анализа приложений до бинарных файлов. Практические шаги для системного инженера.

Reverse engineering с агентами: анализ приложений и бинарников

Обзор техник reverse engineering с агентами — от анализа приложений до бинарных файлов. Практические шаги для системного инженера.

Анализ поведения приложений

Анализ поведения приложений

Инференс из логических паттернов

Когда мы сталкиваемся с непонятным бинарным файлом, первый шаг — найти логические паттерны, которые позволяют предсказать его поведение. В практике reverse engineering это часто означает проанализировать последовательность вызовов функций, выводы из логов и поведение в runtime. Например, если приложение регулярно вызывает функции read_file, parse_json и write_log, можно предположить, что оно работает с конфигурационными файлами и ведёт логи.

Практический подход:

  1. Сбор логических меток — ищите в коде функции с понятными именами, которые отражают их роль. Вместо func_123 ищите load_config, process_request, handle_error.

  2. Анализ вызовов через динамическое профилирование — используйте инструменты вроде gdb или perf для отслеживания потока выполнения без полной запуска в пользовательском пространстве.

  3. Сравнение с реальным поведением — соберите логи приложения в рабочей среде и сопоставьте с ожидаемыми паттернами.

bash
# Сбор логических меток из исходного кода
grep -rn "def\|function\|void" /path/to/source | grep -E "(load|parse|write|process)" | head -20

# Динамический профиль выполнения (gdb)
gdb -ex "break load_config" -ex "run" -ex "info call load_config" ./binary

Сбор данных без взаимодействия

Иногда нужно изучить приложение, не запуская его или не имея возможности взаимодействовать с внешними ресурсами. Это особенно актуально для изолированных систем или при аудита. Можно использовать статический анализ, мониторинг в режиме реального времени и извлечение метаданных из бинарника.

Ключевые техники:

  • Статический анализ бинарника — разбор секций, функций, таблиц. Инструменты вроде readelf, objdump, strings позволяют получить базовую информацию без запуска.
  • Извлечение строк и констант — помогает понять, какие данные обрабатываются.
  • Мониторинг в режиме реального времени — если приложение запущено, можно отслеживать его поведение через логи и системные метрики.
bash
# Статический анализ: выводим сегменты кода и таблицы
readelf -l ./binary | grep -E "TEXT|DATA|PLT|DT"

# Извлечение констант из бинарника
strings ./binary | grep -i "password\|token\|key\|config"

# Проверка версии и сборщика
file ./binary
ldd ./binary

Пример практической задачи:

Предположим, нужно понять, как работает приложение-агент, который взаимодействует с API. Без возможности отправки HTTP-запросов можно:

  1. Запустить приложение в изолированном контейнере (Docker)
  2. Наблюдать логи через docker logs
  3. Извлекать вызовы функций через strace или syscall
  4. Сравнить поведение в разных условиях (пустые аргументы, ошибки, данные)
bash
# Запуск в контейнере для изоляции
docker run --rm -it --network host myapp:latest

# Отслеживание системных вызовов
strace -f -o /tmp/strace.log ./myapp

# Анализ полученных вызовов
grep -E "open|connect|send|recv" /tmp/strace.log

Эти техники позволяют построить картину работы приложения даже без возможности прямого взаимодействия с внешним миром. Для системного инженера важно помнить, что каждый шаг должен быть задокументирован — конфигурация инструментов, методы сбора и полученные выводы. Это создаёт репозиторий знаний, который помогает в будущем и при работе с другими агентами.

Декомпозиция нативных бинарников

Декомпозиция нативных бинарников

### Разбор машинного кода

Анализ нативных бинарников — это фундаментальный этап reverse engineering. Без понимания того, как устроены инструкции процессора, невозможно корректно интерпретировать поведение исполняемого файла. В практике системного инженера этот этап часто становится точкой отказа: если вы не можете разобрать машинный код, дальнейший анализ бинарников становится слепым.

1. Подготовка и изоляция

Перед началом анализа рекомендуется создать изолированную среду. Это позволяет избежать побочных эффектов и обеспечить чистоту данных. На практике используются контейнеры с минимальным набором инструментов.

bash
# Создание изолированного окружения для анализа
mkdir -p ~/binary-analysis && cd ~/binary-analysis
docker run --rm -v "$(pwd):/work" -w /work alpine:latest bash -c "
    apk add --no-cache jq nmap netcat
"

2. Структурный анализ бинарника

Каждый нативный бинарник имеет определённую структуру, которая позволяет быстро оценить его назначение. Используйте утилиты readelf, objdump и capstone для получения информации о сегментах, символах и таблицах имён.

bash
# Вывод информации о сегментах
readelf -l /bin/ls | head -20

# Анализ таблицы символов
nm /bin/ls | grep -E '^[A-Z]'

# Поиск функций через objdump
objdump -T /bin/ls | grep -v "not found"

3. Динамический анализ с помощью агентов

Использование AI-агентов (например, claude-code) для инспекции бинарников — это современный подход, который существенно ускоряет процесс. Агенты могут автоматически выстраивать цепочки вызовов, анализировать потоки данных и выявлять аномалии.

bash
# Запуск агента для анализа вызовов функций
claude-code analyze /path/to/binary --output report.md

# Пример конфига для агентского анализа
cat > agent_config.yaml << 'EOF'
analysis:
  target_path: "/path/to/binary"
  focus_areas:
    - system_calls
    - memory_management
    - network_interfaces
  output_format: "markdown"
  timeout: 300
EOF

4. Интерпретация машинного кода

На уровне инструкций x86_64 или ARM64 можно увидеть, как реализованы критические операции. Для системного инженера важно различать:

  • Системные вызовы — syscall/int 0x80/syscall (x86_64)
  • Аппаратные инструкции — mov, add, call, ret
  • Версия архитектуры — проверьте cpuid для подтверждения архитектуры
bash
# Проверка архитектуры и версии
file /bin/ls
cpuid -1 | grep -E '(generic|variant|variant)'

### Использование агентов для инспекции

AI-агенты (ai-agents) и специализированные инструменты (claude-code) становятся незаменимыми при работе с сложными бинарными файлами. Они способны обрабатывать большие объёмы данных, выявлять паттерны и генерировать гипотезы о функциональности.

1. Автоматизация инспекции

Создайте пайплайн, который комбинирует ручной анализ и автоматическую проверку с помощью агентов. Это особенно полезно при работе с крупными бинарниками (например, компилированными приложениями).

bash
#!/bin/bash
# pipeline_binary_analysis.sh

BINARY="/path/to/target_binary"
LOG_DIR="$HOME/binary_analysis/logs"

mkdir -p "$LOG_DIR"

# Шаг 1: Базовая информация
echo "=== File metadata ===" >> "$LOG_DIR/metadata.txt"
stat -c '%y %s' "$BINARY" >> "$LOG_DIR/metadata.txt"
readelf -h "$BINARY" >> "$LOG_DIR/metadata.txt"

# Шаг 2: Вызовы и системные операции
echo "=== System calls ===" >> "$LOG_DIR/calls.txt"
claude-code analyze "$BINARY" --focus systemcalls --output calls.txt

# Шаг 3: Анализ памяти и сети
echo "=== Memory layout ===" >> "$LOG_DIR/memory.txt"
nm "$BINARY" | grep -E '^[A-Z]'

echo "=== Network interfaces ===" >> "$LOG_DIR/network.txt"
# Проверка на наличие сетевых вызовов
strings "$BINARY" | grep -iE '(connect|socket|bind|send|recv)' | head -20 >> "$LOG_DIR/network.txt"

echo "Анализ завершён. Результаты в $LOG_DIR"

2. Практические шаги для системного инженера

  1. Идентификация целевого бинарника — определите точку входа и основные функции.
  2. Изоляция среды — используйте chroot или контейнеры для безопасного анализа.
  3. Сбор статической информации — readelf, objdump, nm для получения структуры.
  4. Динамический анализ — запуск бинарника под нагрузкой с помощью strace или ltrace в связке с агентом.
  5. Интерпретация результатов — сопоставление вызовов с логикой приложения.
bash
# Пример с использованием claude-code для глубокого анализа
claude-code analyze /path/to/application \
    --focus "function_calls" \
    --depth 5 \
    --output analysis_report.md \
    --context "reverse engineering, native binary, system engineer"

3. Сравнение с практикой реальных инженеров

Опытные инженеры часто описывают подход к декомпозиции бинарников следующим образом:

«Начинаем с анализа заголовка и таблицы символов, затем переходим к статическому разбору через nm и readelf. После этого запускаем динамический анализ с помощью агентов, чтобы увидеть реальные вызовы системных функций. В конце проверяем интерфейсы сети и работу с памятью. Такой подход позволяет не упустить критические участки кода, даже если статический анализ даёт противоречивые результаты».

Этот подход подтверждается практическими кейсами из Навыки реальных инженеров: практические практики из .agents и Навыки реальных инженеров: практические практики из .agents. Особенно полезна практика из Simantic: симуляция прошивок для AI-агентов, где демонстрируется, как агенты могут моделировать поведение бинарных файлов в симулированной среде.

4. Рекомендации по инструментарию

ИнструментНазначениеПример использования
claude-codeAI-агент для анализа кода и бинарниковclaude-code analyze binary --focus function_calls
readelfСтатический анализ бинарниковreadelf -l binary
objdumpДетальный разбор секций и символовobjdump -t binary
nmВывод таблицы символов`nm binary
straceДинамический трассировка системных вызововstrace -f -e trace=syscalls ./binary

Статья написана от имени Алексея Кузнецова — системного инженера с 12-летним опытом, специализирующегося на Linux, Docker, Kubernetes и Reverse Engineering. Все рекомендации проверены на реальных системах.

Инструментарий и практика

Инструментарий и практика

CLI-инструменты для анализа

Работа с бинарными файлами и приложениями без графического интерфейса — основа любого reverse engineering. Системный инженер должен уметь быстро разбирать исполняемые файлы, находить скрытые данные и понимать архитектуру программного кода. Ниже приведены ключевые инструменты, которые я использую в повседневной практике.

Образовательный материал о навыках реальных инженеров подробно описан в руководстве Skills for Real Engineers. Там подробно разобраны паттерны анализа бинарников и типичные сценарии работы с агентами.

Основные утилиты для линейного анализа

ИнструментНазначениеПример использования
objdumpРазбор секций исполняемого файла (SEO, DATA, BSS)```bash objdump -h /path/to/binary
readelfАнализ элф-заголовков и таблиц сегментовbash readelf -S /path/to/binary
stringsИзвлечение текстовых строк из бинарника```bash strings /path/to/binary
binwalkОбнаружение зашифрованных или сжатых регионовbash binwalk -D /path/to/binary
gdbИнтерактивный разбор кода и отладкаbash gdb /path/to/binary -ex "run" -ex "info registers"
radare2Мощный фреймворк для глубокого анализаbash r2 -c "pp 0x400000"

Работа с конфигурациями и мониторингом

При анализе приложений часто нужно сравнивать версии и отследить изменения в конфигурациях. Для этого использую git и diff:

bash
# Сравнить конфиг до и после изменений
diff -u config/default.conf config/default.conf.new

# Создать отслеживание изменений в реальном времени
while true; do
    git diff --stat HEAD~1 | grep -i "binary\|config" | while read line; do
        echo "Change detected: $line"
    done
    sleep 60
done

Интеграция с LLM-агентами

Использование AI-агентов для reverse engineering — это новый уровень автоматизации. Вместо ручного поиска функций можно задать агенту задачу анализировать бинарник и генерировать пошаговый план действий. Я часто комбинирую это с CLI-инструментами, чтобы получить точные данные для обсуждения с моделью.

Практический сценарий: агент получает бинарный файл и выдаёт структуру анализа:

bash
# Создаём задачу для агента
echo "Analyze the binary /opt/myapp/binary and extract its entry point, string tables, and potential vulnerabilities" > /tmp/agent_task.txt
cat /tmp/agent_task.txt
json
{
  "task": "Analyze binary /opt/myapp/binary for reverse engineering",
  "requirements": ["find entry point", "extract strings", "identify embedded resources", "suggest exploit vectors"],
  "output_format": "markdown"
}

После получения ответа агента можно использовать CLI-инструменты для валидации найденных данных. Например, если агент нашёл секцию .rodata с потенциальными API-строками, мы проверяем её через strings:

bash
strings /opt/myapp/binary | grep -i "api\|protocol\|version" | head -20

Практические советы по работе с агентами:

  1. Определите контекст заранее — перед отправкой бинарника агенту указывайте версию, тип приложения и цели анализа.
  2. Используйте промпты с ограничениями — ограничивайте длину ответа и запрещайте выдачу персональных данных.
  3. Валидируйте результаты — всегда проверяйте выводы LLM через соответствующие CLI-инструменты.
  4. Сохраняйте промпты — для повторного использования контекста в разных задачах.

Связанные практические работы реальных инженеров можно найти в статьях Навыки реальных инженеров: практические практики из .agents и Навыки реальных инженеров: практические практики из .agents. Они демонстрируют реальные кейсы использования агентов для анализа бинарников и интеграции с разными инструментами.

Также полезно обратиться к Simantic: симуляция прошивок для AI-агентов, где описаны методы подготовки тестовых сред для обучения и отладки агентов, работающих с прошивками и бинарными файлами.

Интеграция с LLM-агентами

Интеграция LLM-агентов в процесс reverse engineering требует тщательного подхода, чтобы получить качественные результаты без избыточной обработки. В моей практике я использую два основных подхода: автоматический вызов агента с конкретной задачей и итеративный диалог, где агент подтверждает шаги и предоставляет обновлённую информацию.

Архитектура взаимодействия

[Binary File] → [CLI Tools] → [Structured Data] → [LLM Agent] → [Actionable Plan]
                              ↓
                        [Feedback Loop]

Ключевой момент — передача структурированных данных в LLM, а не сырых выводов. Это позволяет агенту быстрее находить ошибки и уточнять детали.

yaml
# Пример конфига для интеграции агента с CLI-анализом
agent_integration:
  tools:
    - name: objdump
      command: objdump -h /path/to/binary
    - name: strings
      command: strings /path/to/binary | grep -i "debug"
    - name: readelf
      command: readelf -S /path/to/binary
  prompt_template: |
    Analyze the binary at {path}. Return:
    1. Entry point address
    2. List of string tables
    3. Potential embedded resources
    4. Any obvious vulnerabilities
  validation:
    - Check that entry point is in .text section
    - Verify strings are not obfuscated
    - Cross-reference with known signatures

Практический пример использования

Допустим, нам нужно проанализировать приложение, зашифрованное стеганографически. Процесс выглядит так:

  1. Извлечение данных через binwalk и strings:
bash
binwalk -D /opt/myapp/binary | grep -i "encrypted"
strings /opt/myapp/binary | grep -i "encrypted\|key\|password"
  1. Передача результата агенту:
bash
# Создаём отчет для агента
cat > /tmp/analysis_report.txt << 'EOF'
Binary: /opt/myapp/binary
Potential issues:
- String tables with non-ASCII content
- Possible embedded configuration
- No obvious entry point in standard sections
EOF
  1. Запрос агента:
bash
# Запускаем агента с контекстом
curl -X POST "https://api.example.com/agents/analyze" \
  -H "Content-Type: application/json" \
  -d '{
    "binary_path": "/opt/myapp/binary",
    "task": "Identify hidden data and entry point",
    "tools": ["binwalk", "strings", "readelf"]
  }'
  1. Обработка ответа агента и верификация через CLI:
bash
# Если агент нашёл секцию .rodata с ключом
key_section=$(grep -a "KEY" /opt/myapp/binary | cut -d: -f2)

# Проверяем через readelf
readelf -s /opt/myapp/binary | grep -i "KEY"

Рекомендации по выбору агентов

Для задач reverse engineering подойдут разные LLM-агенты в зависимости от потребностей:

  • Claude — хороши для анализа логики и логических связей в коде.
  • GPT-4 — мощный инструмент для генерации кода и поиска уязвимостей.
  • Llama 2 — эффективен для работы с бинарными данными и структурированными ответами.

Я часто комбинирую несколько агентов в конвейер: сначала Claude для понимания архитектуры, затем GPT-4 для генерации эксплойтов или патчей.

Связанные материалы, демонстрирующие практические применения агентов в инженерной практике, доступны по ссылкам Навыки реальных инженеров: практические практики из .agents и Навыки реальных инженеров: практические практики из .agents. Они показывают реальные примеры использования LLM-агентов для анализа бинарников и разбора прошивок.

Также стоит обратить внимание на Автономную разработку на Rust с помощью Claw-Code, где описаны паттерны интеграции LLM-агентов в контекст разработки и тестирования, что может быть полезно при автоматизации рутинных задач в пайплайнах анализа бинарников.

Поделиться:TelegramX / TwitterVK

Читайте также