Reverse engineering с агентами: анализ приложений и бинарников
Обзор техник reverse engineering с агентами — от анализа приложений до бинарных файлов. Практические шаги для системного инженера.
Анализ поведения приложений
Анализ поведения приложений
Инференс из логических паттернов
Когда мы сталкиваемся с непонятным бинарным файлом, первый шаг — найти логические паттерны, которые позволяют предсказать его поведение. В практике reverse engineering это часто означает проанализировать последовательность вызовов функций, выводы из логов и поведение в runtime. Например, если приложение регулярно вызывает функции read_file, parse_json и write_log, можно предположить, что оно работает с конфигурационными файлами и ведёт логи.
Практический подход:
-
Сбор логических меток — ищите в коде функции с понятными именами, которые отражают их роль. Вместо
func_123ищитеload_config,process_request,handle_error. -
Анализ вызовов через динамическое профилирование — используйте инструменты вроде
gdbилиperfдля отслеживания потока выполнения без полной запуска в пользовательском пространстве. -
Сравнение с реальным поведением — соберите логи приложения в рабочей среде и сопоставьте с ожидаемыми паттернами.
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-запросов можно:
- Запустить приложение в изолированном контейнере (Docker)
- Наблюдать логи через
docker logs - Извлекать вызовы функций через
straceилиsyscall - Сравнить поведение в разных условиях (пустые аргументы, ошибки, данные)
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. Практические шаги для системного инженера
- Идентификация целевого бинарника — определите точку входа и основные функции.
- Изоляция среды — используйте chroot или контейнеры для безопасного анализа.
- Сбор статической информации —
readelf,objdump,nmдля получения структуры. - Динамический анализ — запуск бинарника под нагрузкой с помощью
straceилиltraceв связке с агентом. - Интерпретация результатов — сопоставление вызовов с логикой приложения.
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-code | AI-агент для анализа кода и бинарников | 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:
bashstrings /opt/myapp/binary | grep -i "api\|protocol\|version" | head -20
Практические советы по работе с агентами:
- Определите контекст заранее — перед отправкой бинарника агенту указывайте версию, тип приложения и цели анализа.
- Используйте промпты с ограничениями — ограничивайте длину ответа и запрещайте выдачу персональных данных.
- Валидируйте результаты — всегда проверяйте выводы LLM через соответствующие CLI-инструменты.
- Сохраняйте промпты — для повторного использования контекста в разных задачах.
Связанные практические работы реальных инженеров можно найти в статьях Навыки реальных инженеров: практические практики из .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
Практический пример использования
Допустим, нам нужно проанализировать приложение, зашифрованное стеганографически. Процесс выглядит так:
- Извлечение данных через
binwalkиstrings:
bashbinwalk -D /opt/myapp/binary | grep -i "encrypted"
strings /opt/myapp/binary | grep -i "encrypted\|key\|password"
- Передача результата агенту:
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
- Запрос агента:
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"]
}'
- Обработка ответа агента и верификация через 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-агентов в контекст разработки и тестирования, что может быть полезно при автоматизации рутинных задач в пайплайнах анализа бинарников.